blob: 6af99ba5c690b30af4c4af571765349dee044768 [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,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000126 *read_str, *readline_str, *__main___str, *__basicnew___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++) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000199 Py_DECREF(*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;
211
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000213 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000214 goto nomemory;
215 if ((int)(size_t)bigger != bigger)
216 goto nomemory;
217 nbytes = (size_t)bigger * sizeof(PyObject *);
218 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
219 goto nomemory;
220 self->data = realloc(self->data, nbytes);
221 if (self->data == NULL)
222 goto nomemory;
223 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000224 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225
226 nomemory:
227 self->size = 0;
228 PyErr_NoMemory();
229 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000230}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000231
Tim Peterse0a39072003-02-03 15:45:56 +0000232/* D is a Pdata*. Pop the topmost element and store it into V, which
233 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000234 * is raised and V is set to NULL. D and V may be evaluated several times.
235 */
236#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000237 if ((D)->length) \
238 (V) = (D)->data[--((D)->length)]; \
239 else { \
240 PyErr_SetString(UnpicklingError, "bad pickle data"); \
241 (V) = NULL; \
242 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000243}
244
Tim Peterse0a39072003-02-03 15:45:56 +0000245/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
246 * D. If the Pdata stack can't be grown to hold the new value, both
247 * raise MemoryError and execute "return ER". The difference is in ownership
248 * of O after: _PUSH transfers ownership of O from the caller to the stack
249 * (no incref of O is done, and in case of error O is decrefed), while
250 * _APPEND pushes a new reference.
251 */
252
253/* Push O on stack D, giving ownership of O to the stack. */
254#define PDATA_PUSH(D, O, ER) { \
255 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
256 Pdata_grow((Pdata*)(D)) < 0) { \
257 Py_DECREF(O); \
258 return ER; \
259 } \
260 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
261}
262
263/* Push O on stack D, pushing a new reference. */
264#define PDATA_APPEND(D, O, ER) { \
265 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
266 Pdata_grow((Pdata*)(D)) < 0) \
267 return ER; \
268 Py_INCREF(O); \
269 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
270}
271
272
Guido van Rossum053b8df1998-11-25 16:18:00 +0000273static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000274Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000275{
276 PyObject *r;
277 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000278
Tim Peters1d63c9f2003-02-02 20:29:39 +0000279 l = self->length-start;
280 r = PyTuple_New(l);
281 if (r == NULL)
282 return NULL;
283 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000285
Tim Peters1d63c9f2003-02-02 20:29:39 +0000286 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000287 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000288}
289
290static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000291Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000292{
293 PyObject *r;
294 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000296 l=self->length-start;
297 if (!( r=PyList_New(l))) return NULL;
298 for (i=start, j=0 ; j < l; i++, j++)
299 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000301 self->length=start;
302 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000303}
304
Guido van Rossum053b8df1998-11-25 16:18:00 +0000305/*************************************************************************/
306
307#define ARG_TUP(self, o) { \
308 if (self->arg || (self->arg=PyTuple_New(1))) { \
309 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
310 PyTuple_SET_ITEM(self->arg,0,o); \
311 } \
312 else { \
313 Py_DECREF(o); \
314 } \
315}
316
317#define FREE_ARG_TUP(self) { \
318 if (self->arg->ob_refcnt > 1) { \
319 Py_DECREF(self->arg); \
320 self->arg=NULL; \
321 } \
322 }
323
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000324typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000325 PyObject_HEAD
326 FILE *fp;
327 PyObject *write;
328 PyObject *file;
329 PyObject *memo;
330 PyObject *arg;
331 PyObject *pers_func;
332 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000333
334 /* pickle protocol number, >= 0 */
335 int proto;
336
337 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000338 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000340 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000341 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000342 int (*write_func)(struct Picklerobject *, char *, int);
343 char *write_buf;
344 int buf_size;
345 PyObject *dispatch_table;
346 int fast_container; /* count nested container dumps */
347 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000348} Picklerobject;
349
Barry Warsaw52acb492001-12-21 20:04:22 +0000350#ifndef PY_CPICKLE_FAST_LIMIT
351#define PY_CPICKLE_FAST_LIMIT 50
352#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000353
Jeremy Hylton938ace62002-07-17 16:30:39 +0000354static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000355
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000356typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000357 PyObject_HEAD
358 FILE *fp;
359 PyObject *file;
360 PyObject *readline;
361 PyObject *read;
362 PyObject *memo;
363 PyObject *arg;
364 Pdata *stack;
365 PyObject *mark;
366 PyObject *pers_func;
367 PyObject *last_string;
368 int *marks;
369 int num_marks;
370 int marks_size;
371 int (*read_func)(struct Unpicklerobject *, char **, int);
372 int (*readline_func)(struct Unpicklerobject *, char **);
373 int buf_size;
374 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000375 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000376} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000377
Jeremy Hylton938ace62002-07-17 16:30:39 +0000378static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000379
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000380/* Forward decls that need the above structs */
381static int save(Picklerobject *, PyObject *, int);
382static int put2(Picklerobject *, PyObject *);
383
Guido van Rossumd385d591997-04-09 17:47:47 +0000384static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000385PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000386cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
387{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 va_list va;
389 PyObject *args=0, *retval=0;
390 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000392 if (format) args = Py_VaBuildValue(format, va);
393 va_end(va);
394 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000395 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000396 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000398 if (retval) {
399 if (args) {
400 PyObject *v;
401 v=PyString_Format(retval, args);
402 Py_DECREF(retval);
403 Py_DECREF(args);
404 if (! v) return NULL;
405 retval=v;
406 }
407 }
408 else
409 if (args) retval=args;
410 else {
411 PyErr_SetObject(ErrType,Py_None);
412 return NULL;
413 }
414 PyErr_SetObject(ErrType,retval);
415 Py_DECREF(retval);
416 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000417}
418
Tim Peters84e87f32001-03-17 04:50:51 +0000419static int
Tim Peterscba30e22003-02-01 06:24:36 +0000420write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000421{
422 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000424 if (s == NULL) {
425 return 0;
426 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000428 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000429 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000430 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000431 if (nbyteswritten != (size_t)n) {
432 PyErr_SetFromErrno(PyExc_IOError);
433 return -1;
434 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000437}
438
Tim Peters84e87f32001-03-17 04:50:51 +0000439static int
Tim Peterscba30e22003-02-01 06:24:36 +0000440write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000441{
442 if (s == NULL) {
443 return 0;
444 }
Tim Peterscba30e22003-02-01 06:24:36 +0000445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000446 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
447 return -1;
448 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000450 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000451}
452
Tim Peters84e87f32001-03-17 04:50:51 +0000453static int
Tim Peterscba30e22003-02-01 06:24:36 +0000454write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000455{
456 if (s == NULL) return 0;
457 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000458}
459
Tim Peters84e87f32001-03-17 04:50:51 +0000460static int
Tim Peterscba30e22003-02-01 06:24:36 +0000461write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462{
463 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000465 if (s == NULL) {
466 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000467 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000468 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000469 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000470 return -1;
471 }
472 else {
473 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
474 if (write_other(self, NULL, 0) < 0)
475 return -1;
476 }
Tim Peterscba30e22003-02-01 06:24:36 +0000477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000478 if (n > WRITE_BUF_SIZE) {
479 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000480 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 return -1;
482 }
483 else {
484 memcpy(self->write_buf + self->buf_size, s, n);
485 self->buf_size += n;
486 return n;
487 }
488 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000490 if (self->write) {
491 /* object with write method */
492 ARG_TUP(self, py_str);
493 if (self->arg) {
494 junk = PyObject_Call(self->write, self->arg, NULL);
495 FREE_ARG_TUP(self);
496 }
497 if (junk) Py_DECREF(junk);
498 else return -1;
499 }
500 else
501 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000503 self->buf_size = 0;
504 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505}
506
507
Tim Peters84e87f32001-03-17 04:50:51 +0000508static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000509read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510{
511 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000513 if (self->buf_size == 0) {
514 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000517 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000518 PyErr_NoMemory();
519 return -1;
520 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 self->buf_size = size;
523 }
524 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000525 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 if (!self->buf) {
527 PyErr_NoMemory();
528 return -1;
529 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530 self->buf_size = n;
531 }
Tim Peters84e87f32001-03-17 04:50:51 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 Py_BEGIN_ALLOW_THREADS
534 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
535 Py_END_ALLOW_THREADS
536 if (nbytesread != (size_t)n) {
537 if (feof(self->fp)) {
538 PyErr_SetNone(PyExc_EOFError);
539 return -1;
540 }
Tim Peterscba30e22003-02-01 06:24:36 +0000541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 PyErr_SetFromErrno(PyExc_IOError);
543 return -1;
544 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000548 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000549}
550
551
Tim Peters84e87f32001-03-17 04:50:51 +0000552static int
Tim Peterscba30e22003-02-01 06:24:36 +0000553readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554{
555 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000558 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 PyErr_NoMemory();
560 return -1;
561 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562 self->buf_size = 40;
563 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565 i = 0;
566 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000567 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000569 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 (self->buf[i] = getc(self->fp)) == '\n') {
571 self->buf[i + 1] = '\0';
572 *s = self->buf;
573 return i + 1;
574 }
575 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000576 bigger = self->buf_size << 1;
577 if (bigger <= 0) { /* overflow */
578 PyErr_NoMemory();
579 return -1;
580 }
581 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 if (!self->buf) {
583 PyErr_NoMemory();
584 return -1;
585 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000586 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000587 }
Tim Peters84e87f32001-03-17 04:50:51 +0000588}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000589
590
Tim Peters84e87f32001-03-17 04:50:51 +0000591static int
Tim Peterscba30e22003-02-01 06:24:36 +0000592read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593{
594 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
597 PyErr_SetNone(PyExc_EOFError);
598 return -1;
599 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000603 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000604}
605
606
Tim Peters84e87f32001-03-17 04:50:51 +0000607static int
Tim Peterscba30e22003-02-01 06:24:36 +0000608readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609{
610 int n;
611 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
614 return -1;
615 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000620}
621
622
Tim Peters84e87f32001-03-17 04:50:51 +0000623static int
Tim Peterscba30e22003-02-01 06:24:36 +0000624read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625{
626 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 ARG_TUP(self, bytes);
631 if (self->arg) {
632 str = PyObject_Call(self->read, self->arg, NULL);
633 FREE_ARG_TUP(self);
634 }
635 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 Py_XDECREF(self->last_string);
638 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640 if (! (*s = PyString_AsString(str))) return -1;
641 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642}
643
644
Tim Peters84e87f32001-03-17 04:50:51 +0000645static int
Tim Peterscba30e22003-02-01 06:24:36 +0000646readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647{
648 PyObject *str;
649 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
652 return -1;
653 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 if ((str_size = PyString_Size(str)) < 0)
656 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658 Py_XDECREF(self->last_string);
659 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000661 if (! (*s = PyString_AsString(str)))
662 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000664 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000665}
666
Tim Petersee1a53c2003-02-02 02:57:53 +0000667/* Copy the first n bytes from s into newly malloc'ed memory, plus a
668 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
669 * The caller is responsible for free()'ing the return value.
670 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000672pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000673{
Tim Petersee1a53c2003-02-02 02:57:53 +0000674 char *r = (char *)malloc(n+1);
675 if (r == NULL)
676 return (char*)PyErr_NoMemory();
677 memcpy(r, s, n);
678 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000679 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680}
681
682
683static int
Tim Peterscba30e22003-02-01 06:24:36 +0000684get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685{
686 PyObject *value, *mv;
687 long c_value;
688 char s[30];
689 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691 if (!( mv = PyDict_GetItem(self->memo, id))) {
692 PyErr_SetObject(PyExc_KeyError, id);
693 return -1;
694 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000695
Tim Peterscba30e22003-02-01 06:24:36 +0000696 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000697 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699 if (!( PyInt_Check(value))) {
700 PyErr_SetString(PicklingError, "no int where int expected in memo");
701 return -1;
702 }
703 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if (!self->bin) {
706 s[0] = GET;
707 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
708 len = strlen(s);
709 }
710 else if (Pdata_Check(self->file)) {
711 if (write_other(self, NULL, 0) < 0) return -1;
712 PDATA_APPEND(self->file, mv, -1);
713 return 0;
714 }
715 else {
716 if (c_value < 256) {
717 s[0] = BINGET;
718 s[1] = (int)(c_value & 0xff);
719 len = 2;
720 }
721 else {
722 s[0] = LONG_BINGET;
723 s[1] = (int)(c_value & 0xff);
724 s[2] = (int)((c_value >> 8) & 0xff);
725 s[3] = (int)((c_value >> 16) & 0xff);
726 s[4] = (int)((c_value >> 24) & 0xff);
727 len = 5;
728 }
729 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000730
Tim Peters0bc93f52003-02-02 18:29:33 +0000731 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000732 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000733
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000734 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000735}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000736
Guido van Rossum60456fd1997-04-09 17:36:32 +0000737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000738static int
Tim Peterscba30e22003-02-01 06:24:36 +0000739put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000740{
Tim Peterscba30e22003-02-01 06:24:36 +0000741 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000742 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000744 return put2(self, ob);
745}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000746
Guido van Rossum053b8df1998-11-25 16:18:00 +0000747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000748static int
Tim Peterscba30e22003-02-01 06:24:36 +0000749put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000750{
751 char c_str[30];
752 int p;
753 size_t len;
754 int res = -1;
755 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757 if (self->fast)
758 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000760 if ((p = PyDict_Size(self->memo)) < 0)
761 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000764 /* XXX Why?
765 * XXX And does "positive" really mean non-negative?
766 * XXX pickle.py starts with PUT index 0, not 1. This makes for
767 * XXX gratuitous differences between the pickling modules.
768 */
Tim Peterscba30e22003-02-01 06:24:36 +0000769 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000770
Tim Peterscba30e22003-02-01 06:24:36 +0000771 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000773
Tim Peterscba30e22003-02-01 06:24:36 +0000774 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000776
Tim Peterscba30e22003-02-01 06:24:36 +0000777 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000778 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000780 PyTuple_SET_ITEM(t, 0, memo_len);
781 Py_INCREF(memo_len);
782 PyTuple_SET_ITEM(t, 1, ob);
783 Py_INCREF(ob);
784
785 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
786 goto finally;
787
788 if (!self->bin) {
789 c_str[0] = PUT;
790 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
791 len = strlen(c_str);
792 }
793 else if (Pdata_Check(self->file)) {
794 if (write_other(self, NULL, 0) < 0) return -1;
795 PDATA_APPEND(self->file, memo_len, -1);
796 res=0; /* Job well done ;) */
797 goto finally;
798 }
799 else {
800 if (p >= 256) {
801 c_str[0] = LONG_BINPUT;
802 c_str[1] = (int)(p & 0xff);
803 c_str[2] = (int)((p >> 8) & 0xff);
804 c_str[3] = (int)((p >> 16) & 0xff);
805 c_str[4] = (int)((p >> 24) & 0xff);
806 len = 5;
807 }
808 else {
809 c_str[0] = BINPUT;
810 c_str[1] = p;
811 len = 2;
812 }
813 }
814
Tim Peters0bc93f52003-02-02 18:29:33 +0000815 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 goto finally;
817
818 res = 0;
819
820 finally:
821 Py_XDECREF(py_ob_id);
822 Py_XDECREF(memo_len);
823 Py_XDECREF(t);
824
825 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000826}
827
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000828static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000829whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830{
831 int i, j;
832 PyObject *module = 0, *modules_dict = 0,
833 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000835 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000836 if (module)
837 return module;
838 if (PyErr_ExceptionMatches(PyExc_AttributeError))
839 PyErr_Clear();
840 else
841 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000842
Tim Peterscba30e22003-02-01 06:24:36 +0000843 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 i = 0;
847 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 global_name_attr = PyObject_GetAttr(module, global_name);
852 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000853 if (PyErr_ExceptionMatches(PyExc_AttributeError))
854 PyErr_Clear();
855 else
856 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 continue;
858 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 if (global_name_attr != global) {
861 Py_DECREF(global_name_attr);
862 continue;
863 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 break;
868 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000870 /* The following implements the rule in pickle.py added in 1.5
871 that used __main__ if no module is found. I don't actually
872 like this rule. jlf
873 */
874 if (!j) {
875 j=1;
876 name=__main___str;
877 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000879 Py_INCREF(name);
880 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000881}
882
883
Guido van Rossum60456fd1997-04-09 17:36:32 +0000884static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000885fast_save_enter(Picklerobject *self, PyObject *obj)
886{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000887 /* if fast_container < 0, we're doing an error exit. */
888 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
889 PyObject *key = NULL;
890 if (self->fast_memo == NULL) {
891 self->fast_memo = PyDict_New();
892 if (self->fast_memo == NULL) {
893 self->fast_container = -1;
894 return 0;
895 }
896 }
897 key = PyLong_FromVoidPtr(obj);
898 if (key == NULL)
899 return 0;
900 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000901 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000902 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000903 "fast mode: can't pickle cyclic objects "
904 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000905 obj->ob_type->tp_name, obj);
906 self->fast_container = -1;
907 return 0;
908 }
909 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000910 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000911 self->fast_container = -1;
912 return 0;
913 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000914 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000915 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000917}
918
Tim Peterscba30e22003-02-01 06:24:36 +0000919int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000920fast_save_leave(Picklerobject *self, PyObject *obj)
921{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
923 PyObject *key = PyLong_FromVoidPtr(obj);
924 if (key == NULL)
925 return 0;
926 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000927 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928 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
935static int
Tim Peterscba30e22003-02-01 06:24:36 +0000936save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000937{
938 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000939 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000940 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000943}
944
Guido van Rossum77f6a652002-04-03 22:41:51 +0000945static int
Tim Peterscba30e22003-02-01 06:24:36 +0000946save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000947{
Guido van Rossume2763392002-04-05 19:30:08 +0000948 static char *buf[2] = {FALSE, TRUE};
949 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000950 long l = PyInt_AS_LONG((PyIntObject *)args);
951
Tim Peters3c67d792003-02-02 17:59:11 +0000952 if (self->proto >= 2) {
953 char opcode = l ? NEWTRUE : NEWFALSE;
954 if (self->write_func(self, &opcode, 1) < 0)
955 return -1;
956 }
957 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000958 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959 return 0;
960}
Tim Peters84e87f32001-03-17 04:50:51 +0000961
Guido van Rossum60456fd1997-04-09 17:36:32 +0000962static int
Tim Peterscba30e22003-02-01 06:24:36 +0000963save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000964{
965 char c_str[32];
966 long l = PyInt_AS_LONG((PyIntObject *)args);
967 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000969 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000970#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 || l > 0x7fffffffL
972 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000973#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000974 ) {
975 /* Text-mode pickle, or long too big to fit in the 4-byte
976 * signed BININT format: store as a string.
977 */
978 c_str[0] = INT;
979 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000980 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981 return -1;
982 }
983 else {
984 /* Binary pickle and l fits in a signed 4-byte int. */
985 c_str[1] = (int)( l & 0xff);
986 c_str[2] = (int)((l >> 8) & 0xff);
987 c_str[3] = (int)((l >> 16) & 0xff);
988 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000990 if ((c_str[4] == 0) && (c_str[3] == 0)) {
991 if (c_str[2] == 0) {
992 c_str[0] = BININT1;
993 len = 2;
994 }
995 else {
996 c_str[0] = BININT2;
997 len = 3;
998 }
999 }
1000 else {
1001 c_str[0] = BININT;
1002 len = 5;
1003 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001004
Tim Peters0bc93f52003-02-02 18:29:33 +00001005 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001006 return -1;
1007 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010}
1011
1012
1013static int
Tim Peterscba30e22003-02-01 06:24:36 +00001014save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015{
Tim Petersee1a53c2003-02-02 02:57:53 +00001016 int size;
1017 int res = -1;
1018 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001021
Tim Petersee1a53c2003-02-02 02:57:53 +00001022 if (self->proto >= 2) {
1023 /* Linear-time pickling. */
1024 size_t nbits;
1025 size_t nbytes;
1026 unsigned char *pdata;
1027 char c_str[5];
1028 int i;
1029 int sign = _PyLong_Sign(args);
1030
1031 if (sign == 0) {
1032 /* It's 0 -- an empty bytestring. */
1033 c_str[0] = LONG1;
1034 c_str[1] = 0;
1035 i = self->write_func(self, c_str, 2);
1036 if (i < 0) goto finally;
1037 res = 0;
1038 goto finally;
1039 }
1040 nbits = _PyLong_NumBits(args);
1041 if (nbits == (size_t)-1 && PyErr_Occurred())
1042 goto finally;
1043 /* How many bytes do we need? There are nbits >> 3 full
1044 * bytes of data, and nbits & 7 leftover bits. If there
1045 * are any leftover bits, then we clearly need another
1046 * byte. Wnat's not so obvious is that we *probably*
1047 * need another byte even if there aren't any leftovers:
1048 * the most-significant bit of the most-significant byte
1049 * acts like a sign bit, and it's usually got a sense
1050 * opposite of the one we need. The exception is longs
1051 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1052 * its own 256's-complement, so has the right sign bit
1053 * even without the extra byte. That's a pain to check
1054 * for in advance, though, so we always grab an extra
1055 * byte at the start, and cut it back later if possible.
1056 */
1057 nbytes = (nbits >> 3) + 1;
1058 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1059 PyErr_SetString(PyExc_OverflowError, "long too large "
1060 "to pickle");
1061 goto finally;
1062 }
1063 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1064 if (repr == NULL) goto finally;
1065 pdata = (unsigned char *)PyString_AS_STRING(repr);
1066 i = _PyLong_AsByteArray((PyLongObject *)args,
1067 pdata, nbytes,
1068 1 /* little endian */, 1 /* signed */);
1069 if (i < 0) goto finally;
1070 /* If the long is negative, this may be a byte more than
1071 * needed. This is so iff the MSB is all redundant sign
1072 * bits.
1073 */
1074 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1075 (pdata[nbytes - 2] & 0x80) != 0)
1076 --nbytes;
1077
1078 if (nbytes < 256) {
1079 c_str[0] = LONG1;
1080 c_str[1] = (char)nbytes;
1081 size = 2;
1082 }
1083 else {
1084 c_str[0] = LONG4;
1085 size = (int)nbytes;
1086 for (i = 1; i < 5; i++) {
1087 c_str[i] = (char)(size & 0xff);
1088 size >>= 8;
1089 }
1090 size = 5;
1091 }
1092 i = self->write_func(self, c_str, size);
1093 if (i < 0) goto finally;
1094 i = self->write_func(self, (char *)pdata, (int)nbytes);
1095 if (i < 0) goto finally;
1096 res = 0;
1097 goto finally;
1098 }
1099
1100 /* proto < 2: write the repr and newline. This is quadratic-time
1101 * (in the number of digits), in both directions.
1102 */
Tim Peterscba30e22003-02-01 06:24:36 +00001103 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001104 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001106 if ((size = PyString_Size(repr)) < 0)
1107 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Tim Peters0bc93f52003-02-02 18:29:33 +00001109 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001110 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Tim Peters0bc93f52003-02-02 18:29:33 +00001112 if (self->write_func(self,
1113 PyString_AS_STRING((PyStringObject *)repr),
1114 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Tim Peters0bc93f52003-02-02 18:29:33 +00001117 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001122 finally:
1123 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125}
1126
1127
1128static int
Tim Peterscba30e22003-02-01 06:24:36 +00001129save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001130{
1131 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001133 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001135 str[0] = BINFLOAT;
1136 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001138 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 return -1;
1140 }
1141 else {
1142 char c_str[250];
1143 c_str[0] = FLOAT;
1144 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001145
Tim Peters0bc93f52003-02-02 18:29:33 +00001146 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 return -1;
1148 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151}
1152
1153
1154static int
Tim Peterscba30e22003-02-01 06:24:36 +00001155save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156{
1157 int size, len;
1158 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 if ((size = PyString_Size(args)) < 0)
1161 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 if (!self->bin) {
1164 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Tim Peterscba30e22003-02-01 06:24:36 +00001168 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 if ((len = PyString_Size(repr)) < 0)
1172 goto err;
1173 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001174
Tim Peters0bc93f52003-02-02 18:29:33 +00001175 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001177
Tim Peters0bc93f52003-02-02 18:29:33 +00001178 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Tim Peters0bc93f52003-02-02 18:29:33 +00001181 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 Py_XDECREF(repr);
1185 }
1186 else {
1187 int i;
1188 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 if ((size = PyString_Size(args)) < 0)
1191 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 if (size < 256) {
1194 c_str[0] = SHORT_BINSTRING;
1195 c_str[1] = size;
1196 len = 2;
1197 }
1198 else {
1199 c_str[0] = BINSTRING;
1200 for (i = 1; i < 5; i++)
1201 c_str[i] = (int)(size >> ((i - 1) * 8));
1202 len = 5;
1203 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Tim Peters0bc93f52003-02-02 18:29:33 +00001205 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 if (size > 128 && Pdata_Check(self->file)) {
1209 if (write_other(self, NULL, 0) < 0) return -1;
1210 PDATA_APPEND(self->file, args, -1);
1211 }
1212 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001213 if (self->write_func(self,
1214 PyString_AS_STRING(
1215 (PyStringObject *)args),
1216 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 return -1;
1218 }
1219 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 if (doput)
1222 if (put(self, args) < 0)
1223 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 err:
1228 Py_XDECREF(repr);
1229 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230}
1231
1232
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001233#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001234/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1235 backslash and newline characters to \uXXXX escapes. */
1236static PyObject *
1237modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1238{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 PyObject *repr;
1240 char *p;
1241 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 repr = PyString_FromStringAndSize(NULL, 6 * size);
1246 if (repr == NULL)
1247 return NULL;
1248 if (size == 0)
1249 return repr;
1250
1251 p = q = PyString_AS_STRING(repr);
1252 while (size-- > 0) {
1253 Py_UNICODE ch = *s++;
1254 /* Map 16-bit characters to '\uxxxx' */
1255 if (ch >= 256 || ch == '\\' || ch == '\n') {
1256 *p++ = '\\';
1257 *p++ = 'u';
1258 *p++ = hexdigit[(ch >> 12) & 0xf];
1259 *p++ = hexdigit[(ch >> 8) & 0xf];
1260 *p++ = hexdigit[(ch >> 4) & 0xf];
1261 *p++ = hexdigit[ch & 15];
1262 }
1263 /* Copy everything else as-is */
1264 else
1265 *p++ = (char) ch;
1266 }
1267 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001268 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001269 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001270}
1271
1272
Guido van Rossum60456fd1997-04-09 17:36:32 +00001273static int
Tim Peterscba30e22003-02-01 06:24:36 +00001274save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275{
1276 int size, len;
1277 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 if (!PyUnicode_Check(args))
1280 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282 if (!self->bin) {
1283 char *repr_str;
1284 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001286 repr = modified_EncodeRawUnicodeEscape(
1287 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001288 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001289 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((len = PyString_Size(repr)) < 0)
1292 goto err;
1293 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001294
Tim Peters0bc93f52003-02-02 18:29:33 +00001295 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001296 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001297
Tim Peters0bc93f52003-02-02 18:29:33 +00001298 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001299 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001300
Tim Peters0bc93f52003-02-02 18:29:33 +00001301 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 Py_XDECREF(repr);
1305 }
1306 else {
1307 int i;
1308 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001309
Tim Peterscba30e22003-02-01 06:24:36 +00001310 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 if ((size = PyString_Size(repr)) < 0)
1314 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 c_str[0] = BINUNICODE;
1317 for (i = 1; i < 5; i++)
1318 c_str[i] = (int)(size >> ((i - 1) * 8));
1319 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Tim Peters0bc93f52003-02-02 18:29:33 +00001321 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 if (size > 128 && Pdata_Check(self->file)) {
1325 if (write_other(self, NULL, 0) < 0)
1326 goto err;
1327 PDATA_APPEND(self->file, repr, -1);
1328 }
1329 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001330 if (self->write_func(self, PyString_AS_STRING(repr),
1331 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 goto err;
1333 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 Py_DECREF(repr);
1336 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 if (doput)
1339 if (put(self, args) < 0)
1340 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 err:
1345 Py_XDECREF(repr);
1346 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001347}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001348#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001349
Tim Peters1d63c9f2003-02-02 20:29:39 +00001350/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1351static int
Tim Peters67920142003-02-05 03:46:17 +00001352store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001353{
1354 int i;
1355 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001356
Tim Peters1d63c9f2003-02-02 20:29:39 +00001357 assert(PyTuple_Size(t) == len);
1358
1359 for (i = 0; i < len; i++) {
1360 PyObject *element = PyTuple_GET_ITEM(t, i);
1361
1362 if (element == NULL)
1363 goto finally;
1364 if (save(self, element, 0) < 0)
1365 goto finally;
1366 }
1367 res = 0;
1368
1369 finally:
1370 return res;
1371}
1372
1373/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1374 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001375 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001376 * (a tuple can be reached from itself), and that requires some subtle
1377 * magic so that it works in all cases. IOW, this is a long routine.
1378 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001379static int
Tim Peterscba30e22003-02-01 06:24:36 +00001380save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001382 PyObject *py_tuple_id = NULL;
1383 int len, i;
1384 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001387 static char pop = POP;
1388 static char pop_mark = POP_MARK;
1389 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 if ((len = PyTuple_Size(args)) < 0)
1392 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001393
Tim Peters1d63c9f2003-02-02 20:29:39 +00001394 if (len == 0) {
1395 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001396
Tim Peters1d63c9f2003-02-02 20:29:39 +00001397 if (self->proto) {
1398 c_str[0] = EMPTY_TUPLE;
1399 len = 1;
1400 }
1401 else {
1402 c_str[0] = MARK;
1403 c_str[1] = TUPLE;
1404 len = 2;
1405 }
1406 if (self->write_func(self, c_str, len) >= 0)
1407 res = 0;
1408 /* Don't memoize an empty tuple. */
1409 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411
Tim Peters1d63c9f2003-02-02 20:29:39 +00001412 /* A non-empty tuple. */
1413
1414 /* id(tuple) isn't in the memo now. If it shows up there after
1415 * saving the tuple elements, the tuple must be recursive, in
1416 * which case we'll pop everything we put on the stack, and fetch
1417 * its value from the memo.
1418 */
1419 py_tuple_id = PyLong_FromVoidPtr(args);
1420 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001422
Tim Peters1d63c9f2003-02-02 20:29:39 +00001423 if (len <= 3 && self->proto >= 2) {
1424 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001425 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001426 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001428 /* pop the len elements */
1429 for (i = 0; i < len; ++i)
1430 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001431 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001432 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if (get(self, py_tuple_id) < 0)
1434 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 res = 0;
1436 goto finally;
1437 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001438 /* Not recursive. */
1439 if (self->write_func(self, len2opcode + len, 1) < 0)
1440 goto finally;
1441 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001442 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001443
Tim Peters1d63c9f2003-02-02 20:29:39 +00001444 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1445 * Generate MARK elt1 elt2 ... TUPLE
1446 */
1447 if (self->write_func(self, &MARKv, 1) < 0)
1448 goto finally;
1449
Tim Peters67920142003-02-05 03:46:17 +00001450 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 goto finally;
1452
1453 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1454 /* pop the stack stuff we pushed */
1455 if (self->bin) {
1456 if (self->write_func(self, &pop_mark, 1) < 0)
1457 goto finally;
1458 }
1459 else {
1460 /* Note that we pop one more than len, to remove
1461 * the MARK too.
1462 */
1463 for (i = 0; i <= len; i++)
1464 if (self->write_func(self, &pop, 1) < 0)
1465 goto finally;
1466 }
1467 /* fetch from memo */
1468 if (get(self, py_tuple_id) >= 0)
1469 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 goto finally;
1471 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Tim Peters1d63c9f2003-02-02 20:29:39 +00001473 /* Not recursive. */
1474 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001475 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001476
Tim Peters1d63c9f2003-02-02 20:29:39 +00001477 memoize:
1478 if (put(self, args) >= 0)
1479 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001481 finally:
1482 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001484}
1485
Tim Peters1092d642003-02-11 21:06:20 +00001486/* iter is an iterator giving items, and we batch up chunks of
1487 * MARK item item ... item APPENDS
1488 * opcode sequences. Calling code should have arranged to first create an
1489 * empty list, or list-like object, for the APPENDS to operate on.
1490 * Returns 0 on success, <0 on error.
1491 */
1492static int
1493batch_list(Picklerobject *self, PyObject *iter)
1494{
1495 PyObject *obj;
1496 PyObject *slice[BATCHSIZE];
1497 int i, n;
1498
1499 static char append = APPEND;
1500 static char appends = APPENDS;
1501
1502 assert(iter != NULL);
1503
1504 if (self->proto == 0) {
1505 /* APPENDS isn't available; do one at a time. */
1506 for (;;) {
1507 obj = PyIter_Next(iter);
1508 if (obj == NULL) {
1509 if (PyErr_Occurred())
1510 return -1;
1511 break;
1512 }
1513 i = save(self, obj, 0);
1514 Py_DECREF(obj);
1515 if (i < 0)
1516 return -1;
1517 if (self->write_func(self, &append, 1) < 0)
1518 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001519 }
1520 return 0;
1521 }
1522
1523 /* proto > 0: write in batches of BATCHSIZE. */
1524 do {
1525 /* Get next group of (no more than) BATCHSIZE elements. */
1526 for (n = 0; n < BATCHSIZE; ++n) {
1527 obj = PyIter_Next(iter);
1528 if (obj == NULL) {
1529 if (PyErr_Occurred())
1530 goto BatchFailed;
1531 break;
1532 }
1533 slice[n] = obj;
1534 }
1535
1536 if (n > 1) {
1537 /* Pump out MARK, slice[0:n], APPENDS. */
1538 if (self->write_func(self, &MARKv, 1) < 0)
1539 goto BatchFailed;
1540 for (i = 0; i < n; ++i) {
1541 if (save(self, slice[i], 0) < 0)
1542 goto BatchFailed;
1543 }
1544 if (self->write_func(self, &appends, 1) < 0)
1545 goto BatchFailed;
1546 }
1547 else if (n == 1) {
1548 if (save(self, slice[0], 0) < 0)
1549 goto BatchFailed;
1550 if (self->write_func(self, &append, 1) < 0)
1551 goto BatchFailed;
1552 }
1553
1554 for (i = 0; i < n; ++i) {
1555 Py_DECREF(slice[i]);
1556 }
Tim Peters90975f12003-02-12 05:28:58 +00001557 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001558 return 0;
1559
1560BatchFailed:
1561 while (--n >= 0) {
1562 Py_DECREF(slice[n]);
1563 }
1564 return -1;
1565}
1566
Guido van Rossum60456fd1997-04-09 17:36:32 +00001567static int
Tim Peterscba30e22003-02-01 06:24:36 +00001568save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001569{
Tim Peters1092d642003-02-11 21:06:20 +00001570 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001572 int len;
1573 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001575 if (self->fast && !fast_save_enter(self, args))
1576 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001577
Tim Peters1092d642003-02-11 21:06:20 +00001578 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 if (self->bin) {
1580 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001581 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 }
1583 else {
1584 s[0] = MARK;
1585 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001586 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Tim Peters1092d642003-02-11 21:06:20 +00001589 if (self->write_func(self, s, len) < 0)
1590 goto finally;
1591
1592 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593 if ((len = PyList_Size(args)) < 0)
1594 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Tim Peters1092d642003-02-11 21:06:20 +00001596 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001597 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001598 if (put(self, args) >= 0)
1599 res = 0;
1600 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 }
Tim Peters90975f12003-02-12 05:28:58 +00001602 if (put2(self, args) < 0)
1603 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001604
Tim Peters1092d642003-02-11 21:06:20 +00001605 /* Materialize the list elements. */
1606 iter = PyObject_GetIter(args);
1607 if (iter == NULL)
1608 goto finally;
1609 res = batch_list(self, iter);
1610 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001612 finally:
1613 if (self->fast && !fast_save_leave(self, args))
1614 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001617}
1618
1619
Tim Peters42f08ac2003-02-11 22:43:24 +00001620/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1621 * MARK key value ... key value SETITEMS
1622 * opcode sequences. Calling code should have arranged to first create an
1623 * empty dict, or dict-like object, for the SETITEMS to operate on.
1624 * Returns 0 on success, <0 on error.
1625 *
1626 * This is very much like batch_list(). The difference between saving
1627 * elements directly, and picking apart two-tuples, is so long-winded at
1628 * the C level, though, that attempts to combine these routines were too
1629 * ugly to bear.
1630 */
1631static int
1632batch_dict(Picklerobject *self, PyObject *iter)
1633{
1634 PyObject *p;
1635 PyObject *slice[BATCHSIZE];
1636 int i, n;
1637
1638 static char setitem = SETITEM;
1639 static char setitems = SETITEMS;
1640
1641 assert(iter != NULL);
1642
1643 if (self->proto == 0) {
1644 /* SETITEMS isn't available; do one at a time. */
1645 for (;;) {
1646 p = PyIter_Next(iter);
1647 if (p == NULL) {
1648 if (PyErr_Occurred())
1649 return -1;
1650 break;
1651 }
1652 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1653 PyErr_SetString(PyExc_TypeError, "dict items "
1654 "iterator must return 2-tuples");
1655 return -1;
1656 }
1657 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1658 if (i >= 0)
1659 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1660 Py_DECREF(p);
1661 if (i < 0)
1662 return -1;
1663 if (self->write_func(self, &setitem, 1) < 0)
1664 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001665 }
1666 return 0;
1667 }
1668
1669 /* proto > 0: write in batches of BATCHSIZE. */
1670 do {
1671 /* Get next group of (no more than) BATCHSIZE elements. */
1672 for (n = 0; n < BATCHSIZE; ++n) {
1673 p = PyIter_Next(iter);
1674 if (p == NULL) {
1675 if (PyErr_Occurred())
1676 goto BatchFailed;
1677 break;
1678 }
1679 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1680 PyErr_SetString(PyExc_TypeError, "dict items "
1681 "iterator must return 2-tuples");
1682 goto BatchFailed;
1683 }
1684 slice[n] = p;
1685 }
1686
1687 if (n > 1) {
1688 /* Pump out MARK, slice[0:n], SETITEMS. */
1689 if (self->write_func(self, &MARKv, 1) < 0)
1690 goto BatchFailed;
1691 for (i = 0; i < n; ++i) {
1692 p = slice[i];
1693 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1694 goto BatchFailed;
1695 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1696 goto BatchFailed;
1697 }
1698 if (self->write_func(self, &setitems, 1) < 0)
1699 goto BatchFailed;
1700 }
1701 else if (n == 1) {
1702 p = slice[0];
1703 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1704 goto BatchFailed;
1705 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1706 goto BatchFailed;
1707 if (self->write_func(self, &setitem, 1) < 0)
1708 goto BatchFailed;
1709 }
1710
1711 for (i = 0; i < n; ++i) {
1712 Py_DECREF(slice[i]);
1713 }
Tim Peters90975f12003-02-12 05:28:58 +00001714 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001715 return 0;
1716
1717BatchFailed:
1718 while (--n >= 0) {
1719 Py_DECREF(slice[n]);
1720 }
1721 return -1;
1722}
1723
Guido van Rossum60456fd1997-04-09 17:36:32 +00001724static int
Tim Peterscba30e22003-02-01 06:24:36 +00001725save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726{
Tim Peters42f08ac2003-02-11 22:43:24 +00001727 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001728 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001729 int len;
1730 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 if (self->fast && !fast_save_enter(self, args))
1733 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001734
Tim Peters42f08ac2003-02-11 22:43:24 +00001735 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 if (self->bin) {
1737 s[0] = EMPTY_DICT;
1738 len = 1;
1739 }
1740 else {
1741 s[0] = MARK;
1742 s[1] = DICT;
1743 len = 2;
1744 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001745
Tim Peters0bc93f52003-02-02 18:29:33 +00001746 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748
Tim Peters42f08ac2003-02-11 22:43:24 +00001749 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if ((len = PyDict_Size(args)) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001754 if (put(self, args) >= 0)
1755 res = 0;
1756 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 }
Tim Peters90975f12003-02-12 05:28:58 +00001758 if (put2(self, args) < 0)
1759 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001760
Tim Peters42f08ac2003-02-11 22:43:24 +00001761 /* Materialize the dict items. */
1762 iter = PyObject_CallMethod(args, "iteritems", "()");
1763 if (iter == NULL)
1764 goto finally;
1765 res = batch_dict(self, iter);
1766 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001768 finally:
1769 if (self->fast && !fast_save_leave(self, args))
1770 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773}
1774
1775
Tim Peters84e87f32001-03-17 04:50:51 +00001776static int
Tim Peterscba30e22003-02-01 06:24:36 +00001777save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778{
1779 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1780 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1781 char *module_str, *name_str;
1782 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001786 if (self->fast && !fast_save_enter(self, args))
1787 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001788
Tim Peters0bc93f52003-02-02 18:29:33 +00001789 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001790 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001791
Tim Peterscba30e22003-02-01 06:24:36 +00001792 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 if (self->bin) {
1796 if (save(self, class, 0) < 0)
1797 goto finally;
1798 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1801 PyObject *element = 0;
1802 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001805 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 if ((len = PyObject_Size(class_args)) < 0)
1809 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001812 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 if (save(self, element, 0) < 0) {
1816 Py_DECREF(element);
1817 goto finally;
1818 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 Py_DECREF(element);
1821 }
1822 }
1823 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001824 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1825 PyErr_Clear();
1826 else
1827 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 if (!self->bin) {
1831 if (!( name = ((PyClassObject *)class)->cl_name )) {
1832 PyErr_SetString(PicklingError, "class has no name");
1833 goto finally;
1834 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Tim Peterscba30e22003-02-01 06:24:36 +00001836 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001838
Tim Peters84e87f32001-03-17 04:50:51 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if ((module_size = PyString_Size(module)) < 0 ||
1841 (name_size = PyString_Size(name)) < 0)
1842 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001844 module_str = PyString_AS_STRING((PyStringObject *)module);
1845 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001846
Tim Peters0bc93f52003-02-02 18:29:33 +00001847 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001848 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001849
Tim Peters0bc93f52003-02-02 18:29:33 +00001850 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001852
Tim Peters0bc93f52003-02-02 18:29:33 +00001853 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001855
Tim Peters0bc93f52003-02-02 18:29:33 +00001856 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001858
Tim Peters0bc93f52003-02-02 18:29:33 +00001859 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 goto finally;
1861 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001862 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863 goto finally;
1864 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1867 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001868 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001869 goto finally;
1870 }
1871 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001872 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1873 PyErr_Clear();
1874 else
1875 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001878 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1879 PyErr_Clear();
1880 else
1881 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 res = 0;
1883 goto finally;
1884 }
1885 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001887 if (!PyDict_Check(state)) {
1888 if (put2(self, args) < 0)
1889 goto finally;
1890 }
1891 else {
1892 if (put(self, args) < 0)
1893 goto finally;
1894 }
Tim Peters84e87f32001-03-17 04:50:51 +00001895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001896 if (save(self, state, 0) < 0)
1897 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001898
Tim Peters0bc93f52003-02-02 18:29:33 +00001899 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 finally:
1905 if (self->fast && !fast_save_leave(self, args))
1906 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 Py_XDECREF(module);
1909 Py_XDECREF(class);
1910 Py_XDECREF(state);
1911 Py_XDECREF(getinitargs_func);
1912 Py_XDECREF(getstate_func);
1913 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001916}
1917
1918
Guido van Rossum60456fd1997-04-09 17:36:32 +00001919static int
Tim Peterscba30e22003-02-01 06:24:36 +00001920save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001922 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 char *name_str, *module_str;
1924 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if (name) {
1929 global_name = name;
1930 Py_INCREF(global_name);
1931 }
1932 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001933 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 goto finally;
1935 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Tim Peterscba30e22003-02-01 06:24:36 +00001937 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 if ((module_size = PyString_Size(module)) < 0 ||
1941 (name_size = PyString_Size(global_name)) < 0)
1942 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 module_str = PyString_AS_STRING((PyStringObject *)module);
1945 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946
Guido van Rossum75bfd052002-12-24 18:10:07 +00001947 /* XXX This can be doing a relative import. Clearly it shouldn't,
1948 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 mod = PyImport_ImportModule(module_str);
1950 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001952 "Can't pickle %s: import of module %s "
1953 "failed",
1954 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 goto finally;
1956 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001957 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if (klass == NULL) {
1959 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001960 "Can't pickle %s: attribute lookup %s.%s "
1961 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 "OSS", args, module, global_name);
1963 goto finally;
1964 }
1965 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001966 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001968 "Can't pickle %s: it's not the same object "
1969 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001970 "OSS", args, module, global_name);
1971 goto finally;
1972 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001973 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001974
Tim Peters731098b2003-02-04 20:56:09 +00001975 if (self->proto >= 2) {
1976 /* See whether this is in the extension registry, and if
1977 * so generate an EXT opcode.
1978 */
1979 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001980 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001981 char c_str[5];
1982 int n;
1983
1984 PyTuple_SET_ITEM(two_tuple, 0, module);
1985 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1986 py_code = PyDict_GetItem(extension_registry, two_tuple);
1987 if (py_code == NULL)
1988 goto gen_global; /* not registered */
1989
1990 /* Verify py_code has the right type and value. */
1991 if (!PyInt_Check(py_code)) {
1992 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001993 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001994 "OO", args, py_code);
1995 goto finally;
1996 }
1997 code = PyInt_AS_LONG(py_code);
1998 if (code <= 0 || code > 0x7fffffffL) {
1999 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2000 "extension code %ld is out of range",
2001 "Ol", args, code);
2002 goto finally;
2003 }
2004
2005 /* Generate an EXT opcode. */
2006 if (code <= 0xff) {
2007 c_str[0] = EXT1;
2008 c_str[1] = (char)code;
2009 n = 2;
2010 }
2011 else if (code <= 0xffff) {
2012 c_str[0] = EXT2;
2013 c_str[1] = (char)(code & 0xff);
2014 c_str[2] = (char)((code >> 8) & 0xff);
2015 n = 3;
2016 }
2017 else {
2018 c_str[0] = EXT4;
2019 c_str[1] = (char)(code & 0xff);
2020 c_str[2] = (char)((code >> 8) & 0xff);
2021 c_str[3] = (char)((code >> 16) & 0xff);
2022 c_str[4] = (char)((code >> 24) & 0xff);
2023 n = 5;
2024 }
2025
2026 if (self->write_func(self, c_str, n) >= 0)
2027 res = 0;
2028 goto finally; /* and don't memoize */
2029 }
2030
2031 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002032 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002034
Tim Peters0bc93f52003-02-02 18:29:33 +00002035 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002037
Tim Peters0bc93f52003-02-02 18:29:33 +00002038 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002040
Tim Peters0bc93f52003-02-02 18:29:33 +00002041 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002043
Tim Peters0bc93f52003-02-02 18:29:33 +00002044 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 if (put(self, args) < 0)
2048 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002052 finally:
2053 Py_XDECREF(module);
2054 Py_XDECREF(global_name);
2055 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002057 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002058}
2059
Guido van Rossum60456fd1997-04-09 17:36:32 +00002060static int
Tim Peterscba30e22003-02-01 06:24:36 +00002061save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062{
2063 PyObject *pid = 0;
2064 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 Py_INCREF(args);
2069 ARG_TUP(self, args);
2070 if (self->arg) {
2071 pid = PyObject_Call(f, self->arg, NULL);
2072 FREE_ARG_TUP(self);
2073 }
2074 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 if (pid != Py_None) {
2077 if (!self->bin) {
2078 if (!PyString_Check(pid)) {
2079 PyErr_SetString(PicklingError,
2080 "persistent id must be string");
2081 goto finally;
2082 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002083
Tim Peters0bc93f52003-02-02 18:29:33 +00002084 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if ((size = PyString_Size(pid)) < 0)
2088 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002089
Tim Peters0bc93f52003-02-02 18:29:33 +00002090 if (self->write_func(self,
2091 PyString_AS_STRING(
2092 (PyStringObject *)pid),
2093 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002095
Tim Peters0bc93f52003-02-02 18:29:33 +00002096 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 res = 1;
2100 goto finally;
2101 }
2102 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002103 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104 res = -1;
2105 else
2106 res = 1;
2107 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 goto finally;
2110 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 finally:
2115 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002119
Tim Peters71fcda52003-02-14 23:05:28 +00002120/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2121 * appropriate __reduce__ method for ob.
2122 */
Tim Peters84e87f32001-03-17 04:50:51 +00002123static int
Tim Peters71fcda52003-02-14 23:05:28 +00002124save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125{
Tim Peters71fcda52003-02-14 23:05:28 +00002126 PyObject *callable;
2127 PyObject *argtup;
2128 PyObject *state = NULL;
2129 PyObject *listitems = NULL;
2130 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002131
Tim Peters71fcda52003-02-14 23:05:28 +00002132 int use_newobj = self->proto >= 2;
2133
2134 static char reduce = REDUCE;
2135 static char build = BUILD;
2136 static char newobj = NEWOBJ;
2137
2138 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2139 &callable,
2140 &argtup,
2141 &state,
2142 &listitems,
2143 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002145
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002146 if (!PyTuple_Check(argtup)) {
2147 PyErr_SetString(PicklingError,
2148 "args from reduce() should be a tuple");
2149 return -1;
2150 }
2151
Tim Peters71fcda52003-02-14 23:05:28 +00002152 if (state == Py_None)
2153 state = NULL;
2154 if (listitems == Py_None)
2155 listitems = NULL;
2156 if (dictitems == Py_None)
2157 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002158
Tim Peters71fcda52003-02-14 23:05:28 +00002159 /* Protocol 2 special case: if callable's name is __newobj__, use
2160 * NEWOBJ. This consumes a lot of code.
2161 */
2162 if (use_newobj) {
2163 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002164
Tim Peters71fcda52003-02-14 23:05:28 +00002165 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002166 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2167 PyErr_Clear();
2168 else
2169 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002170 use_newobj = 0;
2171 }
2172 else {
2173 use_newobj = PyString_Check(temp) &&
2174 strcmp(PyString_AS_STRING(temp),
2175 "__newobj__") == 0;
2176 Py_DECREF(temp);
2177 }
2178 }
2179 if (use_newobj) {
2180 PyObject *cls;
2181 PyObject *newargtup;
2182 int n, i;
2183
2184 /* Sanity checks. */
2185 n = PyTuple_Size(argtup);
2186 if (n < 1) {
2187 PyErr_SetString(PicklingError, "__newobj__ arglist "
2188 "is empty");
2189 return -1;
2190 }
2191
2192 cls = PyTuple_GET_ITEM(argtup, 0);
2193 if (! PyObject_HasAttrString(cls, "__new__")) {
2194 PyErr_SetString(PicklingError, "args[0] from "
2195 "__newobj__ args has no __new__");
2196 return -1;
2197 }
2198
2199 /* XXX How could ob be NULL? */
2200 if (ob != NULL) {
2201 PyObject *ob_dot_class;
2202
2203 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002204 if (ob_dot_class == NULL) {
2205 if (PyErr_ExceptionMatches(
2206 PyExc_AttributeError))
2207 PyErr_Clear();
2208 else
2209 return -1;
2210 }
Tim Peters71fcda52003-02-14 23:05:28 +00002211 i = ob_dot_class != cls; /* true iff a problem */
2212 Py_XDECREF(ob_dot_class);
2213 if (i) {
2214 PyErr_SetString(PicklingError, "args[0] from "
2215 "__newobj__ args has the wrong class");
2216 return -1;
2217 }
2218 }
2219
2220 /* Save the class and its __new__ arguments. */
2221 if (save(self, cls, 0) < 0)
2222 return -1;
2223
2224 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2225 if (newargtup == NULL)
2226 return -1;
2227 for (i = 1; i < n; ++i) {
2228 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2229 Py_INCREF(temp);
2230 PyTuple_SET_ITEM(newargtup, i-1, temp);
2231 }
2232 i = save(self, newargtup, 0) < 0;
2233 Py_DECREF(newargtup);
2234 if (i < 0)
2235 return -1;
2236
2237 /* Add NEWOBJ opcode. */
2238 if (self->write_func(self, &newobj, 1) < 0)
2239 return -1;
2240 }
2241 else {
2242 /* Not using NEWOBJ. */
2243 if (save(self, callable, 0) < 0 ||
2244 save(self, argtup, 0) < 0 ||
2245 self->write_func(self, &reduce, 1) < 0)
2246 return -1;
2247 }
2248
2249 /* Memoize. */
2250 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 if (ob != NULL) {
2252 if (state && !PyDict_Check(state)) {
2253 if (put2(self, ob) < 0)
2254 return -1;
2255 }
Tim Peters71fcda52003-02-14 23:05:28 +00002256 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 }
Tim Peters84e87f32001-03-17 04:50:51 +00002259
Guido van Rossum60456fd1997-04-09 17:36:32 +00002260
Tim Peters71fcda52003-02-14 23:05:28 +00002261 if (listitems && batch_list(self, listitems) < 0)
2262 return -1;
2263
2264 if (dictitems && batch_dict(self, dictitems) < 0)
2265 return -1;
2266
2267 if (state) {
2268 if (save(self, state, 0) < 0 ||
2269 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002270 return -1;
2271 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002274}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002275
Guido van Rossum60456fd1997-04-09 17:36:32 +00002276static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002277save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278{
2279 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002280 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2281 PyObject *arg_tup;
2282 int res = -1;
2283 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284
Martin v. Löwis5a395302002-08-04 08:20:23 +00002285 if (self->nesting++ > Py_GetRecursionLimit()){
2286 PyErr_SetString(PyExc_RuntimeError,
2287 "maximum recursion depth exceeded");
2288 goto finally;
2289 }
2290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 if (!pers_save && self->pers_func) {
2292 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2293 res = tmp;
2294 goto finally;
2295 }
2296 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 if (args == Py_None) {
2299 res = save_none(self, args);
2300 goto finally;
2301 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002305 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002306 case 'b':
2307 if (args == Py_False || args == Py_True) {
2308 res = save_bool(self, args);
2309 goto finally;
2310 }
2311 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002312 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313 if (type == &PyInt_Type) {
2314 res = save_int(self, args);
2315 goto finally;
2316 }
2317 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002318
Guido van Rossum60456fd1997-04-09 17:36:32 +00002319 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 if (type == &PyLong_Type) {
2321 res = save_long(self, args);
2322 goto finally;
2323 }
2324 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002325
Guido van Rossum60456fd1997-04-09 17:36:32 +00002326 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 if (type == &PyFloat_Type) {
2328 res = save_float(self, args);
2329 goto finally;
2330 }
2331 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002332
Guido van Rossum60456fd1997-04-09 17:36:32 +00002333 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002334 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2335 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 goto finally;
2337 }
2338 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002339
Guido van Rossum60456fd1997-04-09 17:36:32 +00002340 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2342 res = save_string(self, args, 0);
2343 goto finally;
2344 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002345
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002346#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002347 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002348 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2349 res = save_unicode(self, args, 0);
2350 goto finally;
2351 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002352#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002355 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002356 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002359 if (PyDict_GetItem(self->memo, py_ob_id)) {
2360 if (get(self, py_ob_id) < 0)
2361 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 res = 0;
2364 goto finally;
2365 }
2366 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002369 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 if (type == &PyString_Type) {
2371 res = save_string(self, args, 1);
2372 goto finally;
2373 }
2374 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002375
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002376#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002377 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378 if (type == &PyUnicode_Type) {
2379 res = save_unicode(self, args, 1);
2380 goto finally;
2381 }
2382 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002383#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002384
Guido van Rossum60456fd1997-04-09 17:36:32 +00002385 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 if (type == &PyTuple_Type) {
2387 res = save_tuple(self, args);
2388 goto finally;
2389 }
2390 if (type == &PyType_Type) {
2391 res = save_global(self, args, NULL);
2392 goto finally;
2393 }
2394 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002395
Guido van Rossum60456fd1997-04-09 17:36:32 +00002396 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 if (type == &PyList_Type) {
2398 res = save_list(self, args);
2399 goto finally;
2400 }
2401 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002402
2403 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404 if (type == &PyDict_Type) {
2405 res = save_dict(self, args);
2406 goto finally;
2407 }
2408 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002409
2410 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411 if (type == &PyInstance_Type) {
2412 res = save_inst(self, args);
2413 goto finally;
2414 }
2415 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002416
2417 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418 if (type == &PyClass_Type) {
2419 res = save_global(self, args, NULL);
2420 goto finally;
2421 }
2422 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002423
2424 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002425 if (type == &PyFunction_Type) {
2426 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002427 if (res && PyErr_ExceptionMatches(PickleError)) {
2428 /* fall back to reduce */
2429 PyErr_Clear();
2430 break;
2431 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432 goto finally;
2433 }
2434 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002435
2436 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (type == &PyCFunction_Type) {
2438 res = save_global(self, args, NULL);
2439 goto finally;
2440 }
2441 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 if (!pers_save && self->inst_pers_func) {
2444 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2445 res = tmp;
2446 goto finally;
2447 }
2448 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002449
Jeremy Hylton39c61162002-07-16 19:47:43 +00002450 if (PyType_IsSubtype(type, &PyType_Type)) {
2451 res = save_global(self, args, NULL);
2452 goto finally;
2453 }
2454
Guido van Rossumb289b872003-02-19 01:45:13 +00002455 /* Get a reduction callable, and call it. This may come from
2456 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2457 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002458 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002459 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2460 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002462 Py_INCREF(args);
2463 ARG_TUP(self, args);
2464 if (self->arg) {
2465 t = PyObject_Call(__reduce__, self->arg, NULL);
2466 FREE_ARG_TUP(self);
2467 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002468 }
2469 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002470 /* Check for a __reduce_ex__ method. */
2471 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2472 if (__reduce__ != NULL) {
2473 t = PyInt_FromLong(self->proto);
2474 if (t != NULL) {
2475 ARG_TUP(self, t);
2476 t = NULL;
2477 if (self->arg) {
2478 t = PyObject_Call(__reduce__,
2479 self->arg, NULL);
2480 FREE_ARG_TUP(self);
2481 }
2482 }
2483 }
2484 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002485 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2486 PyErr_Clear();
2487 else
2488 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002489 /* Check for a __reduce__ method. */
2490 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2491 if (__reduce__ != NULL) {
2492 t = PyObject_Call(__reduce__,
2493 empty_tuple, NULL);
2494 }
2495 else {
2496 PyErr_SetObject(UnpickleableError, args);
2497 goto finally;
2498 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002500 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002501
Tim Peters71fcda52003-02-14 23:05:28 +00002502 if (t == NULL)
2503 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002504
Tim Peters71fcda52003-02-14 23:05:28 +00002505 if (PyString_Check(t)) {
2506 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002507 goto finally;
2508 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002509
Tim Peters71fcda52003-02-14 23:05:28 +00002510 if (! PyTuple_Check(t)) {
2511 cPickle_ErrFormat(PicklingError, "Value returned by "
2512 "%s must be string or tuple",
2513 "O", __reduce__);
2514 goto finally;
2515 }
2516
2517 size = PyTuple_Size(t);
2518 if (size < 2 || size > 5) {
2519 cPickle_ErrFormat(PicklingError, "tuple returned by "
2520 "%s must contain 2 through 5 elements",
2521 "O", __reduce__);
2522 goto finally;
2523 }
2524
2525 arg_tup = PyTuple_GET_ITEM(t, 1);
2526 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2527 cPickle_ErrFormat(PicklingError, "Second element of "
2528 "tuple returned by %s must be a tuple",
2529 "O", __reduce__);
2530 goto finally;
2531 }
2532
2533 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002535 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002536 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 Py_XDECREF(py_ob_id);
2538 Py_XDECREF(__reduce__);
2539 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002541 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002542}
2543
2544
2545static int
Tim Peterscba30e22003-02-01 06:24:36 +00002546dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002547{
2548 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002549
Tim Peters4190fb82003-02-02 16:09:05 +00002550 if (self->proto >= 2) {
2551 char bytes[2];
2552
2553 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002554 assert(self->proto >= 0 && self->proto < 256);
2555 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002556 if (self->write_func(self, bytes, 2) < 0)
2557 return -1;
2558 }
2559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002560 if (save(self, args, 0) < 0)
2561 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002562
Tim Peters4190fb82003-02-02 16:09:05 +00002563 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002564 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002565
Tim Peters4190fb82003-02-02 16:09:05 +00002566 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002569 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002570}
2571
2572static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002573Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002574{
Tim Peterscba30e22003-02-01 06:24:36 +00002575 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002576 PyDict_Clear(self->memo);
2577 Py_INCREF(Py_None);
2578 return Py_None;
2579}
2580
2581static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002582Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583{
2584 int l, i, rsize, ssize, clear=1, lm;
2585 long ik;
2586 PyObject *k, *r;
2587 char *s, *p, *have_get;
2588 Pdata *data;
2589
2590 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002591 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002592 return NULL;
2593
2594 /* Check to make sure we are based on a list */
2595 if (! Pdata_Check(self->file)) {
2596 PyErr_SetString(PicklingError,
2597 "Attempt to getvalue() a non-list-based pickler");
2598 return NULL;
2599 }
2600
2601 /* flush write buffer */
2602 if (write_other(self, NULL, 0) < 0) return NULL;
2603
2604 data=(Pdata*)self->file;
2605 l=data->length;
2606
2607 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002608 lm = PyDict_Size(self->memo);
2609 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002611 have_get = malloc(lm);
2612 if (have_get == NULL) return PyErr_NoMemory();
2613 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614
2615 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002616 for (rsize = 0, i = l; --i >= 0; ) {
2617 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002618
Tim Petersac5687a2003-02-02 18:08:34 +00002619 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621
2622 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002623 ik = PyInt_AS_LONG((PyIntObject*)k);
2624 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 PyErr_SetString(PicklingError,
2626 "Invalid get data");
2627 return NULL;
2628 }
Tim Petersac5687a2003-02-02 18:08:34 +00002629 if (have_get[ik]) /* with matching get */
2630 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631 }
2632
2633 else if (! (PyTuple_Check(k) &&
2634 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002635 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 ) {
2637 PyErr_SetString(PicklingError,
2638 "Unexpected data in internal list");
2639 return NULL;
2640 }
2641
2642 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002643 ik = PyInt_AS_LONG((PyIntObject *)k);
2644 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 PyErr_SetString(PicklingError,
2646 "Invalid get data");
2647 return NULL;
2648 }
Tim Petersac5687a2003-02-02 18:08:34 +00002649 have_get[ik] = 1;
2650 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 }
2653
2654 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002655 r = PyString_FromStringAndSize(NULL, rsize);
2656 if (r == NULL) goto err;
2657 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658
Tim Petersac5687a2003-02-02 18:08:34 +00002659 for (i = 0; i < l; i++) {
2660 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002661
2662 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002663 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002664 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002665 p=PyString_AS_STRING((PyStringObject *)k);
2666 while (--ssize >= 0)
2667 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 }
2669 }
2670
2671 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002672 ik = PyInt_AS_LONG((PyIntObject *)
2673 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 if (ik < 256) {
2675 *s++ = BINGET;
2676 *s++ = (int)(ik & 0xff);
2677 }
2678 else {
2679 *s++ = LONG_BINGET;
2680 *s++ = (int)(ik & 0xff);
2681 *s++ = (int)((ik >> 8) & 0xff);
2682 *s++ = (int)((ik >> 16) & 0xff);
2683 *s++ = (int)((ik >> 24) & 0xff);
2684 }
2685 }
2686
2687 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002688 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689
2690 if (have_get[ik]) { /* with matching get */
2691 if (ik < 256) {
2692 *s++ = BINPUT;
2693 *s++ = (int)(ik & 0xff);
2694 }
2695 else {
2696 *s++ = LONG_BINPUT;
2697 *s++ = (int)(ik & 0xff);
2698 *s++ = (int)((ik >> 8) & 0xff);
2699 *s++ = (int)((ik >> 16) & 0xff);
2700 *s++ = (int)((ik >> 24) & 0xff);
2701 }
2702 }
2703 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704 }
2705
2706 if (clear) {
2707 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002708 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 }
2710
2711 free(have_get);
2712 return r;
2713 err:
2714 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002715 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002716}
2717
2718static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002719Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720{
2721 PyObject *ob;
2722 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002723
Tim Peterscba30e22003-02-01 06:24:36 +00002724 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 if (dump(self, ob) < 0)
2728 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 /* XXX Why does dump() return self? */
2733 Py_INCREF(self);
2734 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002735}
2736
2737
Tim Peterscba30e22003-02-01 06:24:36 +00002738static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739{
Neal Norwitzb0493252002-03-31 14:44:22 +00002740 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002741 PyDoc_STR("dump(object) -- "
2742 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002743 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002744 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002745 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002746 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002747 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002748};
2749
2750
2751static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002752newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753{
2754 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002755
Tim Peters5bd2a792003-02-01 16:45:06 +00002756 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002757 proto = HIGHEST_PROTOCOL;
2758 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002759 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2760 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002761 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002763 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002764
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002765 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002766 if (self == NULL)
2767 return NULL;
2768 self->proto = proto;
2769 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002770 self->fp = NULL;
2771 self->write = NULL;
2772 self->memo = NULL;
2773 self->arg = NULL;
2774 self->pers_func = NULL;
2775 self->inst_pers_func = NULL;
2776 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002777 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002778 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 self->fast_container = 0;
2780 self->fast_memo = NULL;
2781 self->buf_size = 0;
2782 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002783
Tim Peters5bd2a792003-02-01 16:45:06 +00002784 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 if (file)
2786 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002787 else {
2788 file = Pdata_New();
2789 if (file == NULL)
2790 goto err;
2791 }
2792 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002793
Tim Peterscba30e22003-02-01 06:24:36 +00002794 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002795 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 if (PyFile_Check(file)) {
2798 self->fp = PyFile_AsFile(file);
2799 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002800 PyErr_SetString(PyExc_ValueError,
2801 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002802 goto err;
2803 }
2804 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002805 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 else if (PycStringIO_OutputCheck(file)) {
2807 self->write_func = write_cStringIO;
2808 }
2809 else if (file == Py_None) {
2810 self->write_func = write_none;
2811 }
2812 else {
2813 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815 if (! Pdata_Check(file)) {
2816 self->write = PyObject_GetAttr(file, write_str);
2817 if (!self->write) {
2818 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002819 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820 "argument must have 'write' "
2821 "attribute");
2822 goto err;
2823 }
2824 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002825
Tim Peters5bd2a792003-02-01 16:45:06 +00002826 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2827 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 PyErr_NoMemory();
2829 goto err;
2830 }
2831 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 if (PyEval_GetRestricted()) {
2834 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002835 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002836
Tim Peters5b7da392003-02-04 00:21:07 +00002837 if (m == NULL)
2838 goto err;
2839 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002840 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002841 if (self->dispatch_table == NULL)
2842 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 }
2844 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002845 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 Py_INCREF(dispatch_table);
2847 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002848 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002853 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002855}
2856
2857
2858static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002859get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860{
Martin v. Löwis544f1192004-07-27 05:22:33 +00002861 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002863 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002864
Tim Peters92c8bb32003-02-13 23:00:26 +00002865 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002866 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002867 * accepts Pickler() and Pickler(integer) too. The meaning then
2868 * is clear as mud, undocumented, and not supported by pickle.py.
2869 * I'm told Zope uses this, but I haven't traced into this code
2870 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002871 */
2872 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002874 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002875 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2876 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877 return NULL;
2878 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002879 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002880}
2881
2882
2883static void
Tim Peterscba30e22003-02-01 06:24:36 +00002884Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002886 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887 Py_XDECREF(self->write);
2888 Py_XDECREF(self->memo);
2889 Py_XDECREF(self->fast_memo);
2890 Py_XDECREF(self->arg);
2891 Py_XDECREF(self->file);
2892 Py_XDECREF(self->pers_func);
2893 Py_XDECREF(self->inst_pers_func);
2894 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002895 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002896 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002897}
2898
2899static int
2900Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2901{
2902 int err;
2903#define VISIT(SLOT) \
2904 if (SLOT) { \
2905 err = visit((PyObject *)(SLOT), arg); \
2906 if (err) \
2907 return err; \
2908 }
2909 VISIT(self->write);
2910 VISIT(self->memo);
2911 VISIT(self->fast_memo);
2912 VISIT(self->arg);
2913 VISIT(self->file);
2914 VISIT(self->pers_func);
2915 VISIT(self->inst_pers_func);
2916 VISIT(self->dispatch_table);
2917#undef VISIT
2918 return 0;
2919}
2920
2921static int
2922Pickler_clear(Picklerobject *self)
2923{
2924#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL;
2925 CLEAR(self->write);
2926 CLEAR(self->memo);
2927 CLEAR(self->fast_memo);
2928 CLEAR(self->arg);
2929 CLEAR(self->file);
2930 CLEAR(self->pers_func);
2931 CLEAR(self->inst_pers_func);
2932 CLEAR(self->dispatch_table);
2933#undef CLEAR
2934 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002935}
2936
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002937static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002938Pickler_get_pers_func(Picklerobject *p)
2939{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 if (p->pers_func == NULL)
2941 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2942 else
2943 Py_INCREF(p->pers_func);
2944 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002945}
2946
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002947static int
2948Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2949{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 if (v == NULL) {
2951 PyErr_SetString(PyExc_TypeError,
2952 "attribute deletion is not supported");
2953 return -1;
2954 }
2955 Py_XDECREF(p->pers_func);
2956 Py_INCREF(v);
2957 p->pers_func = v;
2958 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002959}
2960
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002961static int
2962Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2963{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 if (v == NULL) {
2965 PyErr_SetString(PyExc_TypeError,
2966 "attribute deletion is not supported");
2967 return -1;
2968 }
2969 Py_XDECREF(p->inst_pers_func);
2970 Py_INCREF(v);
2971 p->inst_pers_func = v;
2972 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002973}
2974
2975static PyObject *
2976Pickler_get_memo(Picklerobject *p)
2977{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 if (p->memo == NULL)
2979 PyErr_SetString(PyExc_AttributeError, "memo");
2980 else
2981 Py_INCREF(p->memo);
2982 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002983}
2984
2985static int
2986Pickler_set_memo(Picklerobject *p, PyObject *v)
2987{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if (v == NULL) {
2989 PyErr_SetString(PyExc_TypeError,
2990 "attribute deletion is not supported");
2991 return -1;
2992 }
2993 if (!PyDict_Check(v)) {
2994 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2995 return -1;
2996 }
2997 Py_XDECREF(p->memo);
2998 Py_INCREF(v);
2999 p->memo = v;
3000 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003001}
3002
3003static PyObject *
3004Pickler_get_error(Picklerobject *p)
3005{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 /* why is this an attribute on the Pickler? */
3007 Py_INCREF(PicklingError);
3008 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003009}
3010
3011static PyMemberDef Pickler_members[] = {
3012 {"binary", T_INT, offsetof(Picklerobject, bin)},
3013 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003014 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003015};
3016
3017static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003018 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003019 (setter)Pickler_set_pers_func},
3020 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3021 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003022 {"PicklingError", (getter)Pickler_get_error, NULL},
3023 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003024};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003026PyDoc_STRVAR(Picklertype__doc__,
3027"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003028
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003029static PyTypeObject Picklertype = {
3030 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00003031 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00003032 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003033 sizeof(Picklerobject), /*tp_basicsize*/
3034 0,
3035 (destructor)Pickler_dealloc, /* tp_dealloc */
3036 0, /* tp_print */
3037 0, /* tp_getattr */
3038 0, /* tp_setattr */
3039 0, /* tp_compare */
3040 0, /* tp_repr */
3041 0, /* tp_as_number */
3042 0, /* tp_as_sequence */
3043 0, /* tp_as_mapping */
3044 0, /* tp_hash */
3045 0, /* tp_call */
3046 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003047 PyObject_GenericGetAttr, /* tp_getattro */
3048 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003049 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003050 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003051 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003052 (traverseproc)Pickler_traverse, /* tp_traverse */
3053 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003054 0, /* tp_richcompare */
3055 0, /* tp_weaklistoffset */
3056 0, /* tp_iter */
3057 0, /* tp_iternext */
3058 Pickler_methods, /* tp_methods */
3059 Pickler_members, /* tp_members */
3060 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003061};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003062
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003063static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003064find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065{
3066 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068 if (fc) {
3069 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003070 PyErr_SetString(UnpicklingError, "Global and instance "
3071 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 return NULL;
3073 }
Tim Peterscba30e22003-02-01 06:24:36 +00003074 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 py_global_name);
3076 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003078 module = PySys_GetObject("modules");
3079 if (module == NULL)
3080 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 module = PyDict_GetItem(module, py_module_name);
3083 if (module == NULL) {
3084 module = PyImport_Import(py_module_name);
3085 if (!module)
3086 return NULL;
3087 global = PyObject_GetAttr(module, py_global_name);
3088 Py_DECREF(module);
3089 }
3090 else
3091 global = PyObject_GetAttr(module, py_global_name);
3092 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003093}
3094
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003095static int
Tim Peterscba30e22003-02-01 06:24:36 +00003096marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097{
3098 if (self->num_marks < 1) {
3099 PyErr_SetString(UnpicklingError, "could not find MARK");
3100 return -1;
3101 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104}
3105
Tim Peters84e87f32001-03-17 04:50:51 +00003106
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107static int
Tim Peterscba30e22003-02-01 06:24:36 +00003108load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109{
3110 PDATA_APPEND(self->stack, Py_None, -1);
3111 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112}
3113
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003114static int
Tim Peterscba30e22003-02-01 06:24:36 +00003115bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116{
3117 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3118 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003119}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
3121static int
Tim Peterscba30e22003-02-01 06:24:36 +00003122load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123{
3124 PyObject *py_int = 0;
3125 char *endptr, *s;
3126 int len, res = -1;
3127 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003128
Tim Peters0bc93f52003-02-02 18:29:33 +00003129 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003130 if (len < 2) return bad_readline();
3131 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 errno = 0;
3134 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3137 /* Hm, maybe we've got something long. Let's try reading
3138 it as a Python long object. */
3139 errno = 0;
3140 py_int = PyLong_FromString(s, NULL, 0);
3141 if (py_int == NULL) {
3142 PyErr_SetString(PyExc_ValueError,
3143 "could not convert string to int");
3144 goto finally;
3145 }
3146 }
3147 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003148 if (len == 3 && (l == 0 || l == 1)) {
3149 if (!( py_int = PyBool_FromLong(l))) goto finally;
3150 }
3151 else {
3152 if (!( py_int = PyInt_FromLong(l))) goto finally;
3153 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 free(s);
3157 PDATA_PUSH(self->stack, py_int, -1);
3158 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003160 finally:
3161 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164}
3165
Tim Peters3c67d792003-02-02 17:59:11 +00003166static int
3167load_bool(Unpicklerobject *self, PyObject *boolean)
3168{
3169 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003170 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003171 return 0;
3172}
3173
Tim Petersee1a53c2003-02-02 02:57:53 +00003174/* s contains x bytes of a little-endian integer. Return its value as a
3175 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3176 * int, but when x is 4 it's a signed one. This is an historical source
3177 * of x-platform bugs.
3178 */
Tim Peters84e87f32001-03-17 04:50:51 +00003179static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003180calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181{
3182 unsigned char c;
3183 int i;
3184 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 for (i = 0, l = 0L; i < x; i++) {
3187 c = (unsigned char)s[i];
3188 l |= (long)c << (i * 8);
3189 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003190#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3192 * is signed, so on a box with longs bigger than 4 bytes we need
3193 * to extend a BININT's sign bit to the full width.
3194 */
3195 if (x == 4 && l & (1L << 31))
3196 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003197#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199}
3200
3201
3202static int
Tim Peterscba30e22003-02-01 06:24:36 +00003203load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204{
3205 PyObject *py_int = 0;
3206 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Tim Peterscba30e22003-02-01 06:24:36 +00003210 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213 PDATA_PUSH(self->stack, py_int, -1);
3214 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215}
3216
3217
3218static int
Tim Peterscba30e22003-02-01 06:24:36 +00003219load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220{
3221 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Tim Peters0bc93f52003-02-02 18:29:33 +00003223 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227}
3228
3229
3230static int
Tim Peterscba30e22003-02-01 06:24:36 +00003231load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232{
3233 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Tim Peters0bc93f52003-02-02 18:29:33 +00003235 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003238 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239}
3240
3241
3242static int
Tim Peterscba30e22003-02-01 06:24:36 +00003243load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244{
3245 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003246
Tim Peters0bc93f52003-02-02 18:29:33 +00003247 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003250 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003251}
Tim Peters84e87f32001-03-17 04:50:51 +00003252
Guido van Rossum60456fd1997-04-09 17:36:32 +00003253static int
Tim Peterscba30e22003-02-01 06:24:36 +00003254load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255{
3256 PyObject *l = 0;
3257 char *end, *s;
3258 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003259
Tim Peters0bc93f52003-02-02 18:29:33 +00003260 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 if (len < 2) return bad_readline();
3262 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003263
Tim Peterscba30e22003-02-01 06:24:36 +00003264 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 free(s);
3268 PDATA_PUSH(self->stack, l, -1);
3269 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 finally:
3272 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003275}
3276
Tim Petersee1a53c2003-02-02 02:57:53 +00003277/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3278 * data following.
3279 */
3280static int
3281load_counted_long(Unpicklerobject *self, int size)
3282{
3283 int i;
3284 char *nbytes;
3285 unsigned char *pdata;
3286 PyObject *along;
3287
3288 assert(size == 1 || size == 4);
3289 i = self->read_func(self, &nbytes, size);
3290 if (i < 0) return -1;
3291
3292 size = calc_binint(nbytes, size);
3293 if (size < 0) {
3294 /* Corrupt or hostile pickle -- we never write one like
3295 * this.
3296 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003297 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003298 "byte count");
3299 return -1;
3300 }
3301
3302 if (size == 0)
3303 along = PyLong_FromLong(0L);
3304 else {
3305 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003306 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003307 if (i < 0) return -1;
3308 along = _PyLong_FromByteArray(pdata, (size_t)size,
3309 1 /* little endian */, 1 /* signed */);
3310 }
3311 if (along == NULL)
3312 return -1;
3313 PDATA_PUSH(self->stack, along, -1);
3314 return 0;
3315}
Tim Peters84e87f32001-03-17 04:50:51 +00003316
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317static int
Tim Peterscba30e22003-02-01 06:24:36 +00003318load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319{
3320 PyObject *py_float = 0;
3321 char *endptr, *s;
3322 int len, res = -1;
3323 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003324
Tim Peters0bc93f52003-02-02 18:29:33 +00003325 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003326 if (len < 2) return bad_readline();
3327 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003330 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003332 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3333 PyErr_SetString(PyExc_ValueError,
3334 "could not convert string to float");
3335 goto finally;
3336 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003337
Tim Peterscba30e22003-02-01 06:24:36 +00003338 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341 free(s);
3342 PDATA_PUSH(self->stack, py_float, -1);
3343 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345 finally:
3346 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003349}
3350
Guido van Rossum60456fd1997-04-09 17:36:32 +00003351static int
Tim Peterscba30e22003-02-01 06:24:36 +00003352load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353{
Tim Peters9905b942003-03-20 20:53:32 +00003354 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 double x;
3356 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Tim Peters0bc93f52003-02-02 18:29:33 +00003358 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003359 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003360
Tim Peters9905b942003-03-20 20:53:32 +00003361 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3362 if (x == -1.0 && PyErr_Occurred())
3363 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003364
Tim Peters9905b942003-03-20 20:53:32 +00003365 py_float = PyFloat_FromDouble(x);
3366 if (py_float == NULL)
3367 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369 PDATA_PUSH(self->stack, py_float, -1);
3370 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372
3373static int
Tim Peterscba30e22003-02-01 06:24:36 +00003374load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375{
3376 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003377 int len, res = -1;
3378 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379
Tim Peters0bc93f52003-02-02 18:29:33 +00003380 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003381 if (len < 2) return bad_readline();
3382 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003384
3385 /* Strip outermost quotes */
3386 while (s[len-1] <= ' ')
3387 len--;
3388 if(s[0]=='"' && s[len-1]=='"'){
3389 s[len-1] = '\0';
3390 p = s + 1 ;
3391 len -= 2;
3392 } else if(s[0]=='\'' && s[len-1]=='\''){
3393 s[len-1] = '\0';
3394 p = s + 1 ;
3395 len -= 2;
3396 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 goto insecure;
3398 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003399
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003400 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3401 if (str) {
3402 PDATA_PUSH(self->stack, str, -1);
3403 res = 0;
3404 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003405 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 insecure:
3409 free(s);
3410 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3411 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003412}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003413
3414
3415static int
Tim Peterscba30e22003-02-01 06:24:36 +00003416load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417{
3418 PyObject *py_string = 0;
3419 long l;
3420 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421
Tim Peters0bc93f52003-02-02 18:29:33 +00003422 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425
Tim Peters0bc93f52003-02-02 18:29:33 +00003426 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Tim Peterscba30e22003-02-01 06:24:36 +00003429 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 PDATA_PUSH(self->stack, py_string, -1);
3433 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434}
3435
3436
3437static int
Tim Peterscba30e22003-02-01 06:24:36 +00003438load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439{
3440 PyObject *py_string = 0;
3441 unsigned char l;
3442 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443
Tim Peters0bc93f52003-02-02 18:29:33 +00003444 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448
Tim Peters0bc93f52003-02-02 18:29:33 +00003449 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003451 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003453 PDATA_PUSH(self->stack, py_string, -1);
3454 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003455}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456
3457
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003458#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459static int
Tim Peterscba30e22003-02-01 06:24:36 +00003460load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461{
3462 PyObject *str = 0;
3463 int len, res = -1;
3464 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003465
Tim Peters0bc93f52003-02-02 18:29:33 +00003466 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003468
Tim Peterscba30e22003-02-01 06:24:36 +00003469 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472 PDATA_PUSH(self->stack, str, -1);
3473 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003475 finally:
3476 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003477}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003478#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003479
3480
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003481#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003482static int
Tim Peterscba30e22003-02-01 06:24:36 +00003483load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003484{
3485 PyObject *unicode;
3486 long l;
3487 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003488
Tim Peters0bc93f52003-02-02 18:29:33 +00003489 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003492
Tim Peters0bc93f52003-02-02 18:29:33 +00003493 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003495
Tim Peterscba30e22003-02-01 06:24:36 +00003496 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003497 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 PDATA_PUSH(self->stack, unicode, -1);
3500 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003501}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003502#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003503
3504
3505static int
Tim Peterscba30e22003-02-01 06:24:36 +00003506load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003507{
3508 PyObject *tup;
3509 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 if ((i = marker(self)) < 0) return -1;
3512 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3513 PDATA_PUSH(self->stack, tup, -1);
3514 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003515}
3516
3517static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003518load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003519{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003520 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003521
Tim Peters1d63c9f2003-02-02 20:29:39 +00003522 if (tup == NULL)
3523 return -1;
3524
3525 while (--len >= 0) {
3526 PyObject *element;
3527
3528 PDATA_POP(self->stack, element);
3529 if (element == NULL)
3530 return -1;
3531 PyTuple_SET_ITEM(tup, len, element);
3532 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 PDATA_PUSH(self->stack, tup, -1);
3534 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535}
3536
3537static int
Tim Peterscba30e22003-02-01 06:24:36 +00003538load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003539{
3540 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 if (!( list=PyList_New(0))) return -1;
3543 PDATA_PUSH(self->stack, list, -1);
3544 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003545}
3546
3547static int
Tim Peterscba30e22003-02-01 06:24:36 +00003548load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003549{
3550 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if (!( dict=PyDict_New())) return -1;
3553 PDATA_PUSH(self->stack, dict, -1);
3554 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003555}
3556
3557
3558static int
Tim Peterscba30e22003-02-01 06:24:36 +00003559load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560{
3561 PyObject *list = 0;
3562 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564 if ((i = marker(self)) < 0) return -1;
3565 if (!( list=Pdata_popList(self->stack, i))) return -1;
3566 PDATA_PUSH(self->stack, list, -1);
3567 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003568}
3569
3570static int
Tim Peterscba30e22003-02-01 06:24:36 +00003571load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572{
3573 PyObject *dict, *key, *value;
3574 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003576 if ((i = marker(self)) < 0) return -1;
3577 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003579 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003581 for (k = i+1; k < j; k += 2) {
3582 key =self->stack->data[k-1];
3583 value=self->stack->data[k ];
3584 if (PyDict_SetItem(dict, key, value) < 0) {
3585 Py_DECREF(dict);
3586 return -1;
3587 }
3588 }
3589 Pdata_clear(self->stack, i);
3590 PDATA_PUSH(self->stack, dict, -1);
3591 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003592}
3593
3594static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003595Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003597 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599 if (PyClass_Check(cls)) {
3600 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 if ((l=PyObject_Size(args)) < 0) goto err;
3603 if (!( l )) {
3604 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003605
Tim Peterscba30e22003-02-01 06:24:36 +00003606 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003607 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003609 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 so bypass usual construction */
3611 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003614 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 goto err;
3616 return inst;
3617 }
3618 Py_DECREF(__getinitargs__);
3619 }
Tim Peters84e87f32001-03-17 04:50:51 +00003620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621 if ((r=PyInstance_New(cls, args, NULL))) return r;
3622 else goto err;
3623 }
Tim Peters84e87f32001-03-17 04:50:51 +00003624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627 err:
3628 {
3629 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 PyErr_Fetch(&tp, &v, &tb);
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003632 if ((r=PyTuple_Pack(3,v,cls,args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633 Py_XDECREF(v);
3634 v=r;
3635 }
3636 PyErr_Restore(tp,v,tb);
3637 }
3638 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639}
Tim Peters84e87f32001-03-17 04:50:51 +00003640
Guido van Rossum60456fd1997-04-09 17:36:32 +00003641
3642static int
Tim Peterscba30e22003-02-01 06:24:36 +00003643load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644{
3645 PyObject *class, *tup, *obj=0;
3646 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648 if ((i = marker(self)) < 0) return -1;
3649 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3650 PDATA_POP(self->stack, class);
3651 if (class) {
3652 obj = Instance_New(class, tup);
3653 Py_DECREF(class);
3654 }
3655 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657 if (! obj) return -1;
3658 PDATA_PUSH(self->stack, obj, -1);
3659 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660}
3661
3662
3663static int
Tim Peterscba30e22003-02-01 06:24:36 +00003664load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665{
3666 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3667 int i, len;
3668 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003671
Tim Peters0bc93f52003-02-02 18:29:33 +00003672 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003673 if (len < 2) return bad_readline();
3674 module_name = PyString_FromStringAndSize(s, len - 1);
3675 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003676
Tim Peters0bc93f52003-02-02 18:29:33 +00003677 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 if (len < 2) return bad_readline();
3679 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003680 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681 self->find_class);
3682 Py_DECREF(class_name);
3683 }
3684 }
3685 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689 if ((tup=Pdata_popTuple(self->stack, i))) {
3690 obj = Instance_New(class, tup);
3691 Py_DECREF(tup);
3692 }
3693 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003697 PDATA_PUSH(self->stack, obj, -1);
3698 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003699}
3700
Tim Peterseab7db32003-02-13 18:24:14 +00003701static int
3702load_newobj(Unpicklerobject *self)
3703{
3704 PyObject *args = NULL;
3705 PyObject *clsraw = NULL;
3706 PyTypeObject *cls; /* clsraw cast to its true type */
3707 PyObject *obj;
3708
3709 /* Stack is ... cls argtuple, and we want to call
3710 * cls.__new__(cls, *argtuple).
3711 */
3712 PDATA_POP(self->stack, args);
3713 if (args == NULL) goto Fail;
3714 if (! PyTuple_Check(args)) {
3715 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3716 "tuple.");
3717 goto Fail;
3718 }
3719
3720 PDATA_POP(self->stack, clsraw);
3721 cls = (PyTypeObject *)clsraw;
3722 if (cls == NULL) goto Fail;
3723 if (! PyType_Check(cls)) {
3724 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3725 "isn't a type object");
3726 goto Fail;
3727 }
3728 if (cls->tp_new == NULL) {
3729 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3730 "has NULL tp_new");
3731 goto Fail;
3732 }
3733
3734 /* Call __new__. */
3735 obj = cls->tp_new(cls, args, NULL);
3736 if (obj == NULL) goto Fail;
3737
3738 Py_DECREF(args);
3739 Py_DECREF(clsraw);
3740 PDATA_PUSH(self->stack, obj, -1);
3741 return 0;
3742
3743 Fail:
3744 Py_XDECREF(args);
3745 Py_XDECREF(clsraw);
3746 return -1;
3747}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
3749static int
Tim Peterscba30e22003-02-01 06:24:36 +00003750load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003751{
3752 PyObject *class = 0, *module_name = 0, *class_name = 0;
3753 int len;
3754 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003755
Tim Peters0bc93f52003-02-02 18:29:33 +00003756 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 if (len < 2) return bad_readline();
3758 module_name = PyString_FromStringAndSize(s, len - 1);
3759 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003760
Tim Peters0bc93f52003-02-02 18:29:33 +00003761 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003762 if (len < 2) {
3763 Py_DECREF(module_name);
3764 return bad_readline();
3765 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003767 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 self->find_class);
3769 Py_DECREF(class_name);
3770 }
3771 }
3772 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 if (! class) return -1;
3775 PDATA_PUSH(self->stack, class, -1);
3776 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003777}
3778
3779
3780static int
Tim Peterscba30e22003-02-01 06:24:36 +00003781load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782{
3783 PyObject *pid = 0;
3784 int len;
3785 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003788 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 if (len < 2) return bad_readline();
3790
3791 pid = PyString_FromStringAndSize(s, len - 1);
3792 if (!pid) return -1;
3793
3794 if (PyList_Check(self->pers_func)) {
3795 if (PyList_Append(self->pers_func, pid) < 0) {
3796 Py_DECREF(pid);
3797 return -1;
3798 }
3799 }
3800 else {
3801 ARG_TUP(self, pid);
3802 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003803 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 NULL);
3805 FREE_ARG_TUP(self);
3806 }
3807 }
3808
3809 if (! pid) return -1;
3810
3811 PDATA_PUSH(self->stack, pid, -1);
3812 return 0;
3813 }
3814 else {
3815 PyErr_SetString(UnpicklingError,
3816 "A load persistent id instruction was encountered,\n"
3817 "but no persistent_load function was specified.");
3818 return -1;
3819 }
3820}
3821
3822static int
Tim Peterscba30e22003-02-01 06:24:36 +00003823load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824{
3825 PyObject *pid = 0;
3826
3827 if (self->pers_func) {
3828 PDATA_POP(self->stack, pid);
3829 if (! pid) return -1;
3830
3831 if (PyList_Check(self->pers_func)) {
3832 if (PyList_Append(self->pers_func, pid) < 0) {
3833 Py_DECREF(pid);
3834 return -1;
3835 }
3836 }
3837 else {
3838 ARG_TUP(self, pid);
3839 if (self->arg) {
3840 pid = PyObject_Call(self->pers_func, self->arg,
3841 NULL);
3842 FREE_ARG_TUP(self);
3843 }
3844 if (! pid) return -1;
3845 }
3846
3847 PDATA_PUSH(self->stack, pid, -1);
3848 return 0;
3849 }
3850 else {
3851 PyErr_SetString(UnpicklingError,
3852 "A load persistent id instruction was encountered,\n"
3853 "but no persistent_load function was specified.");
3854 return -1;
3855 }
3856}
3857
3858
3859static int
Tim Peterscba30e22003-02-01 06:24:36 +00003860load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003861{
3862 int len;
3863
3864 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3865
3866 /* Note that we split the (pickle.py) stack into two stacks,
3867 an object stack and a mark stack. We have to be clever and
3868 pop the right one. We do this by looking at the top of the
3869 mark stack.
3870 */
3871
3872 if ((self->num_marks > 0) &&
3873 (self->marks[self->num_marks - 1] == len))
3874 self->num_marks--;
3875 else {
3876 len--;
3877 Py_DECREF(self->stack->data[len]);
3878 self->stack->length=len;
3879 }
3880
3881 return 0;
3882}
3883
3884
3885static int
Tim Peterscba30e22003-02-01 06:24:36 +00003886load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003887{
3888 int i;
3889
3890 if ((i = marker(self)) < 0)
3891 return -1;
3892
3893 Pdata_clear(self->stack, i);
3894
3895 return 0;
3896}
3897
3898
3899static int
Tim Peterscba30e22003-02-01 06:24:36 +00003900load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901{
3902 PyObject *last;
3903 int len;
3904
3905 if ((len = self->stack->length) <= 0) return stackUnderflow();
3906 last=self->stack->data[len-1];
3907 Py_INCREF(last);
3908 PDATA_PUSH(self->stack, last, -1);
3909 return 0;
3910}
3911
3912
3913static int
Tim Peterscba30e22003-02-01 06:24:36 +00003914load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915{
3916 PyObject *py_str = 0, *value = 0;
3917 int len;
3918 char *s;
3919 int rc;
3920
Tim Peters0bc93f52003-02-02 18:29:33 +00003921 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003922 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 value = PyDict_GetItem(self->memo, py_str);
3927 if (! value) {
3928 PyErr_SetObject(BadPickleGet, py_str);
3929 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003930 }
3931 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 PDATA_APPEND(self->stack, value, -1);
3933 rc = 0;
3934 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936 Py_DECREF(py_str);
3937 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938}
3939
3940
3941static int
Tim Peterscba30e22003-02-01 06:24:36 +00003942load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943{
3944 PyObject *py_key = 0, *value = 0;
3945 unsigned char key;
3946 char *s;
3947 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Tim Peters0bc93f52003-02-02 18:29:33 +00003949 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 key = (unsigned char)s[0];
3952 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 value = PyDict_GetItem(self->memo, py_key);
3955 if (! value) {
3956 PyErr_SetObject(BadPickleGet, py_key);
3957 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003958 }
3959 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 PDATA_APPEND(self->stack, value, -1);
3961 rc = 0;
3962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 Py_DECREF(py_key);
3965 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966}
3967
3968
3969static int
Tim Peterscba30e22003-02-01 06:24:36 +00003970load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971{
3972 PyObject *py_key = 0, *value = 0;
3973 unsigned char c;
3974 char *s;
3975 long key;
3976 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003977
Tim Peters0bc93f52003-02-02 18:29:33 +00003978 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980 c = (unsigned char)s[0];
3981 key = (long)c;
3982 c = (unsigned char)s[1];
3983 key |= (long)c << 8;
3984 c = (unsigned char)s[2];
3985 key |= (long)c << 16;
3986 c = (unsigned char)s[3];
3987 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3990
3991 value = PyDict_GetItem(self->memo, py_key);
3992 if (! value) {
3993 PyErr_SetObject(BadPickleGet, py_key);
3994 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003995 }
3996 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003997 PDATA_APPEND(self->stack, value, -1);
3998 rc = 0;
3999 }
4000
4001 Py_DECREF(py_key);
4002 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003}
4004
Tim Peters2d629652003-02-04 05:06:17 +00004005/* Push an object from the extension registry (EXT[124]). nbytes is
4006 * the number of bytes following the opcode, holding the index (code) value.
4007 */
4008static int
4009load_extension(Unpicklerobject *self, int nbytes)
4010{
4011 char *codebytes; /* the nbytes bytes after the opcode */
4012 long code; /* calc_binint returns long */
4013 PyObject *py_code; /* code as a Python int */
4014 PyObject *obj; /* the object to push */
4015 PyObject *pair; /* (module_name, class_name) */
4016 PyObject *module_name, *class_name;
4017
4018 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4019 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4020 code = calc_binint(codebytes, nbytes);
4021 if (code <= 0) { /* note that 0 is forbidden */
4022 /* Corrupt or hostile pickle. */
4023 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4024 return -1;
4025 }
4026
4027 /* Look for the code in the cache. */
4028 py_code = PyInt_FromLong(code);
4029 if (py_code == NULL) return -1;
4030 obj = PyDict_GetItem(extension_cache, py_code);
4031 if (obj != NULL) {
4032 /* Bingo. */
4033 Py_DECREF(py_code);
4034 PDATA_APPEND(self->stack, obj, -1);
4035 return 0;
4036 }
4037
4038 /* Look up the (module_name, class_name) pair. */
4039 pair = PyDict_GetItem(inverted_registry, py_code);
4040 if (pair == NULL) {
4041 Py_DECREF(py_code);
4042 PyErr_Format(PyExc_ValueError, "unregistered extension "
4043 "code %ld", code);
4044 return -1;
4045 }
4046 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004047 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004048 */
4049 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4050 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4051 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4052 Py_DECREF(py_code);
4053 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4054 "isn't a 2-tuple of strings", code);
4055 return -1;
4056 }
4057 /* Load the object. */
4058 obj = find_class(module_name, class_name, self->find_class);
4059 if (obj == NULL) {
4060 Py_DECREF(py_code);
4061 return -1;
4062 }
4063 /* Cache code -> obj. */
4064 code = PyDict_SetItem(extension_cache, py_code, obj);
4065 Py_DECREF(py_code);
4066 if (code < 0) {
4067 Py_DECREF(obj);
4068 return -1;
4069 }
4070 PDATA_PUSH(self->stack, obj, -1);
4071 return 0;
4072}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004073
4074static int
Tim Peterscba30e22003-02-01 06:24:36 +00004075load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004076{
4077 PyObject *py_str = 0, *value = 0;
4078 int len, l;
4079 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004080
Tim Peters0bc93f52003-02-02 18:29:33 +00004081 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 if (l < 2) return bad_readline();
4083 if (!( len=self->stack->length )) return stackUnderflow();
4084 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4085 value=self->stack->data[len-1];
4086 l=PyDict_SetItem(self->memo, py_str, value);
4087 Py_DECREF(py_str);
4088 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089}
4090
4091
4092static int
Tim Peterscba30e22003-02-01 06:24:36 +00004093load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094{
4095 PyObject *py_key = 0, *value = 0;
4096 unsigned char key;
4097 char *s;
4098 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004099
Tim Peters0bc93f52003-02-02 18:29:33 +00004100 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4106 value=self->stack->data[len-1];
4107 len=PyDict_SetItem(self->memo, py_key, value);
4108 Py_DECREF(py_key);
4109 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004110}
4111
4112
4113static int
Tim Peterscba30e22003-02-01 06:24:36 +00004114load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004115{
4116 PyObject *py_key = 0, *value = 0;
4117 long key;
4118 unsigned char c;
4119 char *s;
4120 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004121
Tim Peters0bc93f52003-02-02 18:29:33 +00004122 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004125 c = (unsigned char)s[0];
4126 key = (long)c;
4127 c = (unsigned char)s[1];
4128 key |= (long)c << 8;
4129 c = (unsigned char)s[2];
4130 key |= (long)c << 16;
4131 c = (unsigned char)s[3];
4132 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 if (!( py_key = PyInt_FromLong(key))) return -1;
4135 value=self->stack->data[len-1];
4136 len=PyDict_SetItem(self->memo, py_key, value);
4137 Py_DECREF(py_key);
4138 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004139}
4140
4141
4142static int
Tim Peterscba30e22003-02-01 06:24:36 +00004143do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144{
4145 PyObject *value = 0, *list = 0, *append_method = 0;
4146 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 len=self->stack->length;
4149 if (!( len >= x && x > 0 )) return stackUnderflow();
4150 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004151 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 if (PyList_Check(list)) {
4156 PyObject *slice;
4157 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 slice=Pdata_popList(self->stack, x);
4160 list_len = PyList_GET_SIZE(list);
4161 i=PyList_SetSlice(list, list_len, list_len, slice);
4162 Py_DECREF(slice);
4163 return i;
4164 }
4165 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004166
Tim Peterscba30e22003-02-01 06:24:36 +00004167 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 return -1;
4169
4170 for (i = x; i < len; i++) {
4171 PyObject *junk;
4172
4173 value=self->stack->data[i];
4174 junk=0;
4175 ARG_TUP(self, value);
4176 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004177 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 NULL);
4179 FREE_ARG_TUP(self);
4180 }
4181 if (! junk) {
4182 Pdata_clear(self->stack, i+1);
4183 self->stack->length=x;
4184 Py_DECREF(append_method);
4185 return -1;
4186 }
4187 Py_DECREF(junk);
4188 }
4189 self->stack->length=x;
4190 Py_DECREF(append_method);
4191 }
4192
4193 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004194}
4195
4196
4197static int
Tim Peterscba30e22003-02-01 06:24:36 +00004198load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199{
4200 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004201}
4202
4203
4204static int
Tim Peterscba30e22003-02-01 06:24:36 +00004205load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206{
4207 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208}
4209
4210
4211static int
Tim Peterscba30e22003-02-01 06:24:36 +00004212do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213{
4214 PyObject *value = 0, *key = 0, *dict = 0;
4215 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 if (!( (len=self->stack->length) >= x
4218 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 for (i = x+1; i < len; i += 2) {
4223 key =self->stack->data[i-1];
4224 value=self->stack->data[i ];
4225 if (PyObject_SetItem(dict, key, value) < 0) {
4226 r=-1;
4227 break;
4228 }
4229 }
4230
4231 Pdata_clear(self->stack, x);
4232
4233 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004234}
4235
4236
Tim Peters84e87f32001-03-17 04:50:51 +00004237static int
Tim Peterscba30e22003-02-01 06:24:36 +00004238load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239{
4240 return do_setitems(self, self->stack->length - 2);
4241}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243static int
Tim Peterscba30e22003-02-01 06:24:36 +00004244load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245{
4246 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247}
4248
Tim Peters84e87f32001-03-17 04:50:51 +00004249
Guido van Rossum60456fd1997-04-09 17:36:32 +00004250static int
Tim Peterscba30e22003-02-01 06:24:36 +00004251load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252{
Tim Peters080c88b2003-02-15 03:01:11 +00004253 PyObject *state, *inst, *slotstate;
4254 PyObject *__setstate__;
4255 PyObject *d_key, *d_value;
4256 int i;
4257 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258
Tim Peters080c88b2003-02-15 03:01:11 +00004259 /* Stack is ... instance, state. We want to leave instance at
4260 * the stack top, possibly mutated via instance.__setstate__(state).
4261 */
4262 if (self->stack->length < 2)
4263 return stackUnderflow();
4264 PDATA_POP(self->stack, state);
4265 if (state == NULL)
4266 return -1;
4267 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268
Tim Peters080c88b2003-02-15 03:01:11 +00004269 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4270 if (__setstate__ != NULL) {
4271 PyObject *junk = NULL;
4272
4273 /* The explicit __setstate__ is responsible for everything. */
4274 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 if (self->arg) {
4276 junk = PyObject_Call(__setstate__, self->arg, NULL);
4277 FREE_ARG_TUP(self);
4278 }
4279 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004280 if (junk == NULL)
4281 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 Py_DECREF(junk);
4283 return 0;
4284 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004285 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4286 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004288
4289 /* A default __setstate__. First see whether state embeds a
4290 * slot state dict too (a proto 2 addition).
4291 */
4292 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4293 PyObject *temp = state;
4294 state = PyTuple_GET_ITEM(temp, 0);
4295 slotstate = PyTuple_GET_ITEM(temp, 1);
4296 Py_INCREF(state);
4297 Py_INCREF(slotstate);
4298 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 }
Tim Peters080c88b2003-02-15 03:01:11 +00004300 else
4301 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004302
Tim Peters080c88b2003-02-15 03:01:11 +00004303 /* Set inst.__dict__ from the state dict (if any). */
4304 if (state != Py_None) {
4305 PyObject *dict;
4306 if (! PyDict_Check(state)) {
4307 PyErr_SetString(UnpicklingError, "state is not a "
4308 "dictionary");
4309 goto finally;
4310 }
4311 dict = PyObject_GetAttr(inst, __dict___str);
4312 if (dict == NULL)
4313 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314
Tim Peters080c88b2003-02-15 03:01:11 +00004315 i = 0;
4316 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4317 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4318 goto finally;
4319 }
4320 Py_DECREF(dict);
4321 }
4322
4323 /* Also set instance attributes from the slotstate dict (if any). */
4324 if (slotstate != NULL) {
4325 if (! PyDict_Check(slotstate)) {
4326 PyErr_SetString(UnpicklingError, "slot state is not "
4327 "a dictionary");
4328 goto finally;
4329 }
4330 i = 0;
4331 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4332 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4333 goto finally;
4334 }
4335 }
4336 res = 0;
4337
4338 finally:
4339 Py_DECREF(state);
4340 Py_XDECREF(slotstate);
4341 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342}
4343
4344
4345static int
Tim Peterscba30e22003-02-01 06:24:36 +00004346load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347{
4348 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 /* Note that we split the (pickle.py) stack into two stacks, an
4351 object stack and a mark stack. Here we push a mark onto the
4352 mark stack.
4353 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 if ((self->num_marks + 1) >= self->marks_size) {
4356 s=self->marks_size+20;
4357 if (s <= self->num_marks) s=self->num_marks + 1;
4358 if (self->marks == NULL)
4359 self->marks=(int *)malloc(s * sizeof(int));
4360 else
Tim Peterscba30e22003-02-01 06:24:36 +00004361 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 s * sizeof(int));
4363 if (! self->marks) {
4364 PyErr_NoMemory();
4365 return -1;
4366 }
4367 self->marks_size = s;
4368 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373}
4374
Guido van Rossum60456fd1997-04-09 17:36:32 +00004375static int
Tim Peterscba30e22003-02-01 06:24:36 +00004376load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377{
4378 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 PDATA_POP(self->stack, arg_tup);
4381 if (! arg_tup) return -1;
4382 PDATA_POP(self->stack, callable);
4383 if (callable) {
4384 ob = Instance_New(callable, arg_tup);
4385 Py_DECREF(callable);
4386 }
4387 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 PDATA_PUSH(self->stack, ob, -1);
4392 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004393}
Tim Peters84e87f32001-03-17 04:50:51 +00004394
Tim Peters4190fb82003-02-02 16:09:05 +00004395/* Just raises an error if we don't know the protocol specified. PROTO
4396 * is the first opcode for protocols >= 2.
4397 */
4398static int
4399load_proto(Unpicklerobject *self)
4400{
4401 int i;
4402 char *protobyte;
4403
4404 i = self->read_func(self, &protobyte, 1);
4405 if (i < 0)
4406 return -1;
4407
4408 i = calc_binint(protobyte, 1);
4409 /* No point checking for < 0, since calc_binint returns an unsigned
4410 * int when chewing on 1 byte.
4411 */
4412 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004413 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004414 return 0;
4415
4416 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4417 return -1;
4418}
4419
Guido van Rossum60456fd1997-04-09 17:36:32 +00004420static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004421load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422{
4423 PyObject *err = 0, *val = 0;
4424 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426 self->num_marks = 0;
4427 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004430 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 switch (s[0]) {
4434 case NONE:
4435 if (load_none(self) < 0)
4436 break;
4437 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 case BININT:
4440 if (load_binint(self) < 0)
4441 break;
4442 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 case BININT1:
4445 if (load_binint1(self) < 0)
4446 break;
4447 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449 case BININT2:
4450 if (load_binint2(self) < 0)
4451 break;
4452 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 case INT:
4455 if (load_int(self) < 0)
4456 break;
4457 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 case LONG:
4460 if (load_long(self) < 0)
4461 break;
4462 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004463
Tim Petersee1a53c2003-02-02 02:57:53 +00004464 case LONG1:
4465 if (load_counted_long(self, 1) < 0)
4466 break;
4467 continue;
4468
4469 case LONG4:
4470 if (load_counted_long(self, 4) < 0)
4471 break;
4472 continue;
4473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 case FLOAT:
4475 if (load_float(self) < 0)
4476 break;
4477 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case BINFLOAT:
4480 if (load_binfloat(self) < 0)
4481 break;
4482 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 case BINSTRING:
4485 if (load_binstring(self) < 0)
4486 break;
4487 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 case SHORT_BINSTRING:
4490 if (load_short_binstring(self) < 0)
4491 break;
4492 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 case STRING:
4495 if (load_string(self) < 0)
4496 break;
4497 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004499#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 case UNICODE:
4501 if (load_unicode(self) < 0)
4502 break;
4503 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 case BINUNICODE:
4506 if (load_binunicode(self) < 0)
4507 break;
4508 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004509#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004512 if (load_counted_tuple(self, 0) < 0)
4513 break;
4514 continue;
4515
4516 case TUPLE1:
4517 if (load_counted_tuple(self, 1) < 0)
4518 break;
4519 continue;
4520
4521 case TUPLE2:
4522 if (load_counted_tuple(self, 2) < 0)
4523 break;
4524 continue;
4525
4526 case TUPLE3:
4527 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 break;
4529 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 case TUPLE:
4532 if (load_tuple(self) < 0)
4533 break;
4534 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 case EMPTY_LIST:
4537 if (load_empty_list(self) < 0)
4538 break;
4539 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 case LIST:
4542 if (load_list(self) < 0)
4543 break;
4544 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546 case EMPTY_DICT:
4547 if (load_empty_dict(self) < 0)
4548 break;
4549 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 case DICT:
4552 if (load_dict(self) < 0)
4553 break;
4554 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 case OBJ:
4557 if (load_obj(self) < 0)
4558 break;
4559 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 case INST:
4562 if (load_inst(self) < 0)
4563 break;
4564 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Tim Peterseab7db32003-02-13 18:24:14 +00004566 case NEWOBJ:
4567 if (load_newobj(self) < 0)
4568 break;
4569 continue;
4570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 case GLOBAL:
4572 if (load_global(self) < 0)
4573 break;
4574 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 case APPEND:
4577 if (load_append(self) < 0)
4578 break;
4579 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 case APPENDS:
4582 if (load_appends(self) < 0)
4583 break;
4584 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 case BUILD:
4587 if (load_build(self) < 0)
4588 break;
4589 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 case DUP:
4592 if (load_dup(self) < 0)
4593 break;
4594 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 case BINGET:
4597 if (load_binget(self) < 0)
4598 break;
4599 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 case LONG_BINGET:
4602 if (load_long_binget(self) < 0)
4603 break;
4604 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 case GET:
4607 if (load_get(self) < 0)
4608 break;
4609 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004610
Tim Peters2d629652003-02-04 05:06:17 +00004611 case EXT1:
4612 if (load_extension(self, 1) < 0)
4613 break;
4614 continue;
4615
4616 case EXT2:
4617 if (load_extension(self, 2) < 0)
4618 break;
4619 continue;
4620
4621 case EXT4:
4622 if (load_extension(self, 4) < 0)
4623 break;
4624 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004625 case MARK:
4626 if (load_mark(self) < 0)
4627 break;
4628 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630 case BINPUT:
4631 if (load_binput(self) < 0)
4632 break;
4633 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004635 case LONG_BINPUT:
4636 if (load_long_binput(self) < 0)
4637 break;
4638 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004640 case PUT:
4641 if (load_put(self) < 0)
4642 break;
4643 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004645 case POP:
4646 if (load_pop(self) < 0)
4647 break;
4648 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004650 case POP_MARK:
4651 if (load_pop_mark(self) < 0)
4652 break;
4653 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004655 case SETITEM:
4656 if (load_setitem(self) < 0)
4657 break;
4658 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660 case SETITEMS:
4661 if (load_setitems(self) < 0)
4662 break;
4663 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 case STOP:
4666 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 case PERSID:
4669 if (load_persid(self) < 0)
4670 break;
4671 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 case BINPERSID:
4674 if (load_binpersid(self) < 0)
4675 break;
4676 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678 case REDUCE:
4679 if (load_reduce(self) < 0)
4680 break;
4681 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Tim Peters4190fb82003-02-02 16:09:05 +00004683 case PROTO:
4684 if (load_proto(self) < 0)
4685 break;
4686 continue;
4687
Tim Peters3c67d792003-02-02 17:59:11 +00004688 case NEWTRUE:
4689 if (load_bool(self, Py_True) < 0)
4690 break;
4691 continue;
4692
4693 case NEWFALSE:
4694 if (load_bool(self, Py_False) < 0)
4695 break;
4696 continue;
4697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 case '\0':
4699 /* end of file */
4700 PyErr_SetNone(PyExc_EOFError);
4701 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004704 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 "invalid load key, '%s'.",
4706 "c", s[0]);
4707 return NULL;
4708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 break;
4711 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 if ((err = PyErr_Occurred())) {
4714 if (err == PyExc_EOFError) {
4715 PyErr_SetNone(PyExc_EOFError);
4716 }
4717 return NULL;
4718 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 PDATA_POP(self->stack, val);
4721 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004722}
Tim Peters84e87f32001-03-17 04:50:51 +00004723
Guido van Rossum60456fd1997-04-09 17:36:32 +00004724
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004725/* No-load functions to support noload, which is used to
4726 find persistent references. */
4727
4728static int
Tim Peterscba30e22003-02-01 06:24:36 +00004729noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730{
4731 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004733 if ((i = marker(self)) < 0) return -1;
4734 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004735}
4736
4737
4738static int
Tim Peterscba30e22003-02-01 06:24:36 +00004739noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740{
4741 int i;
4742 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004744 if ((i = marker(self)) < 0) return -1;
4745 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004746 if (self->readline_func(self, &s) < 0) return -1;
4747 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004748 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004750}
4751
4752static int
Tim Peterseab7db32003-02-13 18:24:14 +00004753noload_newobj(Unpicklerobject *self)
4754{
4755 PyObject *obj;
4756
4757 PDATA_POP(self->stack, obj); /* pop argtuple */
4758 if (obj == NULL) return -1;
4759 Py_DECREF(obj);
4760
4761 PDATA_POP(self->stack, obj); /* pop cls */
4762 if (obj == NULL) return -1;
4763 Py_DECREF(obj);
4764
4765 PDATA_APPEND(self->stack, Py_None, -1);
4766 return 0;
4767}
4768
4769static int
Tim Peterscba30e22003-02-01 06:24:36 +00004770noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771{
4772 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004773
Tim Peters0bc93f52003-02-02 18:29:33 +00004774 if (self->readline_func(self, &s) < 0) return -1;
4775 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 PDATA_APPEND(self->stack, Py_None,-1);
4777 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004778}
4779
4780static int
Tim Peterscba30e22003-02-01 06:24:36 +00004781noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 if (self->stack->length < 2) return stackUnderflow();
4785 Pdata_clear(self->stack, self->stack->length-2);
4786 PDATA_APPEND(self->stack, Py_None,-1);
4787 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004788}
4789
4790static int
4791noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004792
Guido van Rossum053b8df1998-11-25 16:18:00 +00004793 if (self->stack->length < 1) return stackUnderflow();
4794 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004795 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004796}
4797
Tim Peters2d629652003-02-04 05:06:17 +00004798static int
4799noload_extension(Unpicklerobject *self, int nbytes)
4800{
4801 char *codebytes;
4802
4803 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4804 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4805 PDATA_APPEND(self->stack, Py_None, -1);
4806 return 0;
4807}
4808
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004809
4810static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004811noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812{
4813 PyObject *err = 0, *val = 0;
4814 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 self->num_marks = 0;
4817 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004820 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004821 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 switch (s[0]) {
4824 case NONE:
4825 if (load_none(self) < 0)
4826 break;
4827 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 case BININT:
4830 if (load_binint(self) < 0)
4831 break;
4832 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case BININT1:
4835 if (load_binint1(self) < 0)
4836 break;
4837 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 case BININT2:
4840 if (load_binint2(self) < 0)
4841 break;
4842 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 case INT:
4845 if (load_int(self) < 0)
4846 break;
4847 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 case LONG:
4850 if (load_long(self) < 0)
4851 break;
4852 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004853
Tim Peters4190fb82003-02-02 16:09:05 +00004854 case LONG1:
4855 if (load_counted_long(self, 1) < 0)
4856 break;
4857 continue;
4858
4859 case LONG4:
4860 if (load_counted_long(self, 4) < 0)
4861 break;
4862 continue;
4863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004864 case FLOAT:
4865 if (load_float(self) < 0)
4866 break;
4867 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869 case BINFLOAT:
4870 if (load_binfloat(self) < 0)
4871 break;
4872 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004874 case BINSTRING:
4875 if (load_binstring(self) < 0)
4876 break;
4877 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 case SHORT_BINSTRING:
4880 if (load_short_binstring(self) < 0)
4881 break;
4882 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 case STRING:
4885 if (load_string(self) < 0)
4886 break;
4887 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004889#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004890 case UNICODE:
4891 if (load_unicode(self) < 0)
4892 break;
4893 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004895 case BINUNICODE:
4896 if (load_binunicode(self) < 0)
4897 break;
4898 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004899#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004901 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004902 if (load_counted_tuple(self, 0) < 0)
4903 break;
4904 continue;
4905
4906 case TUPLE1:
4907 if (load_counted_tuple(self, 1) < 0)
4908 break;
4909 continue;
4910
4911 case TUPLE2:
4912 if (load_counted_tuple(self, 2) < 0)
4913 break;
4914 continue;
4915
4916 case TUPLE3:
4917 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 break;
4919 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921 case TUPLE:
4922 if (load_tuple(self) < 0)
4923 break;
4924 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 case EMPTY_LIST:
4927 if (load_empty_list(self) < 0)
4928 break;
4929 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004931 case LIST:
4932 if (load_list(self) < 0)
4933 break;
4934 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004936 case EMPTY_DICT:
4937 if (load_empty_dict(self) < 0)
4938 break;
4939 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 case DICT:
4942 if (load_dict(self) < 0)
4943 break;
4944 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 case OBJ:
4947 if (noload_obj(self) < 0)
4948 break;
4949 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 case INST:
4952 if (noload_inst(self) < 0)
4953 break;
4954 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004955
Tim Peterseab7db32003-02-13 18:24:14 +00004956 case NEWOBJ:
4957 if (noload_newobj(self) < 0)
4958 break;
4959 continue;
4960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004961 case GLOBAL:
4962 if (noload_global(self) < 0)
4963 break;
4964 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 case APPEND:
4967 if (load_append(self) < 0)
4968 break;
4969 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971 case APPENDS:
4972 if (load_appends(self) < 0)
4973 break;
4974 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 case BUILD:
4977 if (noload_build(self) < 0)
4978 break;
4979 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 case DUP:
4982 if (load_dup(self) < 0)
4983 break;
4984 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 case BINGET:
4987 if (load_binget(self) < 0)
4988 break;
4989 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004991 case LONG_BINGET:
4992 if (load_long_binget(self) < 0)
4993 break;
4994 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 case GET:
4997 if (load_get(self) < 0)
4998 break;
4999 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005000
Tim Peters2d629652003-02-04 05:06:17 +00005001 case EXT1:
5002 if (noload_extension(self, 1) < 0)
5003 break;
5004 continue;
5005
5006 case EXT2:
5007 if (noload_extension(self, 2) < 0)
5008 break;
5009 continue;
5010
5011 case EXT4:
5012 if (noload_extension(self, 4) < 0)
5013 break;
5014 continue;
5015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 case MARK:
5017 if (load_mark(self) < 0)
5018 break;
5019 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 case BINPUT:
5022 if (load_binput(self) < 0)
5023 break;
5024 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 case LONG_BINPUT:
5027 if (load_long_binput(self) < 0)
5028 break;
5029 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 case PUT:
5032 if (load_put(self) < 0)
5033 break;
5034 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 case POP:
5037 if (load_pop(self) < 0)
5038 break;
5039 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005041 case POP_MARK:
5042 if (load_pop_mark(self) < 0)
5043 break;
5044 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005046 case SETITEM:
5047 if (load_setitem(self) < 0)
5048 break;
5049 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005051 case SETITEMS:
5052 if (load_setitems(self) < 0)
5053 break;
5054 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 case STOP:
5057 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 case PERSID:
5060 if (load_persid(self) < 0)
5061 break;
5062 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 case BINPERSID:
5065 if (load_binpersid(self) < 0)
5066 break;
5067 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005069 case REDUCE:
5070 if (noload_reduce(self) < 0)
5071 break;
5072 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005073
Tim Peters4190fb82003-02-02 16:09:05 +00005074 case PROTO:
5075 if (load_proto(self) < 0)
5076 break;
5077 continue;
5078
Tim Peters3c67d792003-02-02 17:59:11 +00005079 case NEWTRUE:
5080 if (load_bool(self, Py_True) < 0)
5081 break;
5082 continue;
5083
5084 case NEWFALSE:
5085 if (load_bool(self, Py_False) < 0)
5086 break;
5087 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005088 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005089 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005090 "invalid load key, '%s'.",
5091 "c", s[0]);
5092 return NULL;
5093 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 break;
5096 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005098 if ((err = PyErr_Occurred())) {
5099 if (err == PyExc_EOFError) {
5100 PyErr_SetNone(PyExc_EOFError);
5101 }
5102 return NULL;
5103 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005105 PDATA_POP(self->stack, val);
5106 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005107}
Tim Peters84e87f32001-03-17 04:50:51 +00005108
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005109
Guido van Rossum60456fd1997-04-09 17:36:32 +00005110static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005111Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112{
Tim Peterscba30e22003-02-01 06:24:36 +00005113 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005114 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005116 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005117}
5118
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005119static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005120Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121{
Tim Peterscba30e22003-02-01 06:24:36 +00005122 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005123 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005126}
5127
Guido van Rossum60456fd1997-04-09 17:36:32 +00005128
5129static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005130 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005131 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005132 },
Neal Norwitzb0493252002-03-31 14:44:22 +00005133 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005134 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005135 "noload() -- not load a pickle, but go through most of the motions\n"
5136 "\n"
5137 "This function can be used to read past a pickle without instantiating\n"
5138 "any objects or importing any modules. It can also be used to find all\n"
5139 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005140 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005141 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005142 {NULL, NULL} /* sentinel */
5143};
5144
5145
5146static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005147newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148{
5149 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005150
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005151 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154 self->file = NULL;
5155 self->arg = NULL;
5156 self->stack = (Pdata*)Pdata_New();
5157 self->pers_func = NULL;
5158 self->last_string = NULL;
5159 self->marks = NULL;
5160 self->num_marks = 0;
5161 self->marks_size = 0;
5162 self->buf_size = 0;
5163 self->read = NULL;
5164 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005165 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005166
Tim Peterscba30e22003-02-01 06:24:36 +00005167 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005170 Py_INCREF(f);
5171 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005173 /* Set read, readline based on type of f */
5174 if (PyFile_Check(f)) {
5175 self->fp = PyFile_AsFile(f);
5176 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005177 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005178 "I/O operation on closed file");
5179 goto err;
5180 }
5181 self->read_func = read_file;
5182 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005183 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184 else if (PycStringIO_InputCheck(f)) {
5185 self->fp = NULL;
5186 self->read_func = read_cStringIO;
5187 self->readline_func = readline_cStringIO;
5188 }
5189 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005191 self->fp = NULL;
5192 self->read_func = read_other;
5193 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5196 (self->read = PyObject_GetAttr(f, read_str)))) {
5197 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005198 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005199 "argument must have 'read' and "
5200 "'readline' attributes" );
5201 goto err;
5202 }
5203 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005204 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005206 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 err:
5209 Py_DECREF((PyObject *)self);
5210 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005211}
5212
5213
5214static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005215get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005216{
5217 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00005218
Tim Peterscba30e22003-02-01 06:24:36 +00005219 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005220 return NULL;
5221 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005222}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005223
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005224
Guido van Rossum60456fd1997-04-09 17:36:32 +00005225static void
Tim Peterscba30e22003-02-01 06:24:36 +00005226Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005227{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005228 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005229 Py_XDECREF(self->readline);
5230 Py_XDECREF(self->read);
5231 Py_XDECREF(self->file);
5232 Py_XDECREF(self->memo);
5233 Py_XDECREF(self->stack);
5234 Py_XDECREF(self->pers_func);
5235 Py_XDECREF(self->arg);
5236 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005237 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 if (self->marks) {
5240 free(self->marks);
5241 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005243 if (self->buf_size) {
5244 free(self->buf);
5245 }
Tim Peters84e87f32001-03-17 04:50:51 +00005246
Tim Peters3cfe7542003-05-21 21:29:48 +00005247 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005248}
5249
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005250static int
5251Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5252{
5253 int err;
5254
5255#define VISIT(SLOT) \
5256 if (SLOT) { \
5257 err = visit((PyObject *)(SLOT), arg); \
5258 if (err) \
5259 return err; \
5260 }
5261 VISIT(self->readline);
5262 VISIT(self->read);
5263 VISIT(self->file);
5264 VISIT(self->memo);
5265 VISIT(self->stack);
5266 VISIT(self->pers_func);
5267 VISIT(self->arg);
5268 VISIT(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005269 VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005270#undef VISIT
5271 return 0;
5272}
5273
5274static int
5275Unpickler_clear(Unpicklerobject *self)
5276{
5277#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL
5278 CLEAR(self->readline);
5279 CLEAR(self->read);
5280 CLEAR(self->file);
5281 CLEAR(self->memo);
5282 CLEAR(self->stack);
5283 CLEAR(self->pers_func);
5284 CLEAR(self->arg);
5285 CLEAR(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005286 CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005287#undef CLEAR
5288 return 0;
5289}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005290
5291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005292Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005293{
5294 if (!strcmp(name, "persistent_load")) {
5295 if (!self->pers_func) {
5296 PyErr_SetString(PyExc_AttributeError, name);
5297 return NULL;
5298 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005300 Py_INCREF(self->pers_func);
5301 return self->pers_func;
5302 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005304 if (!strcmp(name, "find_global")) {
5305 if (!self->find_class) {
5306 PyErr_SetString(PyExc_AttributeError, name);
5307 return NULL;
5308 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005310 Py_INCREF(self->find_class);
5311 return self->find_class;
5312 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005314 if (!strcmp(name, "memo")) {
5315 if (!self->memo) {
5316 PyErr_SetString(PyExc_AttributeError, name);
5317 return NULL;
5318 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005320 Py_INCREF(self->memo);
5321 return self->memo;
5322 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005324 if (!strcmp(name, "UnpicklingError")) {
5325 Py_INCREF(UnpicklingError);
5326 return UnpicklingError;
5327 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005330}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005331
Guido van Rossum60456fd1997-04-09 17:36:32 +00005332
5333static int
Tim Peterscba30e22003-02-01 06:24:36 +00005334Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005337 if (!strcmp(name, "persistent_load")) {
5338 Py_XDECREF(self->pers_func);
5339 self->pers_func = value;
5340 Py_XINCREF(value);
5341 return 0;
5342 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005344 if (!strcmp(name, "find_global")) {
5345 Py_XDECREF(self->find_class);
5346 self->find_class = value;
5347 Py_XINCREF(value);
5348 return 0;
5349 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 if (! value) {
5352 PyErr_SetString(PyExc_TypeError,
5353 "attribute deletion is not supported");
5354 return -1;
5355 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005357 if (strcmp(name, "memo") == 0) {
5358 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005359 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005360 "memo must be a dictionary");
5361 return -1;
5362 }
5363 Py_XDECREF(self->memo);
5364 self->memo = value;
5365 Py_INCREF(value);
5366 return 0;
5367 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005369 PyErr_SetString(PyExc_AttributeError, name);
5370 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005371}
5372
Tim Peters5bd2a792003-02-01 16:45:06 +00005373/* ---------------------------------------------------------------------------
5374 * Module-level functions.
5375 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005376
Martin v. Löwis544f1192004-07-27 05:22:33 +00005377/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005378static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005379cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005380{
Martin v. Löwis544f1192004-07-27 05:22:33 +00005381 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005382 PyObject *ob, *file, *res = NULL;
5383 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005384 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005385
Martin v. Löwis544f1192004-07-27 05:22:33 +00005386 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5387 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005388 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005389
Tim Peters5bd2a792003-02-01 16:45:06 +00005390 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005393 if (dump(pickler, ob) < 0)
5394 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396 Py_INCREF(Py_None);
5397 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005399 finally:
5400 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005403}
5404
5405
Martin v. Löwis544f1192004-07-27 05:22:33 +00005406/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005408cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005409{
Martin v. Löwis544f1192004-07-27 05:22:33 +00005410 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005411 PyObject *ob, *file = 0, *res = NULL;
5412 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005413 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005414
Martin v. Löwis544f1192004-07-27 05:22:33 +00005415 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5416 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005418
Tim Peterscba30e22003-02-01 06:24:36 +00005419 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005420 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005421
Tim Peters5bd2a792003-02-01 16:45:06 +00005422 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005423 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005425 if (dump(pickler, ob) < 0)
5426 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005430 finally:
5431 Py_XDECREF(pickler);
5432 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005434 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005435}
5436
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005437
Tim Peters5bd2a792003-02-01 16:45:06 +00005438/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005439static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005440cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005441{
5442 Unpicklerobject *unpickler = 0;
5443 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005444
Tim Peterscba30e22003-02-01 06:24:36 +00005445 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005447
Tim Peterscba30e22003-02-01 06:24:36 +00005448 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005449 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005453 finally:
5454 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005457}
5458
5459
Tim Peters5bd2a792003-02-01 16:45:06 +00005460/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005461static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005462cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463{
5464 PyObject *ob, *file = 0, *res = NULL;
5465 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005466
Tim Peterscba30e22003-02-01 06:24:36 +00005467 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005469
Tim Peterscba30e22003-02-01 06:24:36 +00005470 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005471 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005472
Tim Peterscba30e22003-02-01 06:24:36 +00005473 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005474 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005478 finally:
5479 Py_XDECREF(file);
5480 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005482 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005483}
5484
5485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005486PyDoc_STRVAR(Unpicklertype__doc__,
5487"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005488
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005489static PyTypeObject Unpicklertype = {
5490 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005491 0, /*ob_size*/
5492 "cPickle.Unpickler", /*tp_name*/
5493 sizeof(Unpicklerobject), /*tp_basicsize*/
5494 0,
5495 (destructor)Unpickler_dealloc, /* tp_dealloc */
5496 0, /* tp_print */
5497 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5498 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5499 0, /* tp_compare */
5500 0, /* tp_repr */
5501 0, /* tp_as_number */
5502 0, /* tp_as_sequence */
5503 0, /* tp_as_mapping */
5504 0, /* tp_hash */
5505 0, /* tp_call */
5506 0, /* tp_str */
5507 0, /* tp_getattro */
5508 0, /* tp_setattro */
5509 0, /* tp_as_buffer */
5510 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5511 Unpicklertype__doc__, /* tp_doc */
5512 (traverseproc)Unpickler_traverse, /* tp_traverse */
5513 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005514};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005515
Guido van Rossum60456fd1997-04-09 17:36:32 +00005516static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005517 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5518 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005519 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005520 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005521 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005522 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005523
Martin v. Löwis544f1192004-07-27 05:22:33 +00005524 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5525 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005526 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005527 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005528 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005529 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005530
Neal Norwitzb0493252002-03-31 14:44:22 +00005531 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005532 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005533
Neal Norwitzb0493252002-03-31 14:44:22 +00005534 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005535 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005536
Martin v. Löwis544f1192004-07-27 05:22:33 +00005537 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5538 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005539 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005540 "This takes a file-like object for writing a pickle data stream.\n"
5541 "The optional proto argument tells the pickler to use the given\n"
5542 "protocol; supported protocols are 0, 1, 2. The default\n"
5543 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5544 "only protocol that can be written to a file opened in text\n"
5545 "mode and read back successfully. When using a protocol higher\n"
5546 "than 0, make sure the file is opened in binary mode, both when\n"
5547 "pickling and unpickling.)\n"
5548 "\n"
5549 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5550 "more efficient than protocol 1.\n"
5551 "\n"
5552 "Specifying a negative protocol version selects the highest\n"
5553 "protocol version supported. The higher the protocol used, the\n"
5554 "more recent the version of Python needed to read the pickle\n"
5555 "produced.\n"
5556 "\n"
5557 "The file parameter must have a write() method that accepts a single\n"
5558 "string argument. It can thus be an open file object, a StringIO\n"
5559 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005560 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005561
Neal Norwitzb0493252002-03-31 14:44:22 +00005562 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005563 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5564
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005565 { NULL, NULL }
5566};
5567
Guido van Rossum60456fd1997-04-09 17:36:32 +00005568static int
Tim Peterscba30e22003-02-01 06:24:36 +00005569init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005570{
5571 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005572
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005573#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005574
Tim Peters3cfe7542003-05-21 21:29:48 +00005575 if (PyType_Ready(&Unpicklertype) < 0)
5576 return -1;
5577 if (PyType_Ready(&Picklertype) < 0)
5578 return -1;
5579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005580 INIT_STR(__class__);
5581 INIT_STR(__getinitargs__);
5582 INIT_STR(__dict__);
5583 INIT_STR(__getstate__);
5584 INIT_STR(__setstate__);
5585 INIT_STR(__name__);
5586 INIT_STR(__main__);
5587 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005588 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005589 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005590 INIT_STR(append);
5591 INIT_STR(read);
5592 INIT_STR(readline);
5593 INIT_STR(copy_reg);
5594 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005595 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005596
Tim Peterscba30e22003-02-01 06:24:36 +00005597 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005598 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005599
Tim Peters1f1b2d22003-02-01 02:16:37 +00005600 /* This is special because we want to use a different
5601 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005602 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005603 if (!dispatch_table) return -1;
5604
5605 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005606 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005607 if (!extension_registry) return -1;
5608
5609 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005610 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005611 if (!inverted_registry) return -1;
5612
5613 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005614 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005615 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005617 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005618
Tim Peters731098b2003-02-04 20:56:09 +00005619 if (!(empty_tuple = PyTuple_New(0)))
5620 return -1;
5621
5622 two_tuple = PyTuple_New(2);
5623 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005624 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005625 /* We use this temp container with no regard to refcounts, or to
5626 * keeping containees alive. Exempt from GC, because we don't
5627 * want anything looking at two_tuple() by magic.
5628 */
5629 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005631 /* Ugh */
5632 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5633 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5634 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005636 if (!( t=PyDict_New())) return -1;
5637 if (!( r=PyRun_String(
5638 "def __init__(self, *args): self.args=args\n\n"
5639 "def __str__(self):\n"
5640 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5641 Py_file_input,
5642 module_dict, t) )) return -1;
5643 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005645 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005646 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005647 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005649 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005650
Tim Peterscba30e22003-02-01 06:24:36 +00005651 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005652 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005653 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005654 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005656 if (!( t=PyDict_New())) return -1;
5657 if (!( r=PyRun_String(
5658 "def __init__(self, *args): self.args=args\n\n"
5659 "def __str__(self):\n"
5660 " a=self.args\n"
5661 " a=a and type(a[0]) or '(what)'\n"
5662 " return 'Cannot pickle %s objects' % a\n"
5663 , Py_file_input,
5664 module_dict, t) )) return -1;
5665 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005667 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005668 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005669 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005671 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005673 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005674 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005675 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005676
Martin v. Löwis658009a2002-09-16 17:26:24 +00005677 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5678 UnpicklingError, NULL)))
5679 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005681 if (PyDict_SetItemString(module_dict, "PickleError",
5682 PickleError) < 0)
5683 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005685 if (PyDict_SetItemString(module_dict, "PicklingError",
5686 PicklingError) < 0)
5687 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005689 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5690 UnpicklingError) < 0)
5691 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005693 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5694 UnpickleableError) < 0)
5695 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005697 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5698 BadPickleGet) < 0)
5699 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005701 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005703 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005704}
5705
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005706#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5707#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005708#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005709PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005710initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005711{
5712 PyObject *m, *d, *di, *v, *k;
5713 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005714 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005715 PyObject *format_version;
5716 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005718 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005719 Unpicklertype.ob_type = &PyType_Type;
5720 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005722 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005723 * so we're forced to use a temporary dictionary. :(
5724 */
5725 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005726 if (!di) return;
5727 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005729 /* Create the module and add the functions */
5730 m = Py_InitModule4("cPickle", cPickle_methods,
5731 cPickle_module_documentation,
5732 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005734 /* Add some symbolic constants to the module */
5735 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005736 v = PyString_FromString(rev);
5737 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005738 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005740 /* Copy data from di. Waaa. */
5741 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5742 if (PyObject_SetItem(d, k, v) < 0) {
5743 Py_DECREF(di);
5744 return;
5745 }
5746 }
5747 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005748
Tim Peters8587b3c2003-02-13 15:44:41 +00005749 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5750 if (i < 0)
5751 return;
5752
Tim Peters5b7da392003-02-04 00:21:07 +00005753 /* These are purely informational; no code uses them. */
5754 /* File format version we write. */
5755 format_version = PyString_FromString("2.0");
5756 /* Format versions we can read. */
5757 compatible_formats = Py_BuildValue("[sssss]",
5758 "1.0", /* Original protocol 0 */
5759 "1.1", /* Protocol 0 + INST */
5760 "1.2", /* Original protocol 1 */
5761 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005762 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005763 PyDict_SetItemString(d, "format_version", format_version);
5764 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5765 Py_XDECREF(format_version);
5766 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005767}