blob: dc987728f78a2f619be6ff44ec5d8b56a9ac5966 [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
Tim Peters71fcda52003-02-14 23:05:28 +00002146 if (state == Py_None)
2147 state = NULL;
2148 if (listitems == Py_None)
2149 listitems = NULL;
2150 if (dictitems == Py_None)
2151 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002152
Tim Peters71fcda52003-02-14 23:05:28 +00002153 /* Protocol 2 special case: if callable's name is __newobj__, use
2154 * NEWOBJ. This consumes a lot of code.
2155 */
2156 if (use_newobj) {
2157 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002158
Tim Peters71fcda52003-02-14 23:05:28 +00002159 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002160 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2161 PyErr_Clear();
2162 else
2163 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002164 use_newobj = 0;
2165 }
2166 else {
2167 use_newobj = PyString_Check(temp) &&
2168 strcmp(PyString_AS_STRING(temp),
2169 "__newobj__") == 0;
2170 Py_DECREF(temp);
2171 }
2172 }
2173 if (use_newobj) {
2174 PyObject *cls;
2175 PyObject *newargtup;
2176 int n, i;
2177
2178 /* Sanity checks. */
2179 n = PyTuple_Size(argtup);
2180 if (n < 1) {
2181 PyErr_SetString(PicklingError, "__newobj__ arglist "
2182 "is empty");
2183 return -1;
2184 }
2185
2186 cls = PyTuple_GET_ITEM(argtup, 0);
2187 if (! PyObject_HasAttrString(cls, "__new__")) {
2188 PyErr_SetString(PicklingError, "args[0] from "
2189 "__newobj__ args has no __new__");
2190 return -1;
2191 }
2192
2193 /* XXX How could ob be NULL? */
2194 if (ob != NULL) {
2195 PyObject *ob_dot_class;
2196
2197 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002198 if (ob_dot_class == NULL) {
2199 if (PyErr_ExceptionMatches(
2200 PyExc_AttributeError))
2201 PyErr_Clear();
2202 else
2203 return -1;
2204 }
Tim Peters71fcda52003-02-14 23:05:28 +00002205 i = ob_dot_class != cls; /* true iff a problem */
2206 Py_XDECREF(ob_dot_class);
2207 if (i) {
2208 PyErr_SetString(PicklingError, "args[0] from "
2209 "__newobj__ args has the wrong class");
2210 return -1;
2211 }
2212 }
2213
2214 /* Save the class and its __new__ arguments. */
2215 if (save(self, cls, 0) < 0)
2216 return -1;
2217
2218 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2219 if (newargtup == NULL)
2220 return -1;
2221 for (i = 1; i < n; ++i) {
2222 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2223 Py_INCREF(temp);
2224 PyTuple_SET_ITEM(newargtup, i-1, temp);
2225 }
2226 i = save(self, newargtup, 0) < 0;
2227 Py_DECREF(newargtup);
2228 if (i < 0)
2229 return -1;
2230
2231 /* Add NEWOBJ opcode. */
2232 if (self->write_func(self, &newobj, 1) < 0)
2233 return -1;
2234 }
2235 else {
2236 /* Not using NEWOBJ. */
2237 if (save(self, callable, 0) < 0 ||
2238 save(self, argtup, 0) < 0 ||
2239 self->write_func(self, &reduce, 1) < 0)
2240 return -1;
2241 }
2242
2243 /* Memoize. */
2244 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 if (ob != NULL) {
2246 if (state && !PyDict_Check(state)) {
2247 if (put2(self, ob) < 0)
2248 return -1;
2249 }
Tim Peters71fcda52003-02-14 23:05:28 +00002250 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002252 }
Tim Peters84e87f32001-03-17 04:50:51 +00002253
Guido van Rossum60456fd1997-04-09 17:36:32 +00002254
Tim Peters71fcda52003-02-14 23:05:28 +00002255 if (listitems && batch_list(self, listitems) < 0)
2256 return -1;
2257
2258 if (dictitems && batch_dict(self, dictitems) < 0)
2259 return -1;
2260
2261 if (state) {
2262 if (save(self, state, 0) < 0 ||
2263 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002264 return -1;
2265 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002268}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002269
Guido van Rossum60456fd1997-04-09 17:36:32 +00002270static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002271save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002272{
2273 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002274 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2275 PyObject *arg_tup;
2276 int res = -1;
2277 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002278
Martin v. Löwis5a395302002-08-04 08:20:23 +00002279 if (self->nesting++ > Py_GetRecursionLimit()){
2280 PyErr_SetString(PyExc_RuntimeError,
2281 "maximum recursion depth exceeded");
2282 goto finally;
2283 }
2284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002285 if (!pers_save && self->pers_func) {
2286 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2287 res = tmp;
2288 goto finally;
2289 }
2290 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002292 if (args == Py_None) {
2293 res = save_none(self, args);
2294 goto finally;
2295 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002300 case 'b':
2301 if (args == Py_False || args == Py_True) {
2302 res = save_bool(self, args);
2303 goto finally;
2304 }
2305 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 if (type == &PyInt_Type) {
2308 res = save_int(self, args);
2309 goto finally;
2310 }
2311 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002312
Guido van Rossum60456fd1997-04-09 17:36:32 +00002313 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if (type == &PyLong_Type) {
2315 res = save_long(self, args);
2316 goto finally;
2317 }
2318 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002319
Guido van Rossum60456fd1997-04-09 17:36:32 +00002320 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321 if (type == &PyFloat_Type) {
2322 res = save_float(self, args);
2323 goto finally;
2324 }
2325 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002326
Guido van Rossum60456fd1997-04-09 17:36:32 +00002327 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002328 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2329 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 goto finally;
2331 }
2332 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002333
Guido van Rossum60456fd1997-04-09 17:36:32 +00002334 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2336 res = save_string(self, args, 0);
2337 goto finally;
2338 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002339
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002340#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002341 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2343 res = save_unicode(self, args, 0);
2344 goto finally;
2345 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002346#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002347 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002350 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002351 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353 if (PyDict_GetItem(self->memo, py_ob_id)) {
2354 if (get(self, py_ob_id) < 0)
2355 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357 res = 0;
2358 goto finally;
2359 }
2360 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002362 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002363 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 if (type == &PyString_Type) {
2365 res = save_string(self, args, 1);
2366 goto finally;
2367 }
2368 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002369
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002370#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002371 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 if (type == &PyUnicode_Type) {
2373 res = save_unicode(self, args, 1);
2374 goto finally;
2375 }
2376 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002377#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002378
Guido van Rossum60456fd1997-04-09 17:36:32 +00002379 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 if (type == &PyTuple_Type) {
2381 res = save_tuple(self, args);
2382 goto finally;
2383 }
2384 if (type == &PyType_Type) {
2385 res = save_global(self, args, NULL);
2386 goto finally;
2387 }
2388 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002389
Guido van Rossum60456fd1997-04-09 17:36:32 +00002390 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 if (type == &PyList_Type) {
2392 res = save_list(self, args);
2393 goto finally;
2394 }
2395 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002396
2397 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 if (type == &PyDict_Type) {
2399 res = save_dict(self, args);
2400 goto finally;
2401 }
2402 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002403
2404 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 if (type == &PyInstance_Type) {
2406 res = save_inst(self, args);
2407 goto finally;
2408 }
2409 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002410
2411 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002412 if (type == &PyClass_Type) {
2413 res = save_global(self, args, NULL);
2414 goto finally;
2415 }
2416 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002417
2418 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 if (type == &PyFunction_Type) {
2420 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002421 if (res && PyErr_ExceptionMatches(PickleError)) {
2422 /* fall back to reduce */
2423 PyErr_Clear();
2424 break;
2425 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002426 goto finally;
2427 }
2428 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002429
2430 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 if (type == &PyCFunction_Type) {
2432 res = save_global(self, args, NULL);
2433 goto finally;
2434 }
2435 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 if (!pers_save && self->inst_pers_func) {
2438 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2439 res = tmp;
2440 goto finally;
2441 }
2442 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002443
Jeremy Hylton39c61162002-07-16 19:47:43 +00002444 if (PyType_IsSubtype(type, &PyType_Type)) {
2445 res = save_global(self, args, NULL);
2446 goto finally;
2447 }
2448
Guido van Rossumb289b872003-02-19 01:45:13 +00002449 /* Get a reduction callable, and call it. This may come from
2450 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2451 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002452 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002453 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2454 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002455 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002456 Py_INCREF(args);
2457 ARG_TUP(self, args);
2458 if (self->arg) {
2459 t = PyObject_Call(__reduce__, self->arg, NULL);
2460 FREE_ARG_TUP(self);
2461 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002462 }
2463 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002464 /* Check for a __reduce_ex__ method. */
2465 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2466 if (__reduce__ != NULL) {
2467 t = PyInt_FromLong(self->proto);
2468 if (t != NULL) {
2469 ARG_TUP(self, t);
2470 t = NULL;
2471 if (self->arg) {
2472 t = PyObject_Call(__reduce__,
2473 self->arg, NULL);
2474 FREE_ARG_TUP(self);
2475 }
2476 }
2477 }
2478 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002479 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2480 PyErr_Clear();
2481 else
2482 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002483 /* Check for a __reduce__ method. */
2484 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2485 if (__reduce__ != NULL) {
2486 t = PyObject_Call(__reduce__,
2487 empty_tuple, NULL);
2488 }
2489 else {
2490 PyErr_SetObject(UnpickleableError, args);
2491 goto finally;
2492 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002495
Tim Peters71fcda52003-02-14 23:05:28 +00002496 if (t == NULL)
2497 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002498
Tim Peters71fcda52003-02-14 23:05:28 +00002499 if (PyString_Check(t)) {
2500 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501 goto finally;
2502 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002503
Tim Peters71fcda52003-02-14 23:05:28 +00002504 if (! PyTuple_Check(t)) {
2505 cPickle_ErrFormat(PicklingError, "Value returned by "
2506 "%s must be string or tuple",
2507 "O", __reduce__);
2508 goto finally;
2509 }
2510
2511 size = PyTuple_Size(t);
2512 if (size < 2 || size > 5) {
2513 cPickle_ErrFormat(PicklingError, "tuple returned by "
2514 "%s must contain 2 through 5 elements",
2515 "O", __reduce__);
2516 goto finally;
2517 }
2518
2519 arg_tup = PyTuple_GET_ITEM(t, 1);
2520 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2521 cPickle_ErrFormat(PicklingError, "Second element of "
2522 "tuple returned by %s must be a tuple",
2523 "O", __reduce__);
2524 goto finally;
2525 }
2526
2527 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002530 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002531 Py_XDECREF(py_ob_id);
2532 Py_XDECREF(__reduce__);
2533 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002535 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002536}
2537
2538
2539static int
Tim Peterscba30e22003-02-01 06:24:36 +00002540dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002541{
2542 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002543
Tim Peters4190fb82003-02-02 16:09:05 +00002544 if (self->proto >= 2) {
2545 char bytes[2];
2546
2547 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002548 assert(self->proto >= 0 && self->proto < 256);
2549 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002550 if (self->write_func(self, bytes, 2) < 0)
2551 return -1;
2552 }
2553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002554 if (save(self, args, 0) < 0)
2555 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002556
Tim Peters4190fb82003-02-02 16:09:05 +00002557 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002559
Tim Peters4190fb82003-02-02 16:09:05 +00002560 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002564}
2565
2566static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002567Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002568{
Tim Peterscba30e22003-02-01 06:24:36 +00002569 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570 PyDict_Clear(self->memo);
2571 Py_INCREF(Py_None);
2572 return Py_None;
2573}
2574
2575static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002576Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002577{
2578 int l, i, rsize, ssize, clear=1, lm;
2579 long ik;
2580 PyObject *k, *r;
2581 char *s, *p, *have_get;
2582 Pdata *data;
2583
2584 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002585 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002586 return NULL;
2587
2588 /* Check to make sure we are based on a list */
2589 if (! Pdata_Check(self->file)) {
2590 PyErr_SetString(PicklingError,
2591 "Attempt to getvalue() a non-list-based pickler");
2592 return NULL;
2593 }
2594
2595 /* flush write buffer */
2596 if (write_other(self, NULL, 0) < 0) return NULL;
2597
2598 data=(Pdata*)self->file;
2599 l=data->length;
2600
2601 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002602 lm = PyDict_Size(self->memo);
2603 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002605 have_get = malloc(lm);
2606 if (have_get == NULL) return PyErr_NoMemory();
2607 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608
2609 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002610 for (rsize = 0, i = l; --i >= 0; ) {
2611 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612
Tim Petersac5687a2003-02-02 18:08:34 +00002613 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002615
2616 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002617 ik = PyInt_AS_LONG((PyIntObject*)k);
2618 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619 PyErr_SetString(PicklingError,
2620 "Invalid get data");
2621 return NULL;
2622 }
Tim Petersac5687a2003-02-02 18:08:34 +00002623 if (have_get[ik]) /* with matching get */
2624 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 }
2626
2627 else if (! (PyTuple_Check(k) &&
2628 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002629 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630 ) {
2631 PyErr_SetString(PicklingError,
2632 "Unexpected data in internal list");
2633 return NULL;
2634 }
2635
2636 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002637 ik = PyInt_AS_LONG((PyIntObject *)k);
2638 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002639 PyErr_SetString(PicklingError,
2640 "Invalid get data");
2641 return NULL;
2642 }
Tim Petersac5687a2003-02-02 18:08:34 +00002643 have_get[ik] = 1;
2644 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002646 }
2647
2648 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002649 r = PyString_FromStringAndSize(NULL, rsize);
2650 if (r == NULL) goto err;
2651 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652
Tim Petersac5687a2003-02-02 18:08:34 +00002653 for (i = 0; i < l; i++) {
2654 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655
2656 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002657 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002659 p=PyString_AS_STRING((PyStringObject *)k);
2660 while (--ssize >= 0)
2661 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 }
2663 }
2664
2665 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002666 ik = PyInt_AS_LONG((PyIntObject *)
2667 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 if (ik < 256) {
2669 *s++ = BINGET;
2670 *s++ = (int)(ik & 0xff);
2671 }
2672 else {
2673 *s++ = LONG_BINGET;
2674 *s++ = (int)(ik & 0xff);
2675 *s++ = (int)((ik >> 8) & 0xff);
2676 *s++ = (int)((ik >> 16) & 0xff);
2677 *s++ = (int)((ik >> 24) & 0xff);
2678 }
2679 }
2680
2681 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002682 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683
2684 if (have_get[ik]) { /* with matching get */
2685 if (ik < 256) {
2686 *s++ = BINPUT;
2687 *s++ = (int)(ik & 0xff);
2688 }
2689 else {
2690 *s++ = LONG_BINPUT;
2691 *s++ = (int)(ik & 0xff);
2692 *s++ = (int)((ik >> 8) & 0xff);
2693 *s++ = (int)((ik >> 16) & 0xff);
2694 *s++ = (int)((ik >> 24) & 0xff);
2695 }
2696 }
2697 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 }
2699
2700 if (clear) {
2701 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002702 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 }
2704
2705 free(have_get);
2706 return r;
2707 err:
2708 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002709 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002710}
2711
2712static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002713Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714{
2715 PyObject *ob;
2716 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002717
Tim Peterscba30e22003-02-01 06:24:36 +00002718 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002719 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 if (dump(self, ob) < 0)
2722 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726 /* XXX Why does dump() return self? */
2727 Py_INCREF(self);
2728 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002729}
2730
2731
Tim Peterscba30e22003-02-01 06:24:36 +00002732static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733{
Neal Norwitzb0493252002-03-31 14:44:22 +00002734 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002735 PyDoc_STR("dump(object) -- "
2736 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002737 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002738 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002739 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002740 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002742};
2743
2744
2745static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002746newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747{
2748 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002749
Tim Peters5bd2a792003-02-01 16:45:06 +00002750 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002751 proto = HIGHEST_PROTOCOL;
2752 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002753 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2754 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002755 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002757 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002758
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002759 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002760 if (self == NULL)
2761 return NULL;
2762 self->proto = proto;
2763 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002764 self->fp = NULL;
2765 self->write = NULL;
2766 self->memo = NULL;
2767 self->arg = NULL;
2768 self->pers_func = NULL;
2769 self->inst_pers_func = NULL;
2770 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002771 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002772 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 self->fast_container = 0;
2774 self->fast_memo = NULL;
2775 self->buf_size = 0;
2776 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002777
Tim Peters5bd2a792003-02-01 16:45:06 +00002778 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 if (file)
2780 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002781 else {
2782 file = Pdata_New();
2783 if (file == NULL)
2784 goto err;
2785 }
2786 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002787
Tim Peterscba30e22003-02-01 06:24:36 +00002788 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 if (PyFile_Check(file)) {
2792 self->fp = PyFile_AsFile(file);
2793 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002794 PyErr_SetString(PyExc_ValueError,
2795 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 goto err;
2797 }
2798 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002799 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 else if (PycStringIO_OutputCheck(file)) {
2801 self->write_func = write_cStringIO;
2802 }
2803 else if (file == Py_None) {
2804 self->write_func = write_none;
2805 }
2806 else {
2807 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 if (! Pdata_Check(file)) {
2810 self->write = PyObject_GetAttr(file, write_str);
2811 if (!self->write) {
2812 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002813 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 "argument must have 'write' "
2815 "attribute");
2816 goto err;
2817 }
2818 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002819
Tim Peters5bd2a792003-02-01 16:45:06 +00002820 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2821 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 PyErr_NoMemory();
2823 goto err;
2824 }
2825 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002827 if (PyEval_GetRestricted()) {
2828 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002829 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002830
Tim Peters5b7da392003-02-04 00:21:07 +00002831 if (m == NULL)
2832 goto err;
2833 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002834 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002835 if (self->dispatch_table == NULL)
2836 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 }
2838 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002839 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002840 Py_INCREF(dispatch_table);
2841 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002842 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002847 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002849}
2850
2851
2852static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002853get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854{
Martin v. Löwis544f1192004-07-27 05:22:33 +00002855 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002857 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002858
Tim Peters92c8bb32003-02-13 23:00:26 +00002859 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002860 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002861 * accepts Pickler() and Pickler(integer) too. The meaning then
2862 * is clear as mud, undocumented, and not supported by pickle.py.
2863 * I'm told Zope uses this, but I haven't traced into this code
2864 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002865 */
2866 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002868 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002869 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2870 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002871 return NULL;
2872 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002873 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002874}
2875
2876
2877static void
Tim Peterscba30e22003-02-01 06:24:36 +00002878Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002880 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002881 Py_XDECREF(self->write);
2882 Py_XDECREF(self->memo);
2883 Py_XDECREF(self->fast_memo);
2884 Py_XDECREF(self->arg);
2885 Py_XDECREF(self->file);
2886 Py_XDECREF(self->pers_func);
2887 Py_XDECREF(self->inst_pers_func);
2888 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002889 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002890 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002891}
2892
2893static int
2894Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2895{
2896 int err;
2897#define VISIT(SLOT) \
2898 if (SLOT) { \
2899 err = visit((PyObject *)(SLOT), arg); \
2900 if (err) \
2901 return err; \
2902 }
2903 VISIT(self->write);
2904 VISIT(self->memo);
2905 VISIT(self->fast_memo);
2906 VISIT(self->arg);
2907 VISIT(self->file);
2908 VISIT(self->pers_func);
2909 VISIT(self->inst_pers_func);
2910 VISIT(self->dispatch_table);
2911#undef VISIT
2912 return 0;
2913}
2914
2915static int
2916Pickler_clear(Picklerobject *self)
2917{
2918#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL;
2919 CLEAR(self->write);
2920 CLEAR(self->memo);
2921 CLEAR(self->fast_memo);
2922 CLEAR(self->arg);
2923 CLEAR(self->file);
2924 CLEAR(self->pers_func);
2925 CLEAR(self->inst_pers_func);
2926 CLEAR(self->dispatch_table);
2927#undef CLEAR
2928 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002929}
2930
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002931static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002932Pickler_get_pers_func(Picklerobject *p)
2933{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934 if (p->pers_func == NULL)
2935 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2936 else
2937 Py_INCREF(p->pers_func);
2938 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002939}
2940
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002941static int
2942Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2943{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if (v == NULL) {
2945 PyErr_SetString(PyExc_TypeError,
2946 "attribute deletion is not supported");
2947 return -1;
2948 }
2949 Py_XDECREF(p->pers_func);
2950 Py_INCREF(v);
2951 p->pers_func = v;
2952 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002953}
2954
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002955static int
2956Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2957{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 if (v == NULL) {
2959 PyErr_SetString(PyExc_TypeError,
2960 "attribute deletion is not supported");
2961 return -1;
2962 }
2963 Py_XDECREF(p->inst_pers_func);
2964 Py_INCREF(v);
2965 p->inst_pers_func = v;
2966 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002967}
2968
2969static PyObject *
2970Pickler_get_memo(Picklerobject *p)
2971{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 if (p->memo == NULL)
2973 PyErr_SetString(PyExc_AttributeError, "memo");
2974 else
2975 Py_INCREF(p->memo);
2976 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002977}
2978
2979static int
2980Pickler_set_memo(Picklerobject *p, PyObject *v)
2981{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 if (v == NULL) {
2983 PyErr_SetString(PyExc_TypeError,
2984 "attribute deletion is not supported");
2985 return -1;
2986 }
2987 if (!PyDict_Check(v)) {
2988 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2989 return -1;
2990 }
2991 Py_XDECREF(p->memo);
2992 Py_INCREF(v);
2993 p->memo = v;
2994 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002995}
2996
2997static PyObject *
2998Pickler_get_error(Picklerobject *p)
2999{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000 /* why is this an attribute on the Pickler? */
3001 Py_INCREF(PicklingError);
3002 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003003}
3004
3005static PyMemberDef Pickler_members[] = {
3006 {"binary", T_INT, offsetof(Picklerobject, bin)},
3007 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003008 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003009};
3010
3011static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003012 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003013 (setter)Pickler_set_pers_func},
3014 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3015 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003016 {"PicklingError", (getter)Pickler_get_error, NULL},
3017 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003018};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003020PyDoc_STRVAR(Picklertype__doc__,
3021"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003022
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003023static PyTypeObject Picklertype = {
3024 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00003026 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003027 sizeof(Picklerobject), /*tp_basicsize*/
3028 0,
3029 (destructor)Pickler_dealloc, /* tp_dealloc */
3030 0, /* tp_print */
3031 0, /* tp_getattr */
3032 0, /* tp_setattr */
3033 0, /* tp_compare */
3034 0, /* tp_repr */
3035 0, /* tp_as_number */
3036 0, /* tp_as_sequence */
3037 0, /* tp_as_mapping */
3038 0, /* tp_hash */
3039 0, /* tp_call */
3040 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003041 PyObject_GenericGetAttr, /* tp_getattro */
3042 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003043 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003044 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003045 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003046 (traverseproc)Pickler_traverse, /* tp_traverse */
3047 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003048 0, /* tp_richcompare */
3049 0, /* tp_weaklistoffset */
3050 0, /* tp_iter */
3051 0, /* tp_iternext */
3052 Pickler_methods, /* tp_methods */
3053 Pickler_members, /* tp_members */
3054 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003055};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003056
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003057static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003058find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059{
3060 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 if (fc) {
3063 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003064 PyErr_SetString(UnpicklingError, "Global and instance "
3065 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 return NULL;
3067 }
Tim Peterscba30e22003-02-01 06:24:36 +00003068 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 py_global_name);
3070 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 module = PySys_GetObject("modules");
3073 if (module == NULL)
3074 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 module = PyDict_GetItem(module, py_module_name);
3077 if (module == NULL) {
3078 module = PyImport_Import(py_module_name);
3079 if (!module)
3080 return NULL;
3081 global = PyObject_GetAttr(module, py_global_name);
3082 Py_DECREF(module);
3083 }
3084 else
3085 global = PyObject_GetAttr(module, py_global_name);
3086 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003087}
3088
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003089static int
Tim Peterscba30e22003-02-01 06:24:36 +00003090marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091{
3092 if (self->num_marks < 1) {
3093 PyErr_SetString(UnpicklingError, "could not find MARK");
3094 return -1;
3095 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098}
3099
Tim Peters84e87f32001-03-17 04:50:51 +00003100
Guido van Rossum60456fd1997-04-09 17:36:32 +00003101static int
Tim Peterscba30e22003-02-01 06:24:36 +00003102load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103{
3104 PDATA_APPEND(self->stack, Py_None, -1);
3105 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106}
3107
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003108static int
Tim Peterscba30e22003-02-01 06:24:36 +00003109bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110{
3111 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3112 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003113}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114
3115static int
Tim Peterscba30e22003-02-01 06:24:36 +00003116load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117{
3118 PyObject *py_int = 0;
3119 char *endptr, *s;
3120 int len, res = -1;
3121 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122
Tim Peters0bc93f52003-02-02 18:29:33 +00003123 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003124 if (len < 2) return bad_readline();
3125 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 errno = 0;
3128 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003130 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3131 /* Hm, maybe we've got something long. Let's try reading
3132 it as a Python long object. */
3133 errno = 0;
3134 py_int = PyLong_FromString(s, NULL, 0);
3135 if (py_int == NULL) {
3136 PyErr_SetString(PyExc_ValueError,
3137 "could not convert string to int");
3138 goto finally;
3139 }
3140 }
3141 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003142 if (len == 3 && (l == 0 || l == 1)) {
3143 if (!( py_int = PyBool_FromLong(l))) goto finally;
3144 }
3145 else {
3146 if (!( py_int = PyInt_FromLong(l))) goto finally;
3147 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003148 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 free(s);
3151 PDATA_PUSH(self->stack, py_int, -1);
3152 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 finally:
3155 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003158}
3159
Tim Peters3c67d792003-02-02 17:59:11 +00003160static int
3161load_bool(Unpicklerobject *self, PyObject *boolean)
3162{
3163 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003164 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003165 return 0;
3166}
3167
Tim Petersee1a53c2003-02-02 02:57:53 +00003168/* s contains x bytes of a little-endian integer. Return its value as a
3169 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3170 * int, but when x is 4 it's a signed one. This is an historical source
3171 * of x-platform bugs.
3172 */
Tim Peters84e87f32001-03-17 04:50:51 +00003173static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003174calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175{
3176 unsigned char c;
3177 int i;
3178 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 for (i = 0, l = 0L; i < x; i++) {
3181 c = (unsigned char)s[i];
3182 l |= (long)c << (i * 8);
3183 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003184#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3186 * is signed, so on a box with longs bigger than 4 bytes we need
3187 * to extend a BININT's sign bit to the full width.
3188 */
3189 if (x == 4 && l & (1L << 31))
3190 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003191#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003192 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193}
3194
3195
3196static int
Tim Peterscba30e22003-02-01 06:24:36 +00003197load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198{
3199 PyObject *py_int = 0;
3200 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003203
Tim Peterscba30e22003-02-01 06:24:36 +00003204 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 PDATA_PUSH(self->stack, py_int, -1);
3208 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209}
3210
3211
3212static int
Tim Peterscba30e22003-02-01 06:24:36 +00003213load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214{
3215 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Tim Peters0bc93f52003-02-02 18:29:33 +00003217 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221}
3222
3223
3224static int
Tim Peterscba30e22003-02-01 06:24:36 +00003225load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226{
3227 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003228
Tim Peters0bc93f52003-02-02 18:29:33 +00003229 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233}
3234
3235
3236static int
Tim Peterscba30e22003-02-01 06:24:36 +00003237load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003238{
3239 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Tim Peters0bc93f52003-02-02 18:29:33 +00003241 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003245}
Tim Peters84e87f32001-03-17 04:50:51 +00003246
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247static int
Tim Peterscba30e22003-02-01 06:24:36 +00003248load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249{
3250 PyObject *l = 0;
3251 char *end, *s;
3252 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003253
Tim Peters0bc93f52003-02-02 18:29:33 +00003254 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 if (len < 2) return bad_readline();
3256 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257
Tim Peterscba30e22003-02-01 06:24:36 +00003258 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003259 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 free(s);
3262 PDATA_PUSH(self->stack, l, -1);
3263 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265 finally:
3266 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003268 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269}
3270
Tim Petersee1a53c2003-02-02 02:57:53 +00003271/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3272 * data following.
3273 */
3274static int
3275load_counted_long(Unpicklerobject *self, int size)
3276{
3277 int i;
3278 char *nbytes;
3279 unsigned char *pdata;
3280 PyObject *along;
3281
3282 assert(size == 1 || size == 4);
3283 i = self->read_func(self, &nbytes, size);
3284 if (i < 0) return -1;
3285
3286 size = calc_binint(nbytes, size);
3287 if (size < 0) {
3288 /* Corrupt or hostile pickle -- we never write one like
3289 * this.
3290 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003291 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003292 "byte count");
3293 return -1;
3294 }
3295
3296 if (size == 0)
3297 along = PyLong_FromLong(0L);
3298 else {
3299 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003300 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003301 if (i < 0) return -1;
3302 along = _PyLong_FromByteArray(pdata, (size_t)size,
3303 1 /* little endian */, 1 /* signed */);
3304 }
3305 if (along == NULL)
3306 return -1;
3307 PDATA_PUSH(self->stack, along, -1);
3308 return 0;
3309}
Tim Peters84e87f32001-03-17 04:50:51 +00003310
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311static int
Tim Peterscba30e22003-02-01 06:24:36 +00003312load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003313{
3314 PyObject *py_float = 0;
3315 char *endptr, *s;
3316 int len, res = -1;
3317 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318
Tim Peters0bc93f52003-02-02 18:29:33 +00003319 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003320 if (len < 2) return bad_readline();
3321 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003323 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003324 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003326 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3327 PyErr_SetString(PyExc_ValueError,
3328 "could not convert string to float");
3329 goto finally;
3330 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003331
Tim Peterscba30e22003-02-01 06:24:36 +00003332 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003333 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 free(s);
3336 PDATA_PUSH(self->stack, py_float, -1);
3337 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 finally:
3340 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003343}
3344
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345static int
Tim Peterscba30e22003-02-01 06:24:36 +00003346load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003347{
Tim Peters9905b942003-03-20 20:53:32 +00003348 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 double x;
3350 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003351
Tim Peters0bc93f52003-02-02 18:29:33 +00003352 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Tim Peters9905b942003-03-20 20:53:32 +00003355 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3356 if (x == -1.0 && PyErr_Occurred())
3357 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003358
Tim Peters9905b942003-03-20 20:53:32 +00003359 py_float = PyFloat_FromDouble(x);
3360 if (py_float == NULL)
3361 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003363 PDATA_PUSH(self->stack, py_float, -1);
3364 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003366
3367static int
Tim Peterscba30e22003-02-01 06:24:36 +00003368load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369{
3370 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003371 int len, res = -1;
3372 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003373
Tim Peters0bc93f52003-02-02 18:29:33 +00003374 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375 if (len < 2) return bad_readline();
3376 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003377
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003378
3379 /* Strip outermost quotes */
3380 while (s[len-1] <= ' ')
3381 len--;
3382 if(s[0]=='"' && s[len-1]=='"'){
3383 s[len-1] = '\0';
3384 p = s + 1 ;
3385 len -= 2;
3386 } else if(s[0]=='\'' && s[len-1]=='\''){
3387 s[len-1] = '\0';
3388 p = s + 1 ;
3389 len -= 2;
3390 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391 goto insecure;
3392 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003393
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003394 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3395 if (str) {
3396 PDATA_PUSH(self->stack, str, -1);
3397 res = 0;
3398 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 insecure:
3403 free(s);
3404 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3405 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003406}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
3408
3409static int
Tim Peterscba30e22003-02-01 06:24:36 +00003410load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411{
3412 PyObject *py_string = 0;
3413 long l;
3414 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Tim Peters0bc93f52003-02-02 18:29:33 +00003416 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003418 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Tim Peters0bc93f52003-02-02 18:29:33 +00003420 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Tim Peterscba30e22003-02-01 06:24:36 +00003423 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426 PDATA_PUSH(self->stack, py_string, -1);
3427 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428}
3429
3430
3431static int
Tim Peterscba30e22003-02-01 06:24:36 +00003432load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433{
3434 PyObject *py_string = 0;
3435 unsigned char l;
3436 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Tim Peters0bc93f52003-02-02 18:29:33 +00003438 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003441 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
Tim Peters0bc93f52003-02-02 18:29:33 +00003443 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 PDATA_PUSH(self->stack, py_string, -1);
3448 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003449}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
3451
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003452#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453static int
Tim Peterscba30e22003-02-01 06:24:36 +00003454load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003455{
3456 PyObject *str = 0;
3457 int len, res = -1;
3458 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003459
Tim Peters0bc93f52003-02-02 18:29:33 +00003460 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003462
Tim Peterscba30e22003-02-01 06:24:36 +00003463 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003466 PDATA_PUSH(self->stack, str, -1);
3467 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 finally:
3470 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003471}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003472#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003473
3474
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003475#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003476static int
Tim Peterscba30e22003-02-01 06:24:36 +00003477load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478{
3479 PyObject *unicode;
3480 long l;
3481 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003482
Tim Peters0bc93f52003-02-02 18:29:33 +00003483 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003486
Tim Peters0bc93f52003-02-02 18:29:33 +00003487 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003489
Tim Peterscba30e22003-02-01 06:24:36 +00003490 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 PDATA_PUSH(self->stack, unicode, -1);
3494 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003495}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003496#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003497
3498
3499static int
Tim Peterscba30e22003-02-01 06:24:36 +00003500load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501{
3502 PyObject *tup;
3503 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 if ((i = marker(self)) < 0) return -1;
3506 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3507 PDATA_PUSH(self->stack, tup, -1);
3508 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509}
3510
3511static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003512load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003513{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003514 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003515
Tim Peters1d63c9f2003-02-02 20:29:39 +00003516 if (tup == NULL)
3517 return -1;
3518
3519 while (--len >= 0) {
3520 PyObject *element;
3521
3522 PDATA_POP(self->stack, element);
3523 if (element == NULL)
3524 return -1;
3525 PyTuple_SET_ITEM(tup, len, element);
3526 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527 PDATA_PUSH(self->stack, tup, -1);
3528 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003529}
3530
3531static int
Tim Peterscba30e22003-02-01 06:24:36 +00003532load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533{
3534 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536 if (!( list=PyList_New(0))) return -1;
3537 PDATA_PUSH(self->stack, list, -1);
3538 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539}
3540
3541static int
Tim Peterscba30e22003-02-01 06:24:36 +00003542load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543{
3544 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 if (!( dict=PyDict_New())) return -1;
3547 PDATA_PUSH(self->stack, dict, -1);
3548 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003549}
3550
3551
3552static int
Tim Peterscba30e22003-02-01 06:24:36 +00003553load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003554{
3555 PyObject *list = 0;
3556 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 if ((i = marker(self)) < 0) return -1;
3559 if (!( list=Pdata_popList(self->stack, i))) return -1;
3560 PDATA_PUSH(self->stack, list, -1);
3561 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562}
3563
3564static int
Tim Peterscba30e22003-02-01 06:24:36 +00003565load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566{
3567 PyObject *dict, *key, *value;
3568 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003570 if ((i = marker(self)) < 0) return -1;
3571 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003573 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003575 for (k = i+1; k < j; k += 2) {
3576 key =self->stack->data[k-1];
3577 value=self->stack->data[k ];
3578 if (PyDict_SetItem(dict, key, value) < 0) {
3579 Py_DECREF(dict);
3580 return -1;
3581 }
3582 }
3583 Pdata_clear(self->stack, i);
3584 PDATA_PUSH(self->stack, dict, -1);
3585 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586}
3587
3588static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003589Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003590{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003591 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003593 if (PyClass_Check(cls)) {
3594 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596 if ((l=PyObject_Size(args)) < 0) goto err;
3597 if (!( l )) {
3598 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003599
Tim Peterscba30e22003-02-01 06:24:36 +00003600 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003601 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003603 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 so bypass usual construction */
3605 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003608 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 goto err;
3610 return inst;
3611 }
3612 Py_DECREF(__getinitargs__);
3613 }
Tim Peters84e87f32001-03-17 04:50:51 +00003614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 if ((r=PyInstance_New(cls, args, NULL))) return r;
3616 else goto err;
3617 }
Tim Peters84e87f32001-03-17 04:50:51 +00003618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 if (args==Py_None) {
3620 /* Special case, call cls.__basicnew__() */
3621 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3624 if (!basicnew) return NULL;
3625 r=PyObject_CallObject(basicnew, NULL);
3626 Py_DECREF(basicnew);
3627 if (r) return r;
3628 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632 err:
3633 {
3634 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003636 PyErr_Fetch(&tp, &v, &tb);
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003637 if ((r=PyTuple_Pack(3,v,cls,args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638 Py_XDECREF(v);
3639 v=r;
3640 }
3641 PyErr_Restore(tp,v,tb);
3642 }
3643 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003644}
Tim Peters84e87f32001-03-17 04:50:51 +00003645
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646
3647static int
Tim Peterscba30e22003-02-01 06:24:36 +00003648load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003649{
3650 PyObject *class, *tup, *obj=0;
3651 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003653 if ((i = marker(self)) < 0) return -1;
3654 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3655 PDATA_POP(self->stack, class);
3656 if (class) {
3657 obj = Instance_New(class, tup);
3658 Py_DECREF(class);
3659 }
3660 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 if (! obj) return -1;
3663 PDATA_PUSH(self->stack, obj, -1);
3664 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665}
3666
3667
3668static int
Tim Peterscba30e22003-02-01 06:24:36 +00003669load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670{
3671 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3672 int i, len;
3673 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003675 if ((i = marker(self)) < 0) 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) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 if (len < 2) return bad_readline();
3679 module_name = PyString_FromStringAndSize(s, len - 1);
3680 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003681
Tim Peters0bc93f52003-02-02 18:29:33 +00003682 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003683 if (len < 2) return bad_readline();
3684 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003685 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003686 self->find_class);
3687 Py_DECREF(class_name);
3688 }
3689 }
3690 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003692 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 if ((tup=Pdata_popTuple(self->stack, i))) {
3695 obj = Instance_New(class, tup);
3696 Py_DECREF(tup);
3697 }
3698 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003700 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702 PDATA_PUSH(self->stack, obj, -1);
3703 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704}
3705
Tim Peterseab7db32003-02-13 18:24:14 +00003706static int
3707load_newobj(Unpicklerobject *self)
3708{
3709 PyObject *args = NULL;
3710 PyObject *clsraw = NULL;
3711 PyTypeObject *cls; /* clsraw cast to its true type */
3712 PyObject *obj;
3713
3714 /* Stack is ... cls argtuple, and we want to call
3715 * cls.__new__(cls, *argtuple).
3716 */
3717 PDATA_POP(self->stack, args);
3718 if (args == NULL) goto Fail;
3719 if (! PyTuple_Check(args)) {
3720 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3721 "tuple.");
3722 goto Fail;
3723 }
3724
3725 PDATA_POP(self->stack, clsraw);
3726 cls = (PyTypeObject *)clsraw;
3727 if (cls == NULL) goto Fail;
3728 if (! PyType_Check(cls)) {
3729 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3730 "isn't a type object");
3731 goto Fail;
3732 }
3733 if (cls->tp_new == NULL) {
3734 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3735 "has NULL tp_new");
3736 goto Fail;
3737 }
3738
3739 /* Call __new__. */
3740 obj = cls->tp_new(cls, args, NULL);
3741 if (obj == NULL) goto Fail;
3742
3743 Py_DECREF(args);
3744 Py_DECREF(clsraw);
3745 PDATA_PUSH(self->stack, obj, -1);
3746 return 0;
3747
3748 Fail:
3749 Py_XDECREF(args);
3750 Py_XDECREF(clsraw);
3751 return -1;
3752}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753
3754static int
Tim Peterscba30e22003-02-01 06:24:36 +00003755load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756{
3757 PyObject *class = 0, *module_name = 0, *class_name = 0;
3758 int len;
3759 char *s;
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) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 if (len < 2) return bad_readline();
3763 module_name = PyString_FromStringAndSize(s, len - 1);
3764 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003765
Tim Peters0bc93f52003-02-02 18:29:33 +00003766 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003767 if (len < 2) {
3768 Py_DECREF(module_name);
3769 return bad_readline();
3770 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003771 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003772 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 self->find_class);
3774 Py_DECREF(class_name);
3775 }
3776 }
3777 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 if (! class) return -1;
3780 PDATA_PUSH(self->stack, class, -1);
3781 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782}
3783
3784
3785static int
Tim Peterscba30e22003-02-01 06:24:36 +00003786load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787{
3788 PyObject *pid = 0;
3789 int len;
3790 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003793 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003794 if (len < 2) return bad_readline();
3795
3796 pid = PyString_FromStringAndSize(s, len - 1);
3797 if (!pid) return -1;
3798
3799 if (PyList_Check(self->pers_func)) {
3800 if (PyList_Append(self->pers_func, pid) < 0) {
3801 Py_DECREF(pid);
3802 return -1;
3803 }
3804 }
3805 else {
3806 ARG_TUP(self, pid);
3807 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003808 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809 NULL);
3810 FREE_ARG_TUP(self);
3811 }
3812 }
3813
3814 if (! pid) return -1;
3815
3816 PDATA_PUSH(self->stack, pid, -1);
3817 return 0;
3818 }
3819 else {
3820 PyErr_SetString(UnpicklingError,
3821 "A load persistent id instruction was encountered,\n"
3822 "but no persistent_load function was specified.");
3823 return -1;
3824 }
3825}
3826
3827static int
Tim Peterscba30e22003-02-01 06:24:36 +00003828load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829{
3830 PyObject *pid = 0;
3831
3832 if (self->pers_func) {
3833 PDATA_POP(self->stack, pid);
3834 if (! pid) return -1;
3835
3836 if (PyList_Check(self->pers_func)) {
3837 if (PyList_Append(self->pers_func, pid) < 0) {
3838 Py_DECREF(pid);
3839 return -1;
3840 }
3841 }
3842 else {
3843 ARG_TUP(self, pid);
3844 if (self->arg) {
3845 pid = PyObject_Call(self->pers_func, self->arg,
3846 NULL);
3847 FREE_ARG_TUP(self);
3848 }
3849 if (! pid) return -1;
3850 }
3851
3852 PDATA_PUSH(self->stack, pid, -1);
3853 return 0;
3854 }
3855 else {
3856 PyErr_SetString(UnpicklingError,
3857 "A load persistent id instruction was encountered,\n"
3858 "but no persistent_load function was specified.");
3859 return -1;
3860 }
3861}
3862
3863
3864static int
Tim Peterscba30e22003-02-01 06:24:36 +00003865load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866{
3867 int len;
3868
3869 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3870
3871 /* Note that we split the (pickle.py) stack into two stacks,
3872 an object stack and a mark stack. We have to be clever and
3873 pop the right one. We do this by looking at the top of the
3874 mark stack.
3875 */
3876
3877 if ((self->num_marks > 0) &&
3878 (self->marks[self->num_marks - 1] == len))
3879 self->num_marks--;
3880 else {
3881 len--;
3882 Py_DECREF(self->stack->data[len]);
3883 self->stack->length=len;
3884 }
3885
3886 return 0;
3887}
3888
3889
3890static int
Tim Peterscba30e22003-02-01 06:24:36 +00003891load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892{
3893 int i;
3894
3895 if ((i = marker(self)) < 0)
3896 return -1;
3897
3898 Pdata_clear(self->stack, i);
3899
3900 return 0;
3901}
3902
3903
3904static int
Tim Peterscba30e22003-02-01 06:24:36 +00003905load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906{
3907 PyObject *last;
3908 int len;
3909
3910 if ((len = self->stack->length) <= 0) return stackUnderflow();
3911 last=self->stack->data[len-1];
3912 Py_INCREF(last);
3913 PDATA_PUSH(self->stack, last, -1);
3914 return 0;
3915}
3916
3917
3918static int
Tim Peterscba30e22003-02-01 06:24:36 +00003919load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920{
3921 PyObject *py_str = 0, *value = 0;
3922 int len;
3923 char *s;
3924 int rc;
3925
Tim Peters0bc93f52003-02-02 18:29:33 +00003926 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003927 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 value = PyDict_GetItem(self->memo, py_str);
3932 if (! value) {
3933 PyErr_SetObject(BadPickleGet, py_str);
3934 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003935 }
3936 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 PDATA_APPEND(self->stack, value, -1);
3938 rc = 0;
3939 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003941 Py_DECREF(py_str);
3942 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943}
3944
3945
3946static int
Tim Peterscba30e22003-02-01 06:24:36 +00003947load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948{
3949 PyObject *py_key = 0, *value = 0;
3950 unsigned char key;
3951 char *s;
3952 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953
Tim Peters0bc93f52003-02-02 18:29:33 +00003954 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956 key = (unsigned char)s[0];
3957 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003959 value = PyDict_GetItem(self->memo, py_key);
3960 if (! value) {
3961 PyErr_SetObject(BadPickleGet, py_key);
3962 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003963 }
3964 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 PDATA_APPEND(self->stack, value, -1);
3966 rc = 0;
3967 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003969 Py_DECREF(py_key);
3970 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971}
3972
3973
3974static int
Tim Peterscba30e22003-02-01 06:24:36 +00003975load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976{
3977 PyObject *py_key = 0, *value = 0;
3978 unsigned char c;
3979 char *s;
3980 long key;
3981 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982
Tim Peters0bc93f52003-02-02 18:29:33 +00003983 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985 c = (unsigned char)s[0];
3986 key = (long)c;
3987 c = (unsigned char)s[1];
3988 key |= (long)c << 8;
3989 c = (unsigned char)s[2];
3990 key |= (long)c << 16;
3991 c = (unsigned char)s[3];
3992 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3995
3996 value = PyDict_GetItem(self->memo, py_key);
3997 if (! value) {
3998 PyErr_SetObject(BadPickleGet, py_key);
3999 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004000 }
4001 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 PDATA_APPEND(self->stack, value, -1);
4003 rc = 0;
4004 }
4005
4006 Py_DECREF(py_key);
4007 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004008}
4009
Tim Peters2d629652003-02-04 05:06:17 +00004010/* Push an object from the extension registry (EXT[124]). nbytes is
4011 * the number of bytes following the opcode, holding the index (code) value.
4012 */
4013static int
4014load_extension(Unpicklerobject *self, int nbytes)
4015{
4016 char *codebytes; /* the nbytes bytes after the opcode */
4017 long code; /* calc_binint returns long */
4018 PyObject *py_code; /* code as a Python int */
4019 PyObject *obj; /* the object to push */
4020 PyObject *pair; /* (module_name, class_name) */
4021 PyObject *module_name, *class_name;
4022
4023 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4024 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4025 code = calc_binint(codebytes, nbytes);
4026 if (code <= 0) { /* note that 0 is forbidden */
4027 /* Corrupt or hostile pickle. */
4028 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4029 return -1;
4030 }
4031
4032 /* Look for the code in the cache. */
4033 py_code = PyInt_FromLong(code);
4034 if (py_code == NULL) return -1;
4035 obj = PyDict_GetItem(extension_cache, py_code);
4036 if (obj != NULL) {
4037 /* Bingo. */
4038 Py_DECREF(py_code);
4039 PDATA_APPEND(self->stack, obj, -1);
4040 return 0;
4041 }
4042
4043 /* Look up the (module_name, class_name) pair. */
4044 pair = PyDict_GetItem(inverted_registry, py_code);
4045 if (pair == NULL) {
4046 Py_DECREF(py_code);
4047 PyErr_Format(PyExc_ValueError, "unregistered extension "
4048 "code %ld", code);
4049 return -1;
4050 }
4051 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004052 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004053 */
4054 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4055 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4056 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4057 Py_DECREF(py_code);
4058 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4059 "isn't a 2-tuple of strings", code);
4060 return -1;
4061 }
4062 /* Load the object. */
4063 obj = find_class(module_name, class_name, self->find_class);
4064 if (obj == NULL) {
4065 Py_DECREF(py_code);
4066 return -1;
4067 }
4068 /* Cache code -> obj. */
4069 code = PyDict_SetItem(extension_cache, py_code, obj);
4070 Py_DECREF(py_code);
4071 if (code < 0) {
4072 Py_DECREF(obj);
4073 return -1;
4074 }
4075 PDATA_PUSH(self->stack, obj, -1);
4076 return 0;
4077}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004078
4079static int
Tim Peterscba30e22003-02-01 06:24:36 +00004080load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081{
4082 PyObject *py_str = 0, *value = 0;
4083 int len, l;
4084 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004085
Tim Peters0bc93f52003-02-02 18:29:33 +00004086 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 if (l < 2) return bad_readline();
4088 if (!( len=self->stack->length )) return stackUnderflow();
4089 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4090 value=self->stack->data[len-1];
4091 l=PyDict_SetItem(self->memo, py_str, value);
4092 Py_DECREF(py_str);
4093 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094}
4095
4096
4097static int
Tim Peterscba30e22003-02-01 06:24:36 +00004098load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099{
4100 PyObject *py_key = 0, *value = 0;
4101 unsigned char key;
4102 char *s;
4103 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004104
Tim Peters0bc93f52003-02-02 18:29:33 +00004105 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4111 value=self->stack->data[len-1];
4112 len=PyDict_SetItem(self->memo, py_key, value);
4113 Py_DECREF(py_key);
4114 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004115}
4116
4117
4118static int
Tim Peterscba30e22003-02-01 06:24:36 +00004119load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120{
4121 PyObject *py_key = 0, *value = 0;
4122 long key;
4123 unsigned char c;
4124 char *s;
4125 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004126
Tim Peters0bc93f52003-02-02 18:29:33 +00004127 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 c = (unsigned char)s[0];
4131 key = (long)c;
4132 c = (unsigned char)s[1];
4133 key |= (long)c << 8;
4134 c = (unsigned char)s[2];
4135 key |= (long)c << 16;
4136 c = (unsigned char)s[3];
4137 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 if (!( py_key = PyInt_FromLong(key))) return -1;
4140 value=self->stack->data[len-1];
4141 len=PyDict_SetItem(self->memo, py_key, value);
4142 Py_DECREF(py_key);
4143 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004144}
4145
4146
4147static int
Tim Peterscba30e22003-02-01 06:24:36 +00004148do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149{
4150 PyObject *value = 0, *list = 0, *append_method = 0;
4151 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 len=self->stack->length;
4154 if (!( len >= x && x > 0 )) return stackUnderflow();
4155 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004156 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 if (PyList_Check(list)) {
4161 PyObject *slice;
4162 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 slice=Pdata_popList(self->stack, x);
4165 list_len = PyList_GET_SIZE(list);
4166 i=PyList_SetSlice(list, list_len, list_len, slice);
4167 Py_DECREF(slice);
4168 return i;
4169 }
4170 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171
Tim Peterscba30e22003-02-01 06:24:36 +00004172 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 return -1;
4174
4175 for (i = x; i < len; i++) {
4176 PyObject *junk;
4177
4178 value=self->stack->data[i];
4179 junk=0;
4180 ARG_TUP(self, value);
4181 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004182 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 NULL);
4184 FREE_ARG_TUP(self);
4185 }
4186 if (! junk) {
4187 Pdata_clear(self->stack, i+1);
4188 self->stack->length=x;
4189 Py_DECREF(append_method);
4190 return -1;
4191 }
4192 Py_DECREF(junk);
4193 }
4194 self->stack->length=x;
4195 Py_DECREF(append_method);
4196 }
4197
4198 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004199}
4200
4201
4202static int
Tim Peterscba30e22003-02-01 06:24:36 +00004203load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204{
4205 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004206}
4207
4208
4209static int
Tim Peterscba30e22003-02-01 06:24:36 +00004210load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211{
4212 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004213}
4214
4215
4216static int
Tim Peterscba30e22003-02-01 06:24:36 +00004217do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218{
4219 PyObject *value = 0, *key = 0, *dict = 0;
4220 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 if (!( (len=self->stack->length) >= x
4223 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 for (i = x+1; i < len; i += 2) {
4228 key =self->stack->data[i-1];
4229 value=self->stack->data[i ];
4230 if (PyObject_SetItem(dict, key, value) < 0) {
4231 r=-1;
4232 break;
4233 }
4234 }
4235
4236 Pdata_clear(self->stack, x);
4237
4238 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239}
4240
4241
Tim Peters84e87f32001-03-17 04:50:51 +00004242static int
Tim Peterscba30e22003-02-01 06:24:36 +00004243load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244{
4245 return do_setitems(self, self->stack->length - 2);
4246}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248static int
Tim Peterscba30e22003-02-01 06:24:36 +00004249load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250{
4251 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004252}
4253
Tim Peters84e87f32001-03-17 04:50:51 +00004254
Guido van Rossum60456fd1997-04-09 17:36:32 +00004255static int
Tim Peterscba30e22003-02-01 06:24:36 +00004256load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257{
Tim Peters080c88b2003-02-15 03:01:11 +00004258 PyObject *state, *inst, *slotstate;
4259 PyObject *__setstate__;
4260 PyObject *d_key, *d_value;
4261 int i;
4262 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263
Tim Peters080c88b2003-02-15 03:01:11 +00004264 /* Stack is ... instance, state. We want to leave instance at
4265 * the stack top, possibly mutated via instance.__setstate__(state).
4266 */
4267 if (self->stack->length < 2)
4268 return stackUnderflow();
4269 PDATA_POP(self->stack, state);
4270 if (state == NULL)
4271 return -1;
4272 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273
Tim Peters080c88b2003-02-15 03:01:11 +00004274 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4275 if (__setstate__ != NULL) {
4276 PyObject *junk = NULL;
4277
4278 /* The explicit __setstate__ is responsible for everything. */
4279 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 if (self->arg) {
4281 junk = PyObject_Call(__setstate__, self->arg, NULL);
4282 FREE_ARG_TUP(self);
4283 }
4284 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004285 if (junk == NULL)
4286 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 Py_DECREF(junk);
4288 return 0;
4289 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004290 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4291 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004293
4294 /* A default __setstate__. First see whether state embeds a
4295 * slot state dict too (a proto 2 addition).
4296 */
4297 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4298 PyObject *temp = state;
4299 state = PyTuple_GET_ITEM(temp, 0);
4300 slotstate = PyTuple_GET_ITEM(temp, 1);
4301 Py_INCREF(state);
4302 Py_INCREF(slotstate);
4303 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 }
Tim Peters080c88b2003-02-15 03:01:11 +00004305 else
4306 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004307
Tim Peters080c88b2003-02-15 03:01:11 +00004308 /* Set inst.__dict__ from the state dict (if any). */
4309 if (state != Py_None) {
4310 PyObject *dict;
4311 if (! PyDict_Check(state)) {
4312 PyErr_SetString(UnpicklingError, "state is not a "
4313 "dictionary");
4314 goto finally;
4315 }
4316 dict = PyObject_GetAttr(inst, __dict___str);
4317 if (dict == NULL)
4318 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319
Tim Peters080c88b2003-02-15 03:01:11 +00004320 i = 0;
4321 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4322 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4323 goto finally;
4324 }
4325 Py_DECREF(dict);
4326 }
4327
4328 /* Also set instance attributes from the slotstate dict (if any). */
4329 if (slotstate != NULL) {
4330 if (! PyDict_Check(slotstate)) {
4331 PyErr_SetString(UnpicklingError, "slot state is not "
4332 "a dictionary");
4333 goto finally;
4334 }
4335 i = 0;
4336 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4337 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4338 goto finally;
4339 }
4340 }
4341 res = 0;
4342
4343 finally:
4344 Py_DECREF(state);
4345 Py_XDECREF(slotstate);
4346 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004347}
4348
4349
4350static int
Tim Peterscba30e22003-02-01 06:24:36 +00004351load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352{
4353 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 /* Note that we split the (pickle.py) stack into two stacks, an
4356 object stack and a mark stack. Here we push a mark onto the
4357 mark stack.
4358 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 if ((self->num_marks + 1) >= self->marks_size) {
4361 s=self->marks_size+20;
4362 if (s <= self->num_marks) s=self->num_marks + 1;
4363 if (self->marks == NULL)
4364 self->marks=(int *)malloc(s * sizeof(int));
4365 else
Tim Peterscba30e22003-02-01 06:24:36 +00004366 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 s * sizeof(int));
4368 if (! self->marks) {
4369 PyErr_NoMemory();
4370 return -1;
4371 }
4372 self->marks_size = s;
4373 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004378}
4379
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380static int
Tim Peterscba30e22003-02-01 06:24:36 +00004381load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382{
4383 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 PDATA_POP(self->stack, arg_tup);
4386 if (! arg_tup) return -1;
4387 PDATA_POP(self->stack, callable);
4388 if (callable) {
4389 ob = Instance_New(callable, arg_tup);
4390 Py_DECREF(callable);
4391 }
4392 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 PDATA_PUSH(self->stack, ob, -1);
4397 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004398}
Tim Peters84e87f32001-03-17 04:50:51 +00004399
Tim Peters4190fb82003-02-02 16:09:05 +00004400/* Just raises an error if we don't know the protocol specified. PROTO
4401 * is the first opcode for protocols >= 2.
4402 */
4403static int
4404load_proto(Unpicklerobject *self)
4405{
4406 int i;
4407 char *protobyte;
4408
4409 i = self->read_func(self, &protobyte, 1);
4410 if (i < 0)
4411 return -1;
4412
4413 i = calc_binint(protobyte, 1);
4414 /* No point checking for < 0, since calc_binint returns an unsigned
4415 * int when chewing on 1 byte.
4416 */
4417 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004418 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004419 return 0;
4420
4421 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4422 return -1;
4423}
4424
Guido van Rossum60456fd1997-04-09 17:36:32 +00004425static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004426load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427{
4428 PyObject *err = 0, *val = 0;
4429 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 self->num_marks = 0;
4432 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004435 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 switch (s[0]) {
4439 case NONE:
4440 if (load_none(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 BININT:
4445 if (load_binint(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 BININT1:
4450 if (load_binint1(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 BININT2:
4455 if (load_binint2(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 INT:
4460 if (load_int(self) < 0)
4461 break;
4462 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 case LONG:
4465 if (load_long(self) < 0)
4466 break;
4467 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
Tim Petersee1a53c2003-02-02 02:57:53 +00004469 case LONG1:
4470 if (load_counted_long(self, 1) < 0)
4471 break;
4472 continue;
4473
4474 case LONG4:
4475 if (load_counted_long(self, 4) < 0)
4476 break;
4477 continue;
4478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case FLOAT:
4480 if (load_float(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 BINFLOAT:
4485 if (load_binfloat(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 BINSTRING:
4490 if (load_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 SHORT_BINSTRING:
4495 if (load_short_binstring(self) < 0)
4496 break;
4497 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 case STRING:
4500 if (load_string(self) < 0)
4501 break;
4502 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004504#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 case UNICODE:
4506 if (load_unicode(self) < 0)
4507 break;
4508 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 case BINUNICODE:
4511 if (load_binunicode(self) < 0)
4512 break;
4513 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004514#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004517 if (load_counted_tuple(self, 0) < 0)
4518 break;
4519 continue;
4520
4521 case TUPLE1:
4522 if (load_counted_tuple(self, 1) < 0)
4523 break;
4524 continue;
4525
4526 case TUPLE2:
4527 if (load_counted_tuple(self, 2) < 0)
4528 break;
4529 continue;
4530
4531 case TUPLE3:
4532 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 break;
4534 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 case TUPLE:
4537 if (load_tuple(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 EMPTY_LIST:
4542 if (load_empty_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 LIST:
4547 if (load_list(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 EMPTY_DICT:
4552 if (load_empty_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 DICT:
4557 if (load_dict(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 OBJ:
4562 if (load_obj(self) < 0)
4563 break;
4564 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 case INST:
4567 if (load_inst(self) < 0)
4568 break;
4569 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Tim Peterseab7db32003-02-13 18:24:14 +00004571 case NEWOBJ:
4572 if (load_newobj(self) < 0)
4573 break;
4574 continue;
4575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 case GLOBAL:
4577 if (load_global(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 APPEND:
4582 if (load_append(self) < 0)
4583 break;
4584 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 case APPENDS:
4587 if (load_appends(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 BUILD:
4592 if (load_build(self) < 0)
4593 break;
4594 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 case DUP:
4597 if (load_dup(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 BINGET:
4602 if (load_binget(self) < 0)
4603 break;
4604 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 case LONG_BINGET:
4607 if (load_long_binget(self) < 0)
4608 break;
4609 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 case GET:
4612 if (load_get(self) < 0)
4613 break;
4614 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004615
Tim Peters2d629652003-02-04 05:06:17 +00004616 case EXT1:
4617 if (load_extension(self, 1) < 0)
4618 break;
4619 continue;
4620
4621 case EXT2:
4622 if (load_extension(self, 2) < 0)
4623 break;
4624 continue;
4625
4626 case EXT4:
4627 if (load_extension(self, 4) < 0)
4628 break;
4629 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630 case MARK:
4631 if (load_mark(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 BINPUT:
4636 if (load_binput(self) < 0)
4637 break;
4638 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004640 case LONG_BINPUT:
4641 if (load_long_binput(self) < 0)
4642 break;
4643 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004645 case PUT:
4646 if (load_put(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:
4651 if (load_pop(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 POP_MARK:
4656 if (load_pop_mark(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 SETITEM:
4661 if (load_setitem(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 SETITEMS:
4666 if (load_setitems(self) < 0)
4667 break;
4668 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 case STOP:
4671 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 case PERSID:
4674 if (load_persid(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 BINPERSID:
4679 if (load_binpersid(self) < 0)
4680 break;
4681 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 case REDUCE:
4684 if (load_reduce(self) < 0)
4685 break;
4686 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004687
Tim Peters4190fb82003-02-02 16:09:05 +00004688 case PROTO:
4689 if (load_proto(self) < 0)
4690 break;
4691 continue;
4692
Tim Peters3c67d792003-02-02 17:59:11 +00004693 case NEWTRUE:
4694 if (load_bool(self, Py_True) < 0)
4695 break;
4696 continue;
4697
4698 case NEWFALSE:
4699 if (load_bool(self, Py_False) < 0)
4700 break;
4701 continue;
4702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 case '\0':
4704 /* end of file */
4705 PyErr_SetNone(PyExc_EOFError);
4706 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004709 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 "invalid load key, '%s'.",
4711 "c", s[0]);
4712 return NULL;
4713 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 break;
4716 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 if ((err = PyErr_Occurred())) {
4719 if (err == PyExc_EOFError) {
4720 PyErr_SetNone(PyExc_EOFError);
4721 }
4722 return NULL;
4723 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 PDATA_POP(self->stack, val);
4726 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004727}
Tim Peters84e87f32001-03-17 04:50:51 +00004728
Guido van Rossum60456fd1997-04-09 17:36:32 +00004729
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004730/* No-load functions to support noload, which is used to
4731 find persistent references. */
4732
4733static int
Tim Peterscba30e22003-02-01 06:24:36 +00004734noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735{
4736 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 if ((i = marker(self)) < 0) return -1;
4739 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004740}
4741
4742
4743static int
Tim Peterscba30e22003-02-01 06:24:36 +00004744noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745{
4746 int i;
4747 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 if ((i = marker(self)) < 0) return -1;
4750 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004751 if (self->readline_func(self, &s) < 0) return -1;
4752 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004753 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004755}
4756
4757static int
Tim Peterseab7db32003-02-13 18:24:14 +00004758noload_newobj(Unpicklerobject *self)
4759{
4760 PyObject *obj;
4761
4762 PDATA_POP(self->stack, obj); /* pop argtuple */
4763 if (obj == NULL) return -1;
4764 Py_DECREF(obj);
4765
4766 PDATA_POP(self->stack, obj); /* pop cls */
4767 if (obj == NULL) return -1;
4768 Py_DECREF(obj);
4769
4770 PDATA_APPEND(self->stack, Py_None, -1);
4771 return 0;
4772}
4773
4774static int
Tim Peterscba30e22003-02-01 06:24:36 +00004775noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776{
4777 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004778
Tim Peters0bc93f52003-02-02 18:29:33 +00004779 if (self->readline_func(self, &s) < 0) return -1;
4780 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 PDATA_APPEND(self->stack, Py_None,-1);
4782 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004783}
4784
4785static int
Tim Peterscba30e22003-02-01 06:24:36 +00004786noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 if (self->stack->length < 2) return stackUnderflow();
4790 Pdata_clear(self->stack, self->stack->length-2);
4791 PDATA_APPEND(self->stack, Py_None,-1);
4792 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004793}
4794
4795static int
4796noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004797
Guido van Rossum053b8df1998-11-25 16:18:00 +00004798 if (self->stack->length < 1) return stackUnderflow();
4799 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004800 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004801}
4802
Tim Peters2d629652003-02-04 05:06:17 +00004803static int
4804noload_extension(Unpicklerobject *self, int nbytes)
4805{
4806 char *codebytes;
4807
4808 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4809 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4810 PDATA_APPEND(self->stack, Py_None, -1);
4811 return 0;
4812}
4813
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004814
4815static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004816noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817{
4818 PyObject *err = 0, *val = 0;
4819 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004821 self->num_marks = 0;
4822 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004825 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004826 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 switch (s[0]) {
4829 case NONE:
4830 if (load_none(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 BININT:
4835 if (load_binint(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 BININT1:
4840 if (load_binint1(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 BININT2:
4845 if (load_binint2(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 INT:
4850 if (load_int(self) < 0)
4851 break;
4852 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 case LONG:
4855 if (load_long(self) < 0)
4856 break;
4857 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004858
Tim Peters4190fb82003-02-02 16:09:05 +00004859 case LONG1:
4860 if (load_counted_long(self, 1) < 0)
4861 break;
4862 continue;
4863
4864 case LONG4:
4865 if (load_counted_long(self, 4) < 0)
4866 break;
4867 continue;
4868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869 case FLOAT:
4870 if (load_float(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 BINFLOAT:
4875 if (load_binfloat(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 BINSTRING:
4880 if (load_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 SHORT_BINSTRING:
4885 if (load_short_binstring(self) < 0)
4886 break;
4887 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 case STRING:
4890 if (load_string(self) < 0)
4891 break;
4892 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004893
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004894#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004895 case UNICODE:
4896 if (load_unicode(self) < 0)
4897 break;
4898 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004900 case BINUNICODE:
4901 if (load_binunicode(self) < 0)
4902 break;
4903 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004904#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004906 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004907 if (load_counted_tuple(self, 0) < 0)
4908 break;
4909 continue;
4910
4911 case TUPLE1:
4912 if (load_counted_tuple(self, 1) < 0)
4913 break;
4914 continue;
4915
4916 case TUPLE2:
4917 if (load_counted_tuple(self, 2) < 0)
4918 break;
4919 continue;
4920
4921 case TUPLE3:
4922 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004923 break;
4924 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 case TUPLE:
4927 if (load_tuple(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 EMPTY_LIST:
4932 if (load_empty_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 LIST:
4937 if (load_list(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 EMPTY_DICT:
4942 if (load_empty_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 DICT:
4947 if (load_dict(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 OBJ:
4952 if (noload_obj(self) < 0)
4953 break;
4954 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 case INST:
4957 if (noload_inst(self) < 0)
4958 break;
4959 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004960
Tim Peterseab7db32003-02-13 18:24:14 +00004961 case NEWOBJ:
4962 if (noload_newobj(self) < 0)
4963 break;
4964 continue;
4965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 case GLOBAL:
4967 if (noload_global(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 APPEND:
4972 if (load_append(self) < 0)
4973 break;
4974 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 case APPENDS:
4977 if (load_appends(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 BUILD:
4982 if (noload_build(self) < 0)
4983 break;
4984 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 case DUP:
4987 if (load_dup(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 BINGET:
4992 if (load_binget(self) < 0)
4993 break;
4994 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 case LONG_BINGET:
4997 if (load_long_binget(self) < 0)
4998 break;
4999 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 case GET:
5002 if (load_get(self) < 0)
5003 break;
5004 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005005
Tim Peters2d629652003-02-04 05:06:17 +00005006 case EXT1:
5007 if (noload_extension(self, 1) < 0)
5008 break;
5009 continue;
5010
5011 case EXT2:
5012 if (noload_extension(self, 2) < 0)
5013 break;
5014 continue;
5015
5016 case EXT4:
5017 if (noload_extension(self, 4) < 0)
5018 break;
5019 continue;
5020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 case MARK:
5022 if (load_mark(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 BINPUT:
5027 if (load_binput(self) < 0)
5028 break;
5029 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 case LONG_BINPUT:
5032 if (load_long_binput(self) < 0)
5033 break;
5034 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 case PUT:
5037 if (load_put(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:
5042 if (load_pop(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 POP_MARK:
5047 if (load_pop_mark(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 SETITEM:
5052 if (load_setitem(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 SETITEMS:
5057 if (load_setitems(self) < 0)
5058 break;
5059 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 case STOP:
5062 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 case PERSID:
5065 if (load_persid(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 BINPERSID:
5070 if (load_binpersid(self) < 0)
5071 break;
5072 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005074 case REDUCE:
5075 if (noload_reduce(self) < 0)
5076 break;
5077 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005078
Tim Peters4190fb82003-02-02 16:09:05 +00005079 case PROTO:
5080 if (load_proto(self) < 0)
5081 break;
5082 continue;
5083
Tim Peters3c67d792003-02-02 17:59:11 +00005084 case NEWTRUE:
5085 if (load_bool(self, Py_True) < 0)
5086 break;
5087 continue;
5088
5089 case NEWFALSE:
5090 if (load_bool(self, Py_False) < 0)
5091 break;
5092 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005093 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005094 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 "invalid load key, '%s'.",
5096 "c", s[0]);
5097 return NULL;
5098 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 break;
5101 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005103 if ((err = PyErr_Occurred())) {
5104 if (err == PyExc_EOFError) {
5105 PyErr_SetNone(PyExc_EOFError);
5106 }
5107 return NULL;
5108 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005110 PDATA_POP(self->stack, val);
5111 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005112}
Tim Peters84e87f32001-03-17 04:50:51 +00005113
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005114
Guido van Rossum60456fd1997-04-09 17:36:32 +00005115static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005116Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117{
Tim Peterscba30e22003-02-01 06:24:36 +00005118 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005122}
5123
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005124static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005125Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126{
Tim Peterscba30e22003-02-01 06:24:36 +00005127 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005130 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005131}
5132
Guido van Rossum60456fd1997-04-09 17:36:32 +00005133
5134static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005135 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005136 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005137 },
Neal Norwitzb0493252002-03-31 14:44:22 +00005138 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005139 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005140 "noload() -- not load a pickle, but go through most of the motions\n"
5141 "\n"
5142 "This function can be used to read past a pickle without instantiating\n"
5143 "any objects or importing any modules. It can also be used to find all\n"
5144 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005145 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005146 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005147 {NULL, NULL} /* sentinel */
5148};
5149
5150
5151static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005152newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153{
5154 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005155
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005156 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 self->file = NULL;
5160 self->arg = NULL;
5161 self->stack = (Pdata*)Pdata_New();
5162 self->pers_func = NULL;
5163 self->last_string = NULL;
5164 self->marks = NULL;
5165 self->num_marks = 0;
5166 self->marks_size = 0;
5167 self->buf_size = 0;
5168 self->read = NULL;
5169 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005170 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005171
Tim Peterscba30e22003-02-01 06:24:36 +00005172 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005173 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 Py_INCREF(f);
5176 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005178 /* Set read, readline based on type of f */
5179 if (PyFile_Check(f)) {
5180 self->fp = PyFile_AsFile(f);
5181 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005182 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005183 "I/O operation on closed file");
5184 goto err;
5185 }
5186 self->read_func = read_file;
5187 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005188 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005189 else if (PycStringIO_InputCheck(f)) {
5190 self->fp = NULL;
5191 self->read_func = read_cStringIO;
5192 self->readline_func = readline_cStringIO;
5193 }
5194 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005196 self->fp = NULL;
5197 self->read_func = read_other;
5198 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5201 (self->read = PyObject_GetAttr(f, read_str)))) {
5202 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005203 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204 "argument must have 'read' and "
5205 "'readline' attributes" );
5206 goto err;
5207 }
5208 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005209 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005211 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005213 err:
5214 Py_DECREF((PyObject *)self);
5215 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005216}
5217
5218
5219static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005220get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221{
5222 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00005223
Tim Peterscba30e22003-02-01 06:24:36 +00005224 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225 return NULL;
5226 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005227}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005228
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005229
Guido van Rossum60456fd1997-04-09 17:36:32 +00005230static void
Tim Peterscba30e22003-02-01 06:24:36 +00005231Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005232{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005233 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005234 Py_XDECREF(self->readline);
5235 Py_XDECREF(self->read);
5236 Py_XDECREF(self->file);
5237 Py_XDECREF(self->memo);
5238 Py_XDECREF(self->stack);
5239 Py_XDECREF(self->pers_func);
5240 Py_XDECREF(self->arg);
5241 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005242 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 if (self->marks) {
5245 free(self->marks);
5246 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 if (self->buf_size) {
5249 free(self->buf);
5250 }
Tim Peters84e87f32001-03-17 04:50:51 +00005251
Tim Peters3cfe7542003-05-21 21:29:48 +00005252 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005253}
5254
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005255static int
5256Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5257{
5258 int err;
5259
5260#define VISIT(SLOT) \
5261 if (SLOT) { \
5262 err = visit((PyObject *)(SLOT), arg); \
5263 if (err) \
5264 return err; \
5265 }
5266 VISIT(self->readline);
5267 VISIT(self->read);
5268 VISIT(self->file);
5269 VISIT(self->memo);
5270 VISIT(self->stack);
5271 VISIT(self->pers_func);
5272 VISIT(self->arg);
5273 VISIT(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005274 VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005275#undef VISIT
5276 return 0;
5277}
5278
5279static int
5280Unpickler_clear(Unpicklerobject *self)
5281{
5282#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL
5283 CLEAR(self->readline);
5284 CLEAR(self->read);
5285 CLEAR(self->file);
5286 CLEAR(self->memo);
5287 CLEAR(self->stack);
5288 CLEAR(self->pers_func);
5289 CLEAR(self->arg);
5290 CLEAR(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005291 CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005292#undef CLEAR
5293 return 0;
5294}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005295
5296static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005297Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298{
5299 if (!strcmp(name, "persistent_load")) {
5300 if (!self->pers_func) {
5301 PyErr_SetString(PyExc_AttributeError, name);
5302 return NULL;
5303 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005305 Py_INCREF(self->pers_func);
5306 return self->pers_func;
5307 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005309 if (!strcmp(name, "find_global")) {
5310 if (!self->find_class) {
5311 PyErr_SetString(PyExc_AttributeError, name);
5312 return NULL;
5313 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315 Py_INCREF(self->find_class);
5316 return self->find_class;
5317 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005319 if (!strcmp(name, "memo")) {
5320 if (!self->memo) {
5321 PyErr_SetString(PyExc_AttributeError, name);
5322 return NULL;
5323 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005325 Py_INCREF(self->memo);
5326 return self->memo;
5327 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329 if (!strcmp(name, "UnpicklingError")) {
5330 Py_INCREF(UnpicklingError);
5331 return UnpicklingError;
5332 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005334 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005335}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005336
Guido van Rossum60456fd1997-04-09 17:36:32 +00005337
5338static int
Tim Peterscba30e22003-02-01 06:24:36 +00005339Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005340{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005342 if (!strcmp(name, "persistent_load")) {
5343 Py_XDECREF(self->pers_func);
5344 self->pers_func = value;
5345 Py_XINCREF(value);
5346 return 0;
5347 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349 if (!strcmp(name, "find_global")) {
5350 Py_XDECREF(self->find_class);
5351 self->find_class = value;
5352 Py_XINCREF(value);
5353 return 0;
5354 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005356 if (! value) {
5357 PyErr_SetString(PyExc_TypeError,
5358 "attribute deletion is not supported");
5359 return -1;
5360 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005362 if (strcmp(name, "memo") == 0) {
5363 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005364 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005365 "memo must be a dictionary");
5366 return -1;
5367 }
5368 Py_XDECREF(self->memo);
5369 self->memo = value;
5370 Py_INCREF(value);
5371 return 0;
5372 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005374 PyErr_SetString(PyExc_AttributeError, name);
5375 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005376}
5377
Tim Peters5bd2a792003-02-01 16:45:06 +00005378/* ---------------------------------------------------------------------------
5379 * Module-level functions.
5380 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005381
Martin v. Löwis544f1192004-07-27 05:22:33 +00005382/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005383static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005384cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385{
Martin v. Löwis544f1192004-07-27 05:22:33 +00005386 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005387 PyObject *ob, *file, *res = NULL;
5388 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005389 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005390
Martin v. Löwis544f1192004-07-27 05:22:33 +00005391 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5392 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005393 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005394
Tim Peters5bd2a792003-02-01 16:45:06 +00005395 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398 if (dump(pickler, ob) < 0)
5399 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005401 Py_INCREF(Py_None);
5402 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005404 finally:
5405 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005407 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005408}
5409
5410
Martin v. Löwis544f1192004-07-27 05:22:33 +00005411/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005412static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005413cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414{
Martin v. Löwis544f1192004-07-27 05:22:33 +00005415 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005416 PyObject *ob, *file = 0, *res = NULL;
5417 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005418 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005419
Martin v. Löwis544f1192004-07-27 05:22:33 +00005420 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5421 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005423
Tim Peterscba30e22003-02-01 06:24:36 +00005424 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005425 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005426
Tim Peters5bd2a792003-02-01 16:45:06 +00005427 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005430 if (dump(pickler, ob) < 0)
5431 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005433 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005435 finally:
5436 Py_XDECREF(pickler);
5437 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005440}
5441
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005442
Tim Peters5bd2a792003-02-01 16:45:06 +00005443/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005444static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005445cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446{
5447 Unpicklerobject *unpickler = 0;
5448 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005449
Tim Peterscba30e22003-02-01 06:24:36 +00005450 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005452
Tim Peterscba30e22003-02-01 06:24:36 +00005453 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005454 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005458 finally:
5459 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005462}
5463
5464
Tim Peters5bd2a792003-02-01 16:45:06 +00005465/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005466static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005467cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468{
5469 PyObject *ob, *file = 0, *res = NULL;
5470 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005471
Tim Peterscba30e22003-02-01 06:24:36 +00005472 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005474
Tim Peterscba30e22003-02-01 06:24:36 +00005475 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005477
Tim Peterscba30e22003-02-01 06:24:36 +00005478 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005479 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005481 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005483 finally:
5484 Py_XDECREF(file);
5485 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005488}
5489
5490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005491PyDoc_STRVAR(Unpicklertype__doc__,
5492"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005493
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005494static PyTypeObject Unpicklertype = {
5495 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005496 0, /*ob_size*/
5497 "cPickle.Unpickler", /*tp_name*/
5498 sizeof(Unpicklerobject), /*tp_basicsize*/
5499 0,
5500 (destructor)Unpickler_dealloc, /* tp_dealloc */
5501 0, /* tp_print */
5502 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5503 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5504 0, /* tp_compare */
5505 0, /* tp_repr */
5506 0, /* tp_as_number */
5507 0, /* tp_as_sequence */
5508 0, /* tp_as_mapping */
5509 0, /* tp_hash */
5510 0, /* tp_call */
5511 0, /* tp_str */
5512 0, /* tp_getattro */
5513 0, /* tp_setattro */
5514 0, /* tp_as_buffer */
5515 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5516 Unpicklertype__doc__, /* tp_doc */
5517 (traverseproc)Unpickler_traverse, /* tp_traverse */
5518 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005519};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005520
Guido van Rossum60456fd1997-04-09 17:36:32 +00005521static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005522 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5523 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005524 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005525 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005526 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005527 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005528
Martin v. Löwis544f1192004-07-27 05:22:33 +00005529 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5530 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005531 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005532 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005533 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005534 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005535
Neal Norwitzb0493252002-03-31 14:44:22 +00005536 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005537 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005538
Neal Norwitzb0493252002-03-31 14:44:22 +00005539 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005540 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005541
Martin v. Löwis544f1192004-07-27 05:22:33 +00005542 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5543 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005544 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005545 "This takes a file-like object for writing a pickle data stream.\n"
5546 "The optional proto argument tells the pickler to use the given\n"
5547 "protocol; supported protocols are 0, 1, 2. The default\n"
5548 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5549 "only protocol that can be written to a file opened in text\n"
5550 "mode and read back successfully. When using a protocol higher\n"
5551 "than 0, make sure the file is opened in binary mode, both when\n"
5552 "pickling and unpickling.)\n"
5553 "\n"
5554 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5555 "more efficient than protocol 1.\n"
5556 "\n"
5557 "Specifying a negative protocol version selects the highest\n"
5558 "protocol version supported. The higher the protocol used, the\n"
5559 "more recent the version of Python needed to read the pickle\n"
5560 "produced.\n"
5561 "\n"
5562 "The file parameter must have a write() method that accepts a single\n"
5563 "string argument. It can thus be an open file object, a StringIO\n"
5564 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005565 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005566
Neal Norwitzb0493252002-03-31 14:44:22 +00005567 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005568 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5569
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005570 { NULL, NULL }
5571};
5572
Guido van Rossum60456fd1997-04-09 17:36:32 +00005573static int
Tim Peterscba30e22003-02-01 06:24:36 +00005574init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005575{
5576 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005577
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005578#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005579
Tim Peters3cfe7542003-05-21 21:29:48 +00005580 if (PyType_Ready(&Unpicklertype) < 0)
5581 return -1;
5582 if (PyType_Ready(&Picklertype) < 0)
5583 return -1;
5584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005585 INIT_STR(__class__);
5586 INIT_STR(__getinitargs__);
5587 INIT_STR(__dict__);
5588 INIT_STR(__getstate__);
5589 INIT_STR(__setstate__);
5590 INIT_STR(__name__);
5591 INIT_STR(__main__);
5592 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005593 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005594 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005595 INIT_STR(append);
5596 INIT_STR(read);
5597 INIT_STR(readline);
5598 INIT_STR(copy_reg);
5599 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005600 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005601
Tim Peterscba30e22003-02-01 06:24:36 +00005602 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005603 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005604
Tim Peters1f1b2d22003-02-01 02:16:37 +00005605 /* This is special because we want to use a different
5606 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005607 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005608 if (!dispatch_table) return -1;
5609
5610 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005611 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005612 if (!extension_registry) return -1;
5613
5614 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005615 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005616 if (!inverted_registry) return -1;
5617
5618 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005619 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005620 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005622 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005623
Tim Peters731098b2003-02-04 20:56:09 +00005624 if (!(empty_tuple = PyTuple_New(0)))
5625 return -1;
5626
5627 two_tuple = PyTuple_New(2);
5628 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005629 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005630 /* We use this temp container with no regard to refcounts, or to
5631 * keeping containees alive. Exempt from GC, because we don't
5632 * want anything looking at two_tuple() by magic.
5633 */
5634 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005636 /* Ugh */
5637 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5638 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5639 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005641 if (!( t=PyDict_New())) return -1;
5642 if (!( r=PyRun_String(
5643 "def __init__(self, *args): self.args=args\n\n"
5644 "def __str__(self):\n"
5645 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5646 Py_file_input,
5647 module_dict, t) )) return -1;
5648 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005650 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005651 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005652 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005654 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005655
Tim Peterscba30e22003-02-01 06:24:36 +00005656 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005657 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005658 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005659 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005661 if (!( t=PyDict_New())) return -1;
5662 if (!( r=PyRun_String(
5663 "def __init__(self, *args): self.args=args\n\n"
5664 "def __str__(self):\n"
5665 " a=self.args\n"
5666 " a=a and type(a[0]) or '(what)'\n"
5667 " return 'Cannot pickle %s objects' % a\n"
5668 , Py_file_input,
5669 module_dict, t) )) return -1;
5670 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005672 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005673 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005674 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005676 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005678 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005679 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005680 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005681
Martin v. Löwis658009a2002-09-16 17:26:24 +00005682 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5683 UnpicklingError, NULL)))
5684 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005686 if (PyDict_SetItemString(module_dict, "PickleError",
5687 PickleError) < 0)
5688 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005690 if (PyDict_SetItemString(module_dict, "PicklingError",
5691 PicklingError) < 0)
5692 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005694 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5695 UnpicklingError) < 0)
5696 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005698 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5699 UnpickleableError) < 0)
5700 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005702 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5703 BadPickleGet) < 0)
5704 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005706 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005708 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005709}
5710
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005711#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5712#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005713#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005714PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005715initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005716{
5717 PyObject *m, *d, *di, *v, *k;
5718 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005719 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005720 PyObject *format_version;
5721 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005723 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005724 Unpicklertype.ob_type = &PyType_Type;
5725 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005728 * so we're forced to use a temporary dictionary. :(
5729 */
5730 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005731 if (!di) return;
5732 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005734 /* Create the module and add the functions */
5735 m = Py_InitModule4("cPickle", cPickle_methods,
5736 cPickle_module_documentation,
5737 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005739 /* Add some symbolic constants to the module */
5740 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005741 v = PyString_FromString(rev);
5742 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005743 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005745 /* Copy data from di. Waaa. */
5746 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5747 if (PyObject_SetItem(d, k, v) < 0) {
5748 Py_DECREF(di);
5749 return;
5750 }
5751 }
5752 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005753
Tim Peters8587b3c2003-02-13 15:44:41 +00005754 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5755 if (i < 0)
5756 return;
5757
Tim Peters5b7da392003-02-04 00:21:07 +00005758 /* These are purely informational; no code uses them. */
5759 /* File format version we write. */
5760 format_version = PyString_FromString("2.0");
5761 /* Format versions we can read. */
5762 compatible_formats = Py_BuildValue("[sssss]",
5763 "1.0", /* Original protocol 0 */
5764 "1.1", /* Protocol 0 + INST */
5765 "1.2", /* Original protocol 1 */
5766 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005767 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005768 PyDict_SetItemString(d, "format_version", format_version);
5769 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5770 Py_XDECREF(format_version);
5771 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005772}