blob: a9bbd3639cc0ce45e8281e3376cb86262919a6b1 [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. */
18#define CURRENT_PROTOCOL_NUMBER 2
19
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,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000124 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000125 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000126 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000127
Guido van Rossum053b8df1998-11-25 16:18:00 +0000128/*************************************************************************
129 Internal Data type for pickle data. */
130
131typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000132 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000133 int length; /* number of initial slots in data currently used */
134 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000135 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000136} Pdata;
137
Tim Peters84e87f32001-03-17 04:50:51 +0000138static void
Tim Peterscba30e22003-02-01 06:24:36 +0000139Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000140{
141 int i;
142 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000143
Tim Peters1d63c9f2003-02-02 20:29:39 +0000144 for (i = self->length, p = self->data; --i >= 0; p++) {
145 Py_DECREF(*p);
146 }
147 if (self->data)
148 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000149 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000150}
151
152static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000153 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
154 (destructor)Pdata_dealloc,
155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000156};
157
158#define Pdata_Check(O) ((O)->ob_type == &PdataType)
159
160static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000161Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000162{
163 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Tim Peters1d63c9f2003-02-02 20:29:39 +0000165 if (!(self = PyObject_New(Pdata, &PdataType)))
166 return NULL;
167 self->size = 8;
168 self->length = 0;
169 self->data = malloc(self->size * sizeof(PyObject*));
170 if (self->data)
171 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172 Py_DECREF(self);
173 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174}
175
Tim Peters84e87f32001-03-17 04:50:51 +0000176static int
Tim Peterscba30e22003-02-01 06:24:36 +0000177stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178{
179 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
180 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000181}
182
Tim Peters1d63c9f2003-02-02 20:29:39 +0000183/* Retain only the initial clearto items. If clearto >= the current
184 * number of items, this is a (non-erroneous) NOP.
185 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000186static int
Tim Peterscba30e22003-02-01 06:24:36 +0000187Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000188{
189 int i;
190 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000192 if (clearto < 0) return stackUnderflow();
193 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000194
Tim Peters1d63c9f2003-02-02 20:29:39 +0000195 for (i = self->length, p = self->data + clearto;
196 --i >= clearto;
197 p++) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000198 Py_DECREF(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000199 }
200 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000202 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000203}
204
Tim Peters84e87f32001-03-17 04:50:51 +0000205static int
Tim Peterscba30e22003-02-01 06:24:36 +0000206Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000207{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000208 int bigger;
209 size_t nbytes;
210
Tim Peters1d63c9f2003-02-02 20:29:39 +0000211 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000212 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 goto nomemory;
214 if ((int)(size_t)bigger != bigger)
215 goto nomemory;
216 nbytes = (size_t)bigger * sizeof(PyObject *);
217 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
218 goto nomemory;
219 self->data = realloc(self->data, nbytes);
220 if (self->data == NULL)
221 goto nomemory;
222 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000224
225 nomemory:
226 self->size = 0;
227 PyErr_NoMemory();
228 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000229}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000230
Tim Peterse0a39072003-02-03 15:45:56 +0000231/* D is a Pdata*. Pop the topmost element and store it into V, which
232 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000233 * is raised and V is set to NULL. D and V may be evaluated several times.
234 */
235#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000236 if ((D)->length) \
237 (V) = (D)->data[--((D)->length)]; \
238 else { \
239 PyErr_SetString(UnpicklingError, "bad pickle data"); \
240 (V) = NULL; \
241 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000242}
243
Tim Peterse0a39072003-02-03 15:45:56 +0000244/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
245 * D. If the Pdata stack can't be grown to hold the new value, both
246 * raise MemoryError and execute "return ER". The difference is in ownership
247 * of O after: _PUSH transfers ownership of O from the caller to the stack
248 * (no incref of O is done, and in case of error O is decrefed), while
249 * _APPEND pushes a new reference.
250 */
251
252/* Push O on stack D, giving ownership of O to the stack. */
253#define PDATA_PUSH(D, O, ER) { \
254 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
255 Pdata_grow((Pdata*)(D)) < 0) { \
256 Py_DECREF(O); \
257 return ER; \
258 } \
259 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
260}
261
262/* Push O on stack D, pushing a new reference. */
263#define PDATA_APPEND(D, O, ER) { \
264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
265 Pdata_grow((Pdata*)(D)) < 0) \
266 return ER; \
267 Py_INCREF(O); \
268 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
269}
270
271
Guido van Rossum053b8df1998-11-25 16:18:00 +0000272static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000273Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000274{
275 PyObject *r;
276 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000277
Tim Peters1d63c9f2003-02-02 20:29:39 +0000278 l = self->length-start;
279 r = PyTuple_New(l);
280 if (r == NULL)
281 return NULL;
282 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000283 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000284
Tim Peters1d63c9f2003-02-02 20:29:39 +0000285 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000286 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000287}
288
289static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000290Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000291{
292 PyObject *r;
293 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000295 l=self->length-start;
296 if (!( r=PyList_New(l))) return NULL;
297 for (i=start, j=0 ; j < l; i++, j++)
298 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000300 self->length=start;
301 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000302}
303
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304/*************************************************************************/
305
306#define ARG_TUP(self, o) { \
307 if (self->arg || (self->arg=PyTuple_New(1))) { \
308 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
309 PyTuple_SET_ITEM(self->arg,0,o); \
310 } \
311 else { \
312 Py_DECREF(o); \
313 } \
314}
315
316#define FREE_ARG_TUP(self) { \
317 if (self->arg->ob_refcnt > 1) { \
318 Py_DECREF(self->arg); \
319 self->arg=NULL; \
320 } \
321 }
322
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000323typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000324 PyObject_HEAD
325 FILE *fp;
326 PyObject *write;
327 PyObject *file;
328 PyObject *memo;
329 PyObject *arg;
330 PyObject *pers_func;
331 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000332
333 /* pickle protocol number, >= 0 */
334 int proto;
335
336 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000337 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000340 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int (*write_func)(struct Picklerobject *, char *, int);
342 char *write_buf;
343 int buf_size;
344 PyObject *dispatch_table;
345 int fast_container; /* count nested container dumps */
346 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000347} Picklerobject;
348
Barry Warsaw52acb492001-12-21 20:04:22 +0000349#ifndef PY_CPICKLE_FAST_LIMIT
350#define PY_CPICKLE_FAST_LIMIT 50
351#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000352
Jeremy Hylton938ace62002-07-17 16:30:39 +0000353static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000354
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000355typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000356 PyObject_HEAD
357 FILE *fp;
358 PyObject *file;
359 PyObject *readline;
360 PyObject *read;
361 PyObject *memo;
362 PyObject *arg;
363 Pdata *stack;
364 PyObject *mark;
365 PyObject *pers_func;
366 PyObject *last_string;
367 int *marks;
368 int num_marks;
369 int marks_size;
370 int (*read_func)(struct Unpicklerobject *, char **, int);
371 int (*readline_func)(struct Unpicklerobject *, char **);
372 int buf_size;
373 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000375} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000376
Jeremy Hylton938ace62002-07-17 16:30:39 +0000377static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000378
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000379/* Forward decls that need the above structs */
380static int save(Picklerobject *, PyObject *, int);
381static int put2(Picklerobject *, PyObject *);
382
Guido van Rossumd385d591997-04-09 17:47:47 +0000383static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000385cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
386{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 va_list va;
388 PyObject *args=0, *retval=0;
389 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391 if (format) args = Py_VaBuildValue(format, va);
392 va_end(va);
393 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000394 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000395 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 if (retval) {
398 if (args) {
399 PyObject *v;
400 v=PyString_Format(retval, args);
401 Py_DECREF(retval);
402 Py_DECREF(args);
403 if (! v) return NULL;
404 retval=v;
405 }
406 }
407 else
408 if (args) retval=args;
409 else {
410 PyErr_SetObject(ErrType,Py_None);
411 return NULL;
412 }
413 PyErr_SetObject(ErrType,retval);
414 Py_DECREF(retval);
415 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Tim Peterscba30e22003-02-01 06:24:36 +0000419write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420{
421 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 if (s == NULL) {
424 return 0;
425 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000428 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000430 if (nbyteswritten != (size_t)n) {
431 PyErr_SetFromErrno(PyExc_IOError);
432 return -1;
433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000435 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000436}
437
Tim Peters84e87f32001-03-17 04:50:51 +0000438static int
Tim Peterscba30e22003-02-01 06:24:36 +0000439write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000440{
441 if (s == NULL) {
442 return 0;
443 }
Tim Peterscba30e22003-02-01 06:24:36 +0000444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000445 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
446 return -1;
447 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000449 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450}
451
Tim Peters84e87f32001-03-17 04:50:51 +0000452static int
Tim Peterscba30e22003-02-01 06:24:36 +0000453write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454{
455 if (s == NULL) return 0;
456 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Tim Peterscba30e22003-02-01 06:24:36 +0000460write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (s == NULL) {
465 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000466 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000468 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469 return -1;
470 }
471 else {
472 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
473 if (write_other(self, NULL, 0) < 0)
474 return -1;
475 }
Tim Peterscba30e22003-02-01 06:24:36 +0000476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000477 if (n > WRITE_BUF_SIZE) {
478 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000479 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 return -1;
481 }
482 else {
483 memcpy(self->write_buf + self->buf_size, s, n);
484 self->buf_size += n;
485 return n;
486 }
487 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (self->write) {
490 /* object with write method */
491 ARG_TUP(self, py_str);
492 if (self->arg) {
493 junk = PyObject_Call(self->write, self->arg, NULL);
494 FREE_ARG_TUP(self);
495 }
496 if (junk) Py_DECREF(junk);
497 else return -1;
498 }
499 else
500 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 self->buf_size = 0;
503 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504}
505
506
Tim Peters84e87f32001-03-17 04:50:51 +0000507static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000508read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509{
510 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512 if (self->buf_size == 0) {
513 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000516 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 PyErr_NoMemory();
518 return -1;
519 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521 self->buf_size = size;
522 }
523 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000524 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 if (!self->buf) {
526 PyErr_NoMemory();
527 return -1;
528 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 self->buf_size = n;
530 }
Tim Peters84e87f32001-03-17 04:50:51 +0000531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000532 Py_BEGIN_ALLOW_THREADS
533 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
534 Py_END_ALLOW_THREADS
535 if (nbytesread != (size_t)n) {
536 if (feof(self->fp)) {
537 PyErr_SetNone(PyExc_EOFError);
538 return -1;
539 }
Tim Peterscba30e22003-02-01 06:24:36 +0000540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 PyErr_SetFromErrno(PyExc_IOError);
542 return -1;
543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000548}
549
550
Tim Peters84e87f32001-03-17 04:50:51 +0000551static int
Tim Peterscba30e22003-02-01 06:24:36 +0000552readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553{
554 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000556 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000557 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 PyErr_NoMemory();
559 return -1;
560 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 self->buf_size = 40;
562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 i = 0;
565 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000566 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000568 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 (self->buf[i] = getc(self->fp)) == '\n') {
570 self->buf[i + 1] = '\0';
571 *s = self->buf;
572 return i + 1;
573 }
574 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000575 bigger = self->buf_size << 1;
576 if (bigger <= 0) { /* overflow */
577 PyErr_NoMemory();
578 return -1;
579 }
580 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 if (!self->buf) {
582 PyErr_NoMemory();
583 return -1;
584 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000585 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 }
Tim Peters84e87f32001-03-17 04:50:51 +0000587}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000588
589
Tim Peters84e87f32001-03-17 04:50:51 +0000590static int
Tim Peterscba30e22003-02-01 06:24:36 +0000591read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000592{
593 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
596 PyErr_SetNone(PyExc_EOFError);
597 return -1;
598 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000603}
604
605
Tim Peters84e87f32001-03-17 04:50:51 +0000606static int
Tim Peterscba30e22003-02-01 06:24:36 +0000607readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608{
609 int n;
610 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
613 return -1;
614 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000619}
620
621
Tim Peters84e87f32001-03-17 04:50:51 +0000622static int
Tim Peterscba30e22003-02-01 06:24:36 +0000623read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624{
625 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629 ARG_TUP(self, bytes);
630 if (self->arg) {
631 str = PyObject_Call(self->read, self->arg, NULL);
632 FREE_ARG_TUP(self);
633 }
634 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 Py_XDECREF(self->last_string);
637 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639 if (! (*s = PyString_AsString(str))) return -1;
640 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641}
642
643
Tim Peters84e87f32001-03-17 04:50:51 +0000644static int
Tim Peterscba30e22003-02-01 06:24:36 +0000645readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000646{
647 PyObject *str;
648 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
651 return -1;
652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if ((str_size = PyString_Size(str)) < 0)
655 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 Py_XDECREF(self->last_string);
658 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000660 if (! (*s = PyString_AsString(str)))
661 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664}
665
Tim Petersee1a53c2003-02-02 02:57:53 +0000666/* Copy the first n bytes from s into newly malloc'ed memory, plus a
667 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
668 * The caller is responsible for free()'ing the return value.
669 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000670static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000671pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672{
Tim Petersee1a53c2003-02-02 02:57:53 +0000673 char *r = (char *)malloc(n+1);
674 if (r == NULL)
675 return (char*)PyErr_NoMemory();
676 memcpy(r, s, n);
677 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679}
680
681
682static int
Tim Peterscba30e22003-02-01 06:24:36 +0000683get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684{
685 PyObject *value, *mv;
686 long c_value;
687 char s[30];
688 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 if (!( mv = PyDict_GetItem(self->memo, id))) {
691 PyErr_SetObject(PyExc_KeyError, id);
692 return -1;
693 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694
Tim Peterscba30e22003-02-01 06:24:36 +0000695 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698 if (!( PyInt_Check(value))) {
699 PyErr_SetString(PicklingError, "no int where int expected in memo");
700 return -1;
701 }
702 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 if (!self->bin) {
705 s[0] = GET;
706 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
707 len = strlen(s);
708 }
709 else if (Pdata_Check(self->file)) {
710 if (write_other(self, NULL, 0) < 0) return -1;
711 PDATA_APPEND(self->file, mv, -1);
712 return 0;
713 }
714 else {
715 if (c_value < 256) {
716 s[0] = BINGET;
717 s[1] = (int)(c_value & 0xff);
718 len = 2;
719 }
720 else {
721 s[0] = LONG_BINGET;
722 s[1] = (int)(c_value & 0xff);
723 s[2] = (int)((c_value >> 8) & 0xff);
724 s[3] = (int)((c_value >> 16) & 0xff);
725 s[4] = (int)((c_value >> 24) & 0xff);
726 len = 5;
727 }
728 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Tim Peters0bc93f52003-02-02 18:29:33 +0000730 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000731 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000732
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000733 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000734}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000735
Guido van Rossum60456fd1997-04-09 17:36:32 +0000736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737static int
Tim Peterscba30e22003-02-01 06:24:36 +0000738put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000739{
Tim Peterscba30e22003-02-01 06:24:36 +0000740 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000741 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000743 return put2(self, ob);
744}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000745
Guido van Rossum053b8df1998-11-25 16:18:00 +0000746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000747static int
Tim Peterscba30e22003-02-01 06:24:36 +0000748put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749{
750 char c_str[30];
751 int p;
752 size_t len;
753 int res = -1;
754 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 if (self->fast)
757 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 if ((p = PyDict_Size(self->memo)) < 0)
760 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000763 /* XXX Why?
764 * XXX And does "positive" really mean non-negative?
765 * XXX pickle.py starts with PUT index 0, not 1. This makes for
766 * XXX gratuitous differences between the pickling modules.
767 */
Tim Peterscba30e22003-02-01 06:24:36 +0000768 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Tim Peterscba30e22003-02-01 06:24:36 +0000770 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000772
Tim Peterscba30e22003-02-01 06:24:36 +0000773 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000775
Tim Peterscba30e22003-02-01 06:24:36 +0000776 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779 PyTuple_SET_ITEM(t, 0, memo_len);
780 Py_INCREF(memo_len);
781 PyTuple_SET_ITEM(t, 1, ob);
782 Py_INCREF(ob);
783
784 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
785 goto finally;
786
787 if (!self->bin) {
788 c_str[0] = PUT;
789 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
790 len = strlen(c_str);
791 }
792 else if (Pdata_Check(self->file)) {
793 if (write_other(self, NULL, 0) < 0) return -1;
794 PDATA_APPEND(self->file, memo_len, -1);
795 res=0; /* Job well done ;) */
796 goto finally;
797 }
798 else {
799 if (p >= 256) {
800 c_str[0] = LONG_BINPUT;
801 c_str[1] = (int)(p & 0xff);
802 c_str[2] = (int)((p >> 8) & 0xff);
803 c_str[3] = (int)((p >> 16) & 0xff);
804 c_str[4] = (int)((p >> 24) & 0xff);
805 len = 5;
806 }
807 else {
808 c_str[0] = BINPUT;
809 c_str[1] = p;
810 len = 2;
811 }
812 }
813
Tim Peters0bc93f52003-02-02 18:29:33 +0000814 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 goto finally;
816
817 res = 0;
818
819 finally:
820 Py_XDECREF(py_ob_id);
821 Py_XDECREF(memo_len);
822 Py_XDECREF(t);
823
824 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000825}
826
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000827#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000828
829static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000830PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831{
832 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
833 static PyObject *standard_builtins=0;
834 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000836 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000837 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000839 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000840 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000841 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 return NULL;
843 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 if ((globals=PyEval_GetGlobals())) {
846 Py_INCREF(globals);
847 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000848 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 goto err;
850 }
851 else {
852 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000854 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000855 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000856 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 __builtins__=standard_builtins;
859 Py_INCREF(__builtins__);
860 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000861 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 goto err;
863 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 if (PyDict_Check(__builtins__)) {
866 __import__=PyObject_GetItem(__builtins__,__import___str);
867 if (!__import__) goto err;
868 }
869 else {
870 __import__=PyObject_GetAttr(__builtins__,__import___str);
871 if (!__import__) goto err;
872 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 r=PyObject_CallFunction(__import__,"OOOO",
875 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000876 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000879 Py_DECREF(globals);
880 Py_DECREF(__builtins__);
881 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 return r;
884 err:
885 Py_XDECREF(globals);
886 Py_XDECREF(__builtins__);
887 Py_XDECREF(__import__);
888 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000889}
890
891static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000892whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000893{
894 int i, j;
895 PyObject *module = 0, *modules_dict = 0,
896 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 module = PyObject_GetAttrString(global, "__module__");
899 if (module) return module;
900 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000901
Tim Peterscba30e22003-02-01 06:24:36 +0000902 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000905 i = 0;
906 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000908 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 global_name_attr = PyObject_GetAttr(module, global_name);
911 if (!global_name_attr) {
912 PyErr_Clear();
913 continue;
914 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 if (global_name_attr != global) {
917 Py_DECREF(global_name_attr);
918 continue;
919 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000921 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000923 break;
924 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000926 /* The following implements the rule in pickle.py added in 1.5
927 that used __main__ if no module is found. I don't actually
928 like this rule. jlf
929 */
930 if (!j) {
931 j=1;
932 name=__main___str;
933 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000935 Py_INCREF(name);
936 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000937}
938
939
Guido van Rossum60456fd1997-04-09 17:36:32 +0000940static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000941fast_save_enter(Picklerobject *self, PyObject *obj)
942{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000943 /* if fast_container < 0, we're doing an error exit. */
944 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
945 PyObject *key = NULL;
946 if (self->fast_memo == NULL) {
947 self->fast_memo = PyDict_New();
948 if (self->fast_memo == NULL) {
949 self->fast_container = -1;
950 return 0;
951 }
952 }
953 key = PyLong_FromVoidPtr(obj);
954 if (key == NULL)
955 return 0;
956 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000957 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 PyErr_Format(PyExc_ValueError,
959 "fast mode: can't pickle cyclic objects including object type %s at %p",
960 obj->ob_type->tp_name, obj);
961 self->fast_container = -1;
962 return 0;
963 }
964 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000965 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000966 self->fast_container = -1;
967 return 0;
968 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000969 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000970 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000972}
973
Tim Peterscba30e22003-02-01 06:24:36 +0000974int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000975fast_save_leave(Picklerobject *self, PyObject *obj)
976{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
978 PyObject *key = PyLong_FromVoidPtr(obj);
979 if (key == NULL)
980 return 0;
981 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000982 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 return 0;
984 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000985 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000986 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000987 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000988}
989
990static int
Tim Peterscba30e22003-02-01 06:24:36 +0000991save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000992{
993 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000994 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000997 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000998}
999
Guido van Rossum77f6a652002-04-03 22:41:51 +00001000static int
Tim Peterscba30e22003-02-01 06:24:36 +00001001save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +00001002{
Guido van Rossume2763392002-04-05 19:30:08 +00001003 static char *buf[2] = {FALSE, TRUE};
1004 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +00001005 long l = PyInt_AS_LONG((PyIntObject *)args);
1006
Tim Peters3c67d792003-02-02 17:59:11 +00001007 if (self->proto >= 2) {
1008 char opcode = l ? NEWTRUE : NEWFALSE;
1009 if (self->write_func(self, &opcode, 1) < 0)
1010 return -1;
1011 }
1012 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +00001013 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001014 return 0;
1015}
Tim Peters84e87f32001-03-17 04:50:51 +00001016
Guido van Rossum60456fd1997-04-09 17:36:32 +00001017static int
Tim Peterscba30e22003-02-01 06:24:36 +00001018save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019{
1020 char c_str[32];
1021 long l = PyInt_AS_LONG((PyIntObject *)args);
1022 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001025#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 || l > 0x7fffffffL
1027 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001028#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 ) {
1030 /* Text-mode pickle, or long too big to fit in the 4-byte
1031 * signed BININT format: store as a string.
1032 */
1033 c_str[0] = INT;
1034 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001035 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001036 return -1;
1037 }
1038 else {
1039 /* Binary pickle and l fits in a signed 4-byte int. */
1040 c_str[1] = (int)( l & 0xff);
1041 c_str[2] = (int)((l >> 8) & 0xff);
1042 c_str[3] = (int)((l >> 16) & 0xff);
1043 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1046 if (c_str[2] == 0) {
1047 c_str[0] = BININT1;
1048 len = 2;
1049 }
1050 else {
1051 c_str[0] = BININT2;
1052 len = 3;
1053 }
1054 }
1055 else {
1056 c_str[0] = BININT;
1057 len = 5;
1058 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001059
Tim Peters0bc93f52003-02-02 18:29:33 +00001060 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001061 return -1;
1062 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001064 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001065}
1066
1067
1068static int
Tim Peterscba30e22003-02-01 06:24:36 +00001069save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001070{
Tim Petersee1a53c2003-02-02 02:57:53 +00001071 int size;
1072 int res = -1;
1073 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001075 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001076
Tim Petersee1a53c2003-02-02 02:57:53 +00001077 if (self->proto >= 2) {
1078 /* Linear-time pickling. */
1079 size_t nbits;
1080 size_t nbytes;
1081 unsigned char *pdata;
1082 char c_str[5];
1083 int i;
1084 int sign = _PyLong_Sign(args);
1085
1086 if (sign == 0) {
1087 /* It's 0 -- an empty bytestring. */
1088 c_str[0] = LONG1;
1089 c_str[1] = 0;
1090 i = self->write_func(self, c_str, 2);
1091 if (i < 0) goto finally;
1092 res = 0;
1093 goto finally;
1094 }
1095 nbits = _PyLong_NumBits(args);
1096 if (nbits == (size_t)-1 && PyErr_Occurred())
1097 goto finally;
1098 /* How many bytes do we need? There are nbits >> 3 full
1099 * bytes of data, and nbits & 7 leftover bits. If there
1100 * are any leftover bits, then we clearly need another
1101 * byte. Wnat's not so obvious is that we *probably*
1102 * need another byte even if there aren't any leftovers:
1103 * the most-significant bit of the most-significant byte
1104 * acts like a sign bit, and it's usually got a sense
1105 * opposite of the one we need. The exception is longs
1106 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1107 * its own 256's-complement, so has the right sign bit
1108 * even without the extra byte. That's a pain to check
1109 * for in advance, though, so we always grab an extra
1110 * byte at the start, and cut it back later if possible.
1111 */
1112 nbytes = (nbits >> 3) + 1;
1113 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1114 PyErr_SetString(PyExc_OverflowError, "long too large "
1115 "to pickle");
1116 goto finally;
1117 }
1118 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1119 if (repr == NULL) goto finally;
1120 pdata = (unsigned char *)PyString_AS_STRING(repr);
1121 i = _PyLong_AsByteArray((PyLongObject *)args,
1122 pdata, nbytes,
1123 1 /* little endian */, 1 /* signed */);
1124 if (i < 0) goto finally;
1125 /* If the long is negative, this may be a byte more than
1126 * needed. This is so iff the MSB is all redundant sign
1127 * bits.
1128 */
1129 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1130 (pdata[nbytes - 2] & 0x80) != 0)
1131 --nbytes;
1132
1133 if (nbytes < 256) {
1134 c_str[0] = LONG1;
1135 c_str[1] = (char)nbytes;
1136 size = 2;
1137 }
1138 else {
1139 c_str[0] = LONG4;
1140 size = (int)nbytes;
1141 for (i = 1; i < 5; i++) {
1142 c_str[i] = (char)(size & 0xff);
1143 size >>= 8;
1144 }
1145 size = 5;
1146 }
1147 i = self->write_func(self, c_str, size);
1148 if (i < 0) goto finally;
1149 i = self->write_func(self, (char *)pdata, (int)nbytes);
1150 if (i < 0) goto finally;
1151 res = 0;
1152 goto finally;
1153 }
1154
1155 /* proto < 2: write the repr and newline. This is quadratic-time
1156 * (in the number of digits), in both directions.
1157 */
Tim Peterscba30e22003-02-01 06:24:36 +00001158 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 if ((size = PyString_Size(repr)) < 0)
1162 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Tim Peters0bc93f52003-02-02 18:29:33 +00001164 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Tim Peters0bc93f52003-02-02 18:29:33 +00001167 if (self->write_func(self,
1168 PyString_AS_STRING((PyStringObject *)repr),
1169 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
Tim Peters0bc93f52003-02-02 18:29:33 +00001172 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001177 finally:
1178 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180}
1181
1182
1183static int
Tim Peterscba30e22003-02-01 06:24:36 +00001184save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185{
1186 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 if (self->bin) {
1189 int s, e;
1190 double f;
1191 long fhi, flo;
1192 char str[9];
1193 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 *p = BINFLOAT;
1196 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 if (x < 0) {
1199 s = 1;
1200 x = -x;
1201 }
1202 else
1203 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001205 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 /* Normalize f to be in the range [1.0, 2.0) */
1208 if (0.5 <= f && f < 1.0) {
1209 f *= 2.0;
1210 e--;
1211 }
1212 else if (f == 0.0) {
1213 e = 0;
1214 }
1215 else {
1216 PyErr_SetString(PyExc_SystemError,
1217 "frexp() result out of range");
1218 return -1;
1219 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 if (e >= 1024) {
1222 /* XXX 1024 itself is reserved for Inf/NaN */
1223 PyErr_SetString(PyExc_OverflowError,
1224 "float too large to pack with d format");
1225 return -1;
1226 }
1227 else if (e < -1022) {
1228 /* Gradual underflow */
1229 f = ldexp(f, 1022 + e);
1230 e = 0;
1231 }
1232 else if (!(e == 0 && f == 0.0)) {
1233 e += 1023;
1234 f -= 1.0; /* Get rid of leading 1 */
1235 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001236
Tim Peterscba30e22003-02-01 06:24:36 +00001237 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 flo the low 24 bits (== 52 bits) */
1239 f *= 268435456.0; /* 2**28 */
1240 fhi = (long) floor(f); /* Truncate */
1241 f -= (double)fhi;
1242 f *= 16777216.0; /* 2**24 */
1243 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 /* First byte */
1246 *p = (s<<7) | (e>>4);
1247 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001249 /* Second byte */
1250 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1251 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 /* Third byte */
1254 *p = (unsigned char) ((fhi>>16) & 0xFF);
1255 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 /* Fourth byte */
1258 *p = (unsigned char) ((fhi>>8) & 0xFF);
1259 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 /* Fifth byte */
1262 *p = (unsigned char) (fhi & 0xFF);
1263 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 /* Sixth byte */
1266 *p = (unsigned char) ((flo>>16) & 0xFF);
1267 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001269 /* Seventh byte */
1270 *p = (unsigned char) ((flo>>8) & 0xFF);
1271 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 /* Eighth byte */
1274 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001275
Tim Peters0bc93f52003-02-02 18:29:33 +00001276 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001277 return -1;
1278 }
1279 else {
1280 char c_str[250];
1281 c_str[0] = FLOAT;
1282 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001283
Tim Peters0bc93f52003-02-02 18:29:33 +00001284 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 return -1;
1286 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001289}
1290
1291
1292static int
Tim Peterscba30e22003-02-01 06:24:36 +00001293save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294{
1295 int size, len;
1296 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 if ((size = PyString_Size(args)) < 0)
1299 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 if (!self->bin) {
1302 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001305
Tim Peterscba30e22003-02-01 06:24:36 +00001306 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 if ((len = PyString_Size(repr)) < 0)
1310 goto err;
1311 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001312
Tim Peters0bc93f52003-02-02 18:29:33 +00001313 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Tim Peters0bc93f52003-02-02 18:29:33 +00001316 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001318
Tim Peters0bc93f52003-02-02 18:29:33 +00001319 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 Py_XDECREF(repr);
1323 }
1324 else {
1325 int i;
1326 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 if ((size = PyString_Size(args)) < 0)
1329 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if (size < 256) {
1332 c_str[0] = SHORT_BINSTRING;
1333 c_str[1] = size;
1334 len = 2;
1335 }
1336 else {
1337 c_str[0] = BINSTRING;
1338 for (i = 1; i < 5; i++)
1339 c_str[i] = (int)(size >> ((i - 1) * 8));
1340 len = 5;
1341 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001342
Tim Peters0bc93f52003-02-02 18:29:33 +00001343 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001346 if (size > 128 && Pdata_Check(self->file)) {
1347 if (write_other(self, NULL, 0) < 0) return -1;
1348 PDATA_APPEND(self->file, args, -1);
1349 }
1350 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001351 if (self->write_func(self,
1352 PyString_AS_STRING(
1353 (PyStringObject *)args),
1354 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 return -1;
1356 }
1357 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 if (doput)
1360 if (put(self, args) < 0)
1361 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 err:
1366 Py_XDECREF(repr);
1367 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368}
1369
1370
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001371#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001372/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1373 backslash and newline characters to \uXXXX escapes. */
1374static PyObject *
1375modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1376{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 PyObject *repr;
1378 char *p;
1379 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 repr = PyString_FromStringAndSize(NULL, 6 * size);
1384 if (repr == NULL)
1385 return NULL;
1386 if (size == 0)
1387 return repr;
1388
1389 p = q = PyString_AS_STRING(repr);
1390 while (size-- > 0) {
1391 Py_UNICODE ch = *s++;
1392 /* Map 16-bit characters to '\uxxxx' */
1393 if (ch >= 256 || ch == '\\' || ch == '\n') {
1394 *p++ = '\\';
1395 *p++ = 'u';
1396 *p++ = hexdigit[(ch >> 12) & 0xf];
1397 *p++ = hexdigit[(ch >> 8) & 0xf];
1398 *p++ = hexdigit[(ch >> 4) & 0xf];
1399 *p++ = hexdigit[ch & 15];
1400 }
1401 /* Copy everything else as-is */
1402 else
1403 *p++ = (char) ch;
1404 }
1405 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001406 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001407 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001408}
1409
1410
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411static int
Tim Peterscba30e22003-02-01 06:24:36 +00001412save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413{
1414 int size, len;
1415 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 if (!PyUnicode_Check(args))
1418 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 if (!self->bin) {
1421 char *repr_str;
1422 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 repr = modified_EncodeRawUnicodeEscape(
1425 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001426 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 if ((len = PyString_Size(repr)) < 0)
1430 goto err;
1431 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001432
Tim Peters0bc93f52003-02-02 18:29:33 +00001433 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001435
Tim Peters0bc93f52003-02-02 18:29:33 +00001436 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Tim Peters0bc93f52003-02-02 18:29:33 +00001439 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001442 Py_XDECREF(repr);
1443 }
1444 else {
1445 int i;
1446 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001447
Tim Peterscba30e22003-02-01 06:24:36 +00001448 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001449 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001451 if ((size = PyString_Size(repr)) < 0)
1452 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 c_str[0] = BINUNICODE;
1455 for (i = 1; i < 5; i++)
1456 c_str[i] = (int)(size >> ((i - 1) * 8));
1457 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001458
Tim Peters0bc93f52003-02-02 18:29:33 +00001459 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 if (size > 128 && Pdata_Check(self->file)) {
1463 if (write_other(self, NULL, 0) < 0)
1464 goto err;
1465 PDATA_APPEND(self->file, repr, -1);
1466 }
1467 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001468 if (self->write_func(self, PyString_AS_STRING(repr),
1469 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 goto err;
1471 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 Py_DECREF(repr);
1474 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 if (doput)
1477 if (put(self, args) < 0)
1478 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001480 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482 err:
1483 Py_XDECREF(repr);
1484 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001485}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001486#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001487
Tim Peters1d63c9f2003-02-02 20:29:39 +00001488/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1489static int
Tim Peters67920142003-02-05 03:46:17 +00001490store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001491{
1492 int i;
1493 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001494
Tim Peters1d63c9f2003-02-02 20:29:39 +00001495 assert(PyTuple_Size(t) == len);
1496
1497 for (i = 0; i < len; i++) {
1498 PyObject *element = PyTuple_GET_ITEM(t, i);
1499
1500 if (element == NULL)
1501 goto finally;
1502 if (save(self, element, 0) < 0)
1503 goto finally;
1504 }
1505 res = 0;
1506
1507 finally:
1508 return res;
1509}
1510
1511/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1512 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001513 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001514 * (a tuple can be reached from itself), and that requires some subtle
1515 * magic so that it works in all cases. IOW, this is a long routine.
1516 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001517static int
Tim Peterscba30e22003-02-01 06:24:36 +00001518save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001520 PyObject *py_tuple_id = NULL;
1521 int len, i;
1522 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 static char pop = POP;
1526 static char pop_mark = POP_MARK;
1527 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 if ((len = PyTuple_Size(args)) < 0)
1530 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001531
Tim Peters1d63c9f2003-02-02 20:29:39 +00001532 if (len == 0) {
1533 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001534
Tim Peters1d63c9f2003-02-02 20:29:39 +00001535 if (self->proto) {
1536 c_str[0] = EMPTY_TUPLE;
1537 len = 1;
1538 }
1539 else {
1540 c_str[0] = MARK;
1541 c_str[1] = TUPLE;
1542 len = 2;
1543 }
1544 if (self->write_func(self, c_str, len) >= 0)
1545 res = 0;
1546 /* Don't memoize an empty tuple. */
1547 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001549
Tim Peters1d63c9f2003-02-02 20:29:39 +00001550 /* A non-empty tuple. */
1551
1552 /* id(tuple) isn't in the memo now. If it shows up there after
1553 * saving the tuple elements, the tuple must be recursive, in
1554 * which case we'll pop everything we put on the stack, and fetch
1555 * its value from the memo.
1556 */
1557 py_tuple_id = PyLong_FromVoidPtr(args);
1558 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001560
Tim Peters1d63c9f2003-02-02 20:29:39 +00001561 if (len <= 3 && self->proto >= 2) {
1562 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001563 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001564 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001566 /* pop the len elements */
1567 for (i = 0; i < len; ++i)
1568 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001569 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001570 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 if (get(self, py_tuple_id) < 0)
1572 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 res = 0;
1574 goto finally;
1575 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001576 /* Not recursive. */
1577 if (self->write_func(self, len2opcode + len, 1) < 0)
1578 goto finally;
1579 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581
Tim Peters1d63c9f2003-02-02 20:29:39 +00001582 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1583 * Generate MARK elt1 elt2 ... TUPLE
1584 */
1585 if (self->write_func(self, &MARKv, 1) < 0)
1586 goto finally;
1587
Tim Peters67920142003-02-05 03:46:17 +00001588 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001589 goto finally;
1590
1591 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1592 /* pop the stack stuff we pushed */
1593 if (self->bin) {
1594 if (self->write_func(self, &pop_mark, 1) < 0)
1595 goto finally;
1596 }
1597 else {
1598 /* Note that we pop one more than len, to remove
1599 * the MARK too.
1600 */
1601 for (i = 0; i <= len; i++)
1602 if (self->write_func(self, &pop, 1) < 0)
1603 goto finally;
1604 }
1605 /* fetch from memo */
1606 if (get(self, py_tuple_id) >= 0)
1607 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 goto finally;
1609 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001610
Tim Peters1d63c9f2003-02-02 20:29:39 +00001611 /* Not recursive. */
1612 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001614
Tim Peters1d63c9f2003-02-02 20:29:39 +00001615 memoize:
1616 if (put(self, args) >= 0)
1617 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619 finally:
1620 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001622}
1623
Tim Peters1092d642003-02-11 21:06:20 +00001624/* iter is an iterator giving items, and we batch up chunks of
1625 * MARK item item ... item APPENDS
1626 * opcode sequences. Calling code should have arranged to first create an
1627 * empty list, or list-like object, for the APPENDS to operate on.
1628 * Returns 0 on success, <0 on error.
1629 */
1630static int
1631batch_list(Picklerobject *self, PyObject *iter)
1632{
1633 PyObject *obj;
1634 PyObject *slice[BATCHSIZE];
1635 int i, n;
1636
1637 static char append = APPEND;
1638 static char appends = APPENDS;
1639
1640 assert(iter != NULL);
1641
1642 if (self->proto == 0) {
1643 /* APPENDS isn't available; do one at a time. */
1644 for (;;) {
1645 obj = PyIter_Next(iter);
1646 if (obj == NULL) {
1647 if (PyErr_Occurred())
1648 return -1;
1649 break;
1650 }
1651 i = save(self, obj, 0);
1652 Py_DECREF(obj);
1653 if (i < 0)
1654 return -1;
1655 if (self->write_func(self, &append, 1) < 0)
1656 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001657 }
1658 return 0;
1659 }
1660
1661 /* proto > 0: write in batches of BATCHSIZE. */
1662 do {
1663 /* Get next group of (no more than) BATCHSIZE elements. */
1664 for (n = 0; n < BATCHSIZE; ++n) {
1665 obj = PyIter_Next(iter);
1666 if (obj == NULL) {
1667 if (PyErr_Occurred())
1668 goto BatchFailed;
1669 break;
1670 }
1671 slice[n] = obj;
1672 }
1673
1674 if (n > 1) {
1675 /* Pump out MARK, slice[0:n], APPENDS. */
1676 if (self->write_func(self, &MARKv, 1) < 0)
1677 goto BatchFailed;
1678 for (i = 0; i < n; ++i) {
1679 if (save(self, slice[i], 0) < 0)
1680 goto BatchFailed;
1681 }
1682 if (self->write_func(self, &appends, 1) < 0)
1683 goto BatchFailed;
1684 }
1685 else if (n == 1) {
1686 if (save(self, slice[0], 0) < 0)
1687 goto BatchFailed;
1688 if (self->write_func(self, &append, 1) < 0)
1689 goto BatchFailed;
1690 }
1691
1692 for (i = 0; i < n; ++i) {
1693 Py_DECREF(slice[i]);
1694 }
Tim Peters90975f12003-02-12 05:28:58 +00001695 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001696 return 0;
1697
1698BatchFailed:
1699 while (--n >= 0) {
1700 Py_DECREF(slice[n]);
1701 }
1702 return -1;
1703}
1704
Guido van Rossum60456fd1997-04-09 17:36:32 +00001705static int
Tim Peterscba30e22003-02-01 06:24:36 +00001706save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707{
Tim Peters1092d642003-02-11 21:06:20 +00001708 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001710 int len;
1711 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 if (self->fast && !fast_save_enter(self, args))
1714 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001715
Tim Peters1092d642003-02-11 21:06:20 +00001716 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001717 if (self->bin) {
1718 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001719 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 }
1721 else {
1722 s[0] = MARK;
1723 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001724 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001725 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001726
Tim Peters1092d642003-02-11 21:06:20 +00001727 if (self->write_func(self, s, len) < 0)
1728 goto finally;
1729
1730 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001731 if ((len = PyList_Size(args)) < 0)
1732 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001733
Tim Peters1092d642003-02-11 21:06:20 +00001734 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001736 if (put(self, args) >= 0)
1737 res = 0;
1738 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 }
Tim Peters90975f12003-02-12 05:28:58 +00001740 if (put2(self, args) < 0)
1741 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001742
Tim Peters1092d642003-02-11 21:06:20 +00001743 /* Materialize the list elements. */
1744 iter = PyObject_GetIter(args);
1745 if (iter == NULL)
1746 goto finally;
1747 res = batch_list(self, iter);
1748 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 finally:
1751 if (self->fast && !fast_save_leave(self, args))
1752 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755}
1756
1757
Tim Peters42f08ac2003-02-11 22:43:24 +00001758/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1759 * MARK key value ... key value SETITEMS
1760 * opcode sequences. Calling code should have arranged to first create an
1761 * empty dict, or dict-like object, for the SETITEMS to operate on.
1762 * Returns 0 on success, <0 on error.
1763 *
1764 * This is very much like batch_list(). The difference between saving
1765 * elements directly, and picking apart two-tuples, is so long-winded at
1766 * the C level, though, that attempts to combine these routines were too
1767 * ugly to bear.
1768 */
1769static int
1770batch_dict(Picklerobject *self, PyObject *iter)
1771{
1772 PyObject *p;
1773 PyObject *slice[BATCHSIZE];
1774 int i, n;
1775
1776 static char setitem = SETITEM;
1777 static char setitems = SETITEMS;
1778
1779 assert(iter != NULL);
1780
1781 if (self->proto == 0) {
1782 /* SETITEMS isn't available; do one at a time. */
1783 for (;;) {
1784 p = PyIter_Next(iter);
1785 if (p == NULL) {
1786 if (PyErr_Occurred())
1787 return -1;
1788 break;
1789 }
1790 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1791 PyErr_SetString(PyExc_TypeError, "dict items "
1792 "iterator must return 2-tuples");
1793 return -1;
1794 }
1795 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1796 if (i >= 0)
1797 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1798 Py_DECREF(p);
1799 if (i < 0)
1800 return -1;
1801 if (self->write_func(self, &setitem, 1) < 0)
1802 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001803 }
1804 return 0;
1805 }
1806
1807 /* proto > 0: write in batches of BATCHSIZE. */
1808 do {
1809 /* Get next group of (no more than) BATCHSIZE elements. */
1810 for (n = 0; n < BATCHSIZE; ++n) {
1811 p = PyIter_Next(iter);
1812 if (p == NULL) {
1813 if (PyErr_Occurred())
1814 goto BatchFailed;
1815 break;
1816 }
1817 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1818 PyErr_SetString(PyExc_TypeError, "dict items "
1819 "iterator must return 2-tuples");
1820 goto BatchFailed;
1821 }
1822 slice[n] = p;
1823 }
1824
1825 if (n > 1) {
1826 /* Pump out MARK, slice[0:n], SETITEMS. */
1827 if (self->write_func(self, &MARKv, 1) < 0)
1828 goto BatchFailed;
1829 for (i = 0; i < n; ++i) {
1830 p = slice[i];
1831 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1832 goto BatchFailed;
1833 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1834 goto BatchFailed;
1835 }
1836 if (self->write_func(self, &setitems, 1) < 0)
1837 goto BatchFailed;
1838 }
1839 else if (n == 1) {
1840 p = slice[0];
1841 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1842 goto BatchFailed;
1843 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1844 goto BatchFailed;
1845 if (self->write_func(self, &setitem, 1) < 0)
1846 goto BatchFailed;
1847 }
1848
1849 for (i = 0; i < n; ++i) {
1850 Py_DECREF(slice[i]);
1851 }
Tim Peters90975f12003-02-12 05:28:58 +00001852 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001853 return 0;
1854
1855BatchFailed:
1856 while (--n >= 0) {
1857 Py_DECREF(slice[n]);
1858 }
1859 return -1;
1860}
1861
Guido van Rossum60456fd1997-04-09 17:36:32 +00001862static int
Tim Peterscba30e22003-02-01 06:24:36 +00001863save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864{
Tim Peters42f08ac2003-02-11 22:43:24 +00001865 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001867 int len;
1868 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if (self->fast && !fast_save_enter(self, args))
1871 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001872
Tim Peters42f08ac2003-02-11 22:43:24 +00001873 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 if (self->bin) {
1875 s[0] = EMPTY_DICT;
1876 len = 1;
1877 }
1878 else {
1879 s[0] = MARK;
1880 s[1] = DICT;
1881 len = 2;
1882 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Tim Peters0bc93f52003-02-02 18:29:33 +00001884 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001886
Tim Peters42f08ac2003-02-11 22:43:24 +00001887 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001888 if ((len = PyDict_Size(args)) < 0)
1889 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001892 if (put(self, args) >= 0)
1893 res = 0;
1894 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 }
Tim Peters90975f12003-02-12 05:28:58 +00001896 if (put2(self, args) < 0)
1897 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001898
Tim Peters42f08ac2003-02-11 22:43:24 +00001899 /* Materialize the dict items. */
1900 iter = PyObject_CallMethod(args, "iteritems", "()");
1901 if (iter == NULL)
1902 goto finally;
1903 res = batch_dict(self, iter);
1904 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906 finally:
1907 if (self->fast && !fast_save_leave(self, args))
1908 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001910 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911}
1912
1913
Tim Peters84e87f32001-03-17 04:50:51 +00001914static int
Tim Peterscba30e22003-02-01 06:24:36 +00001915save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916{
1917 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1918 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1919 char *module_str, *name_str;
1920 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 if (self->fast && !fast_save_enter(self, args))
1925 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001926
Tim Peters0bc93f52003-02-02 18:29:33 +00001927 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Tim Peterscba30e22003-02-01 06:24:36 +00001930 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001931 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 if (self->bin) {
1934 if (save(self, class, 0) < 0)
1935 goto finally;
1936 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1939 PyObject *element = 0;
1940 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001943 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if ((len = PyObject_Size(class_args)) < 0)
1947 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001950 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 if (save(self, element, 0) < 0) {
1954 Py_DECREF(element);
1955 goto finally;
1956 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 Py_DECREF(element);
1959 }
1960 }
1961 else {
1962 PyErr_Clear();
1963 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 if (!self->bin) {
1966 if (!( name = ((PyClassObject *)class)->cl_name )) {
1967 PyErr_SetString(PicklingError, "class has no name");
1968 goto finally;
1969 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001970
Tim Peterscba30e22003-02-01 06:24:36 +00001971 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001973
Tim Peters84e87f32001-03-17 04:50:51 +00001974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if ((module_size = PyString_Size(module)) < 0 ||
1976 (name_size = PyString_Size(name)) < 0)
1977 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001979 module_str = PyString_AS_STRING((PyStringObject *)module);
1980 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Tim Peters0bc93f52003-02-02 18:29:33 +00001982 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001984
Tim Peters0bc93f52003-02-02 18:29:33 +00001985 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001987
Tim Peters0bc93f52003-02-02 18:29:33 +00001988 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001989 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001990
Tim Peters0bc93f52003-02-02 18:29:33 +00001991 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001993
Tim Peters0bc93f52003-02-02 18:29:33 +00001994 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001995 goto finally;
1996 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001997 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 goto finally;
1999 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002001 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2002 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002003 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 goto finally;
2005 }
2006 else {
2007 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002009 if (!( state = PyObject_GetAttr(args, __dict___str))) {
2010 PyErr_Clear();
2011 res = 0;
2012 goto finally;
2013 }
2014 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 if (!PyDict_Check(state)) {
2017 if (put2(self, args) < 0)
2018 goto finally;
2019 }
2020 else {
2021 if (put(self, args) < 0)
2022 goto finally;
2023 }
Tim Peters84e87f32001-03-17 04:50:51 +00002024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 if (save(self, state, 0) < 0)
2026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002027
Tim Peters0bc93f52003-02-02 18:29:33 +00002028 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 finally:
2034 if (self->fast && !fast_save_leave(self, args))
2035 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002037 Py_XDECREF(module);
2038 Py_XDECREF(class);
2039 Py_XDECREF(state);
2040 Py_XDECREF(getinitargs_func);
2041 Py_XDECREF(getstate_func);
2042 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002045}
2046
2047
Guido van Rossum60456fd1997-04-09 17:36:32 +00002048static int
Tim Peterscba30e22003-02-01 06:24:36 +00002049save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002051 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002052 char *name_str, *module_str;
2053 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002057 if (name) {
2058 global_name = name;
2059 Py_INCREF(global_name);
2060 }
2061 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002062 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 goto finally;
2064 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002065
Tim Peterscba30e22003-02-01 06:24:36 +00002066 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 if ((module_size = PyString_Size(module)) < 0 ||
2070 (name_size = PyString_Size(global_name)) < 0)
2071 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002073 module_str = PyString_AS_STRING((PyStringObject *)module);
2074 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002075
Guido van Rossum75bfd052002-12-24 18:10:07 +00002076 /* XXX This can be doing a relative import. Clearly it shouldn't,
2077 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 mod = PyImport_ImportModule(module_str);
2079 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 cPickle_ErrFormat(PicklingError,
2081 "Can't pickle %s: it's not found as %s.%s",
2082 "OSS", args, module, global_name);
2083 goto finally;
2084 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002085 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 if (klass == NULL) {
2087 cPickle_ErrFormat(PicklingError,
2088 "Can't pickle %s: it's not found as %s.%s",
2089 "OSS", args, module, global_name);
2090 goto finally;
2091 }
2092 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002093 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002095 "Can't pickle %s: it's not the same object "
2096 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 "OSS", args, module, global_name);
2098 goto finally;
2099 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002100 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002101
Tim Peters731098b2003-02-04 20:56:09 +00002102 if (self->proto >= 2) {
2103 /* See whether this is in the extension registry, and if
2104 * so generate an EXT opcode.
2105 */
2106 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002107 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002108 char c_str[5];
2109 int n;
2110
2111 PyTuple_SET_ITEM(two_tuple, 0, module);
2112 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2113 py_code = PyDict_GetItem(extension_registry, two_tuple);
2114 if (py_code == NULL)
2115 goto gen_global; /* not registered */
2116
2117 /* Verify py_code has the right type and value. */
2118 if (!PyInt_Check(py_code)) {
2119 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002120 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002121 "OO", args, py_code);
2122 goto finally;
2123 }
2124 code = PyInt_AS_LONG(py_code);
2125 if (code <= 0 || code > 0x7fffffffL) {
2126 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2127 "extension code %ld is out of range",
2128 "Ol", args, code);
2129 goto finally;
2130 }
2131
2132 /* Generate an EXT opcode. */
2133 if (code <= 0xff) {
2134 c_str[0] = EXT1;
2135 c_str[1] = (char)code;
2136 n = 2;
2137 }
2138 else if (code <= 0xffff) {
2139 c_str[0] = EXT2;
2140 c_str[1] = (char)(code & 0xff);
2141 c_str[2] = (char)((code >> 8) & 0xff);
2142 n = 3;
2143 }
2144 else {
2145 c_str[0] = EXT4;
2146 c_str[1] = (char)(code & 0xff);
2147 c_str[2] = (char)((code >> 8) & 0xff);
2148 c_str[3] = (char)((code >> 16) & 0xff);
2149 c_str[4] = (char)((code >> 24) & 0xff);
2150 n = 5;
2151 }
2152
2153 if (self->write_func(self, c_str, n) >= 0)
2154 res = 0;
2155 goto finally; /* and don't memoize */
2156 }
2157
2158 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002159 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002160 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002161
Tim Peters0bc93f52003-02-02 18:29:33 +00002162 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002163 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002164
Tim Peters0bc93f52003-02-02 18:29:33 +00002165 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002166 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002167
Tim Peters0bc93f52003-02-02 18:29:33 +00002168 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002169 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002170
Tim Peters0bc93f52003-02-02 18:29:33 +00002171 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002172 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 if (put(self, args) < 0)
2175 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002177 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 finally:
2180 Py_XDECREF(module);
2181 Py_XDECREF(global_name);
2182 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002185}
2186
Guido van Rossum60456fd1997-04-09 17:36:32 +00002187static int
Tim Peterscba30e22003-02-01 06:24:36 +00002188save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189{
2190 PyObject *pid = 0;
2191 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002193 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002195 Py_INCREF(args);
2196 ARG_TUP(self, args);
2197 if (self->arg) {
2198 pid = PyObject_Call(f, self->arg, NULL);
2199 FREE_ARG_TUP(self);
2200 }
2201 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002203 if (pid != Py_None) {
2204 if (!self->bin) {
2205 if (!PyString_Check(pid)) {
2206 PyErr_SetString(PicklingError,
2207 "persistent id must be string");
2208 goto finally;
2209 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002210
Tim Peters0bc93f52003-02-02 18:29:33 +00002211 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002212 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002214 if ((size = PyString_Size(pid)) < 0)
2215 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002216
Tim Peters0bc93f52003-02-02 18:29:33 +00002217 if (self->write_func(self,
2218 PyString_AS_STRING(
2219 (PyStringObject *)pid),
2220 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002221 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002222
Tim Peters0bc93f52003-02-02 18:29:33 +00002223 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002224 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226 res = 1;
2227 goto finally;
2228 }
2229 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002230 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002231 res = -1;
2232 else
2233 res = 1;
2234 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 goto finally;
2237 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002241 finally:
2242 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002244 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002245}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002246
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002247
Tim Peters84e87f32001-03-17 04:50:51 +00002248static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002249save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002250 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251{
2252 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002254 if (save(self, callable, 0) < 0)
2255 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 if (save(self, tup, 0) < 0)
2258 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002259
Tim Peters0bc93f52003-02-02 18:29:33 +00002260 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002261 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002263 if (ob != NULL) {
2264 if (state && !PyDict_Check(state)) {
2265 if (put2(self, ob) < 0)
2266 return -1;
2267 }
2268 else {
2269 if (put(self, ob) < 0)
2270 return -1;
2271 }
2272 }
Tim Peters84e87f32001-03-17 04:50:51 +00002273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002274 if (state) {
2275 if (save(self, state, 0) < 0)
2276 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002277
Tim Peters0bc93f52003-02-02 18:29:33 +00002278 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 return -1;
2280 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002283}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284
Guido van Rossum60456fd1997-04-09 17:36:32 +00002285static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002286save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287{
2288 PyTypeObject *type;
2289 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2290 *callable = 0, *state = 0;
2291 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002292
Martin v. Löwis5a395302002-08-04 08:20:23 +00002293 if (self->nesting++ > Py_GetRecursionLimit()){
2294 PyErr_SetString(PyExc_RuntimeError,
2295 "maximum recursion depth exceeded");
2296 goto finally;
2297 }
2298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 if (!pers_save && self->pers_func) {
2300 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2301 res = tmp;
2302 goto finally;
2303 }
2304 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 if (args == Py_None) {
2307 res = save_none(self, args);
2308 goto finally;
2309 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002314 case 'b':
2315 if (args == Py_False || args == Py_True) {
2316 res = save_bool(self, args);
2317 goto finally;
2318 }
2319 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002320 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321 if (type == &PyInt_Type) {
2322 res = save_int(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 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 if (type == &PyLong_Type) {
2329 res = save_long(self, args);
2330 goto finally;
2331 }
2332 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002333
Guido van Rossum60456fd1997-04-09 17:36:32 +00002334 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 if (type == &PyFloat_Type) {
2336 res = save_float(self, args);
2337 goto finally;
2338 }
2339 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002340
Guido van Rossum60456fd1997-04-09 17:36:32 +00002341 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002342 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2343 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 goto finally;
2345 }
2346 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002347
Guido van Rossum60456fd1997-04-09 17:36:32 +00002348 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2350 res = save_string(self, args, 0);
2351 goto finally;
2352 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002353
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002354#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002355 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2357 res = save_unicode(self, args, 0);
2358 goto finally;
2359 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002360#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002364 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002365 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367 if (PyDict_GetItem(self->memo, py_ob_id)) {
2368 if (get(self, py_ob_id) < 0)
2369 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 res = 0;
2372 goto finally;
2373 }
2374 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002376 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002377 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378 if (type == &PyString_Type) {
2379 res = save_string(self, args, 1);
2380 goto finally;
2381 }
2382 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002383
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002384#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002385 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 if (type == &PyUnicode_Type) {
2387 res = save_unicode(self, args, 1);
2388 goto finally;
2389 }
2390 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002391#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002392
Guido van Rossum60456fd1997-04-09 17:36:32 +00002393 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002394 if (type == &PyTuple_Type) {
2395 res = save_tuple(self, args);
2396 goto finally;
2397 }
2398 if (type == &PyType_Type) {
2399 res = save_global(self, args, NULL);
2400 goto finally;
2401 }
2402 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002403
Guido van Rossum60456fd1997-04-09 17:36:32 +00002404 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 if (type == &PyList_Type) {
2406 res = save_list(self, args);
2407 goto finally;
2408 }
2409 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002410
2411 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002412 if (type == &PyDict_Type) {
2413 res = save_dict(self, args);
2414 goto finally;
2415 }
2416 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002417
2418 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 if (type == &PyInstance_Type) {
2420 res = save_inst(self, args);
2421 goto finally;
2422 }
2423 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002424
2425 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002426 if (type == &PyClass_Type) {
2427 res = save_global(self, args, NULL);
2428 goto finally;
2429 }
2430 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002431
2432 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 if (type == &PyFunction_Type) {
2434 res = save_global(self, args, NULL);
2435 goto finally;
2436 }
2437 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002438
2439 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 if (type == &PyCFunction_Type) {
2441 res = save_global(self, args, NULL);
2442 goto finally;
2443 }
2444 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002446 if (!pers_save && self->inst_pers_func) {
2447 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2448 res = tmp;
2449 goto finally;
2450 }
2451 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002452
Jeremy Hylton39c61162002-07-16 19:47:43 +00002453 if (PyType_IsSubtype(type, &PyType_Type)) {
2454 res = save_global(self, args, NULL);
2455 goto finally;
2456 }
2457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002458 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2459 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 Py_INCREF(args);
2462 ARG_TUP(self, args);
2463 if (self->arg) {
2464 t = PyObject_Call(__reduce__, self->arg, NULL);
2465 FREE_ARG_TUP(self);
2466 }
2467 if (! t) goto finally;
2468 }
2469 else {
2470 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002472 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2473 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002474 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 goto finally;
2476 }
2477 else {
2478 PyErr_Clear();
2479 }
2480 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482 if (t) {
2483 if (PyString_Check(t)) {
2484 res = save_global(self, args, t);
2485 goto finally;
2486 }
Tim Peters84e87f32001-03-17 04:50:51 +00002487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 if (!PyTuple_Check(t)) {
2489 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2490 "be a tuple", "O", __reduce__);
2491 goto finally;
2492 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002496 if ((size != 3) && (size != 2)) {
2497 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2498 "contain only two or three elements", "O", __reduce__);
2499 goto finally;
2500 }
Tim Peters84e87f32001-03-17 04:50:51 +00002501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 if (size > 2) {
2507 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002508 if (state == Py_None)
2509 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002510 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2513 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2514 "returned by %s must be a tuple", "O", __reduce__);
2515 goto finally;
2516 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002518 res = save_reduce(self, callable, arg_tup, state, args);
2519 goto finally;
2520 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002524 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002525 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526 Py_XDECREF(py_ob_id);
2527 Py_XDECREF(__reduce__);
2528 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002531}
2532
2533
2534static int
Tim Peterscba30e22003-02-01 06:24:36 +00002535dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536{
2537 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002538
Tim Peters4190fb82003-02-02 16:09:05 +00002539 if (self->proto >= 2) {
2540 char bytes[2];
2541
2542 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002543 assert(self->proto >= 0 && self->proto < 256);
2544 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002545 if (self->write_func(self, bytes, 2) < 0)
2546 return -1;
2547 }
2548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002549 if (save(self, args, 0) < 0)
2550 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002551
Tim Peters4190fb82003-02-02 16:09:05 +00002552 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002553 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002554
Tim Peters4190fb82003-02-02 16:09:05 +00002555 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002556 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002559}
2560
2561static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002562Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563{
Tim Peterscba30e22003-02-01 06:24:36 +00002564 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 PyDict_Clear(self->memo);
2566 Py_INCREF(Py_None);
2567 return Py_None;
2568}
2569
2570static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002571Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002572{
2573 int l, i, rsize, ssize, clear=1, lm;
2574 long ik;
2575 PyObject *k, *r;
2576 char *s, *p, *have_get;
2577 Pdata *data;
2578
2579 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002580 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002581 return NULL;
2582
2583 /* Check to make sure we are based on a list */
2584 if (! Pdata_Check(self->file)) {
2585 PyErr_SetString(PicklingError,
2586 "Attempt to getvalue() a non-list-based pickler");
2587 return NULL;
2588 }
2589
2590 /* flush write buffer */
2591 if (write_other(self, NULL, 0) < 0) return NULL;
2592
2593 data=(Pdata*)self->file;
2594 l=data->length;
2595
2596 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002597 lm = PyDict_Size(self->memo);
2598 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002599 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002600 have_get = malloc(lm);
2601 if (have_get == NULL) return PyErr_NoMemory();
2602 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603
2604 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002605 for (rsize = 0, i = l; --i >= 0; ) {
2606 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607
Tim Petersac5687a2003-02-02 18:08:34 +00002608 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610
2611 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002612 ik = PyInt_AS_LONG((PyIntObject*)k);
2613 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614 PyErr_SetString(PicklingError,
2615 "Invalid get data");
2616 return NULL;
2617 }
Tim Petersac5687a2003-02-02 18:08:34 +00002618 if (have_get[ik]) /* with matching get */
2619 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620 }
2621
2622 else if (! (PyTuple_Check(k) &&
2623 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002624 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 ) {
2626 PyErr_SetString(PicklingError,
2627 "Unexpected data in internal list");
2628 return NULL;
2629 }
2630
2631 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002632 ik = PyInt_AS_LONG((PyIntObject *)k);
2633 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634 PyErr_SetString(PicklingError,
2635 "Invalid get data");
2636 return NULL;
2637 }
Tim Petersac5687a2003-02-02 18:08:34 +00002638 have_get[ik] = 1;
2639 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641 }
2642
2643 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002644 r = PyString_FromStringAndSize(NULL, rsize);
2645 if (r == NULL) goto err;
2646 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647
Tim Petersac5687a2003-02-02 18:08:34 +00002648 for (i = 0; i < l; i++) {
2649 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002650
2651 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002652 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002654 p=PyString_AS_STRING((PyStringObject *)k);
2655 while (--ssize >= 0)
2656 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 }
2658 }
2659
2660 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002661 ik = PyInt_AS_LONG((PyIntObject *)
2662 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 if (ik < 256) {
2664 *s++ = BINGET;
2665 *s++ = (int)(ik & 0xff);
2666 }
2667 else {
2668 *s++ = LONG_BINGET;
2669 *s++ = (int)(ik & 0xff);
2670 *s++ = (int)((ik >> 8) & 0xff);
2671 *s++ = (int)((ik >> 16) & 0xff);
2672 *s++ = (int)((ik >> 24) & 0xff);
2673 }
2674 }
2675
2676 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002677 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678
2679 if (have_get[ik]) { /* with matching get */
2680 if (ik < 256) {
2681 *s++ = BINPUT;
2682 *s++ = (int)(ik & 0xff);
2683 }
2684 else {
2685 *s++ = LONG_BINPUT;
2686 *s++ = (int)(ik & 0xff);
2687 *s++ = (int)((ik >> 8) & 0xff);
2688 *s++ = (int)((ik >> 16) & 0xff);
2689 *s++ = (int)((ik >> 24) & 0xff);
2690 }
2691 }
2692 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 }
2694
2695 if (clear) {
2696 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002697 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 }
2699
2700 free(have_get);
2701 return r;
2702 err:
2703 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002704 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002705}
2706
2707static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002708Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709{
2710 PyObject *ob;
2711 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002712
Tim Peterscba30e22003-02-01 06:24:36 +00002713 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716 if (dump(self, ob) < 0)
2717 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002719 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 /* XXX Why does dump() return self? */
2722 Py_INCREF(self);
2723 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002724}
2725
2726
Tim Peterscba30e22003-02-01 06:24:36 +00002727static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002728{
Neal Norwitzb0493252002-03-31 14:44:22 +00002729 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002730 PyDoc_STR("dump(object) -- "
2731 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002732 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002733 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002734 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002735 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002737};
2738
2739
2740static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002741newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742{
2743 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002744
Tim Peters5bd2a792003-02-01 16:45:06 +00002745 if (proto < 0)
2746 proto = CURRENT_PROTOCOL_NUMBER;
2747 if (proto > CURRENT_PROTOCOL_NUMBER) {
2748 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2749 "the highest available protocol is %d",
2750 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002752 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002753
Tim Peters5bd2a792003-02-01 16:45:06 +00002754 self = PyObject_New(Picklerobject, &Picklertype);
2755 if (self == NULL)
2756 return NULL;
2757 self->proto = proto;
2758 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 self->fp = NULL;
2760 self->write = NULL;
2761 self->memo = NULL;
2762 self->arg = NULL;
2763 self->pers_func = NULL;
2764 self->inst_pers_func = NULL;
2765 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002767 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002768 self->fast_container = 0;
2769 self->fast_memo = NULL;
2770 self->buf_size = 0;
2771 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002772
Tim Peters5bd2a792003-02-01 16:45:06 +00002773 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002774 if (file)
2775 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002776 else {
2777 file = Pdata_New();
2778 if (file == NULL)
2779 goto err;
2780 }
2781 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002782
Tim Peterscba30e22003-02-01 06:24:36 +00002783 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 if (PyFile_Check(file)) {
2787 self->fp = PyFile_AsFile(file);
2788 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002789 PyErr_SetString(PyExc_ValueError,
2790 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 goto err;
2792 }
2793 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002794 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002795 else if (PycStringIO_OutputCheck(file)) {
2796 self->write_func = write_cStringIO;
2797 }
2798 else if (file == Py_None) {
2799 self->write_func = write_none;
2800 }
2801 else {
2802 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 if (! Pdata_Check(file)) {
2805 self->write = PyObject_GetAttr(file, write_str);
2806 if (!self->write) {
2807 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002808 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 "argument must have 'write' "
2810 "attribute");
2811 goto err;
2812 }
2813 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002814
Tim Peters5bd2a792003-02-01 16:45:06 +00002815 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2816 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817 PyErr_NoMemory();
2818 goto err;
2819 }
2820 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 if (PyEval_GetRestricted()) {
2823 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002824 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002825
Tim Peters5b7da392003-02-04 00:21:07 +00002826 if (m == NULL)
2827 goto err;
2828 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002830 if (self->dispatch_table == NULL)
2831 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832 }
2833 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002834 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 Py_INCREF(dispatch_table);
2836 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002838 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002840 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002841 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002843}
2844
2845
2846static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002847get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848{
2849 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002850 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002851
Tim Peters5bd2a792003-02-01 16:45:06 +00002852 /* XXX What is this doing? The documented signature is
2853 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2854 * XXX Pickler(integer) too. The meaning then is clear as mud.
2855 * XXX Bug? Feature?
2856 */
2857 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002859 proto = 0;
2860 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 return NULL;
2862 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002863 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002864}
2865
2866
2867static void
Tim Peterscba30e22003-02-01 06:24:36 +00002868Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869{
2870 Py_XDECREF(self->write);
2871 Py_XDECREF(self->memo);
2872 Py_XDECREF(self->fast_memo);
2873 Py_XDECREF(self->arg);
2874 Py_XDECREF(self->file);
2875 Py_XDECREF(self->pers_func);
2876 Py_XDECREF(self->inst_pers_func);
2877 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002878 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002880}
2881
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002882static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002883Pickler_get_pers_func(Picklerobject *p)
2884{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885 if (p->pers_func == NULL)
2886 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2887 else
2888 Py_INCREF(p->pers_func);
2889 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002890}
2891
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002892static int
2893Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2894{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 if (v == NULL) {
2896 PyErr_SetString(PyExc_TypeError,
2897 "attribute deletion is not supported");
2898 return -1;
2899 }
2900 Py_XDECREF(p->pers_func);
2901 Py_INCREF(v);
2902 p->pers_func = v;
2903 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002904}
2905
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002906static int
2907Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2908{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002909 if (v == NULL) {
2910 PyErr_SetString(PyExc_TypeError,
2911 "attribute deletion is not supported");
2912 return -1;
2913 }
2914 Py_XDECREF(p->inst_pers_func);
2915 Py_INCREF(v);
2916 p->inst_pers_func = v;
2917 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002918}
2919
2920static PyObject *
2921Pickler_get_memo(Picklerobject *p)
2922{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 if (p->memo == NULL)
2924 PyErr_SetString(PyExc_AttributeError, "memo");
2925 else
2926 Py_INCREF(p->memo);
2927 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002928}
2929
2930static int
2931Pickler_set_memo(Picklerobject *p, PyObject *v)
2932{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 if (v == NULL) {
2934 PyErr_SetString(PyExc_TypeError,
2935 "attribute deletion is not supported");
2936 return -1;
2937 }
2938 if (!PyDict_Check(v)) {
2939 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2940 return -1;
2941 }
2942 Py_XDECREF(p->memo);
2943 Py_INCREF(v);
2944 p->memo = v;
2945 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002946}
2947
2948static PyObject *
2949Pickler_get_error(Picklerobject *p)
2950{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951 /* why is this an attribute on the Pickler? */
2952 Py_INCREF(PicklingError);
2953 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002954}
2955
2956static PyMemberDef Pickler_members[] = {
2957 {"binary", T_INT, offsetof(Picklerobject, bin)},
2958 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002959 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002960};
2961
2962static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002963 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002964 (setter)Pickler_set_pers_func},
2965 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2966 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002967 {"PicklingError", (getter)Pickler_get_error, NULL},
2968 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002969};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002971PyDoc_STRVAR(Picklertype__doc__,
2972"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002973
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002974static PyTypeObject Picklertype = {
2975 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002976 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002977 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002978 sizeof(Picklerobject), /*tp_basicsize*/
2979 0,
2980 (destructor)Pickler_dealloc, /* tp_dealloc */
2981 0, /* tp_print */
2982 0, /* tp_getattr */
2983 0, /* tp_setattr */
2984 0, /* tp_compare */
2985 0, /* tp_repr */
2986 0, /* tp_as_number */
2987 0, /* tp_as_sequence */
2988 0, /* tp_as_mapping */
2989 0, /* tp_hash */
2990 0, /* tp_call */
2991 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002992 PyObject_GenericGetAttr, /* tp_getattro */
2993 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002994 0, /* tp_as_buffer */
2995 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2996 Picklertype__doc__, /* tp_doc */
2997 0, /* tp_traverse */
2998 0, /* tp_clear */
2999 0, /* tp_richcompare */
3000 0, /* tp_weaklistoffset */
3001 0, /* tp_iter */
3002 0, /* tp_iternext */
3003 Pickler_methods, /* tp_methods */
3004 Pickler_members, /* tp_members */
3005 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003006};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003007
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003008static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003009find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010{
3011 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013 if (fc) {
3014 if (fc==Py_None) {
3015 PyErr_SetString(UnpicklingError,
3016 "Global and instance pickles are not supported.");
3017 return NULL;
3018 }
Tim Peterscba30e22003-02-01 06:24:36 +00003019 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020 py_global_name);
3021 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 module = PySys_GetObject("modules");
3024 if (module == NULL)
3025 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003027 module = PyDict_GetItem(module, py_module_name);
3028 if (module == NULL) {
3029 module = PyImport_Import(py_module_name);
3030 if (!module)
3031 return NULL;
3032 global = PyObject_GetAttr(module, py_global_name);
3033 Py_DECREF(module);
3034 }
3035 else
3036 global = PyObject_GetAttr(module, py_global_name);
3037 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003038}
3039
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003040static int
Tim Peterscba30e22003-02-01 06:24:36 +00003041marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042{
3043 if (self->num_marks < 1) {
3044 PyErr_SetString(UnpicklingError, "could not find MARK");
3045 return -1;
3046 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049}
3050
Tim Peters84e87f32001-03-17 04:50:51 +00003051
Guido van Rossum60456fd1997-04-09 17:36:32 +00003052static int
Tim Peterscba30e22003-02-01 06:24:36 +00003053load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054{
3055 PDATA_APPEND(self->stack, Py_None, -1);
3056 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057}
3058
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003059static int
Tim Peterscba30e22003-02-01 06:24:36 +00003060bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061{
3062 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3063 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003064}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065
3066static int
Tim Peterscba30e22003-02-01 06:24:36 +00003067load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068{
3069 PyObject *py_int = 0;
3070 char *endptr, *s;
3071 int len, res = -1;
3072 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073
Tim Peters0bc93f52003-02-02 18:29:33 +00003074 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 if (len < 2) return bad_readline();
3076 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003078 errno = 0;
3079 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3082 /* Hm, maybe we've got something long. Let's try reading
3083 it as a Python long object. */
3084 errno = 0;
3085 py_int = PyLong_FromString(s, NULL, 0);
3086 if (py_int == NULL) {
3087 PyErr_SetString(PyExc_ValueError,
3088 "could not convert string to int");
3089 goto finally;
3090 }
3091 }
3092 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003093 if (len == 3 && (l == 0 || l == 1)) {
3094 if (!( py_int = PyBool_FromLong(l))) goto finally;
3095 }
3096 else {
3097 if (!( py_int = PyInt_FromLong(l))) goto finally;
3098 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 free(s);
3102 PDATA_PUSH(self->stack, py_int, -1);
3103 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 finally:
3106 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003109}
3110
Tim Peters3c67d792003-02-02 17:59:11 +00003111static int
3112load_bool(Unpicklerobject *self, PyObject *boolean)
3113{
3114 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003115 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003116 return 0;
3117}
3118
Tim Petersee1a53c2003-02-02 02:57:53 +00003119/* s contains x bytes of a little-endian integer. Return its value as a
3120 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3121 * int, but when x is 4 it's a signed one. This is an historical source
3122 * of x-platform bugs.
3123 */
Tim Peters84e87f32001-03-17 04:50:51 +00003124static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003125calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126{
3127 unsigned char c;
3128 int i;
3129 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 for (i = 0, l = 0L; i < x; i++) {
3132 c = (unsigned char)s[i];
3133 l |= (long)c << (i * 8);
3134 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003135#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3137 * is signed, so on a box with longs bigger than 4 bytes we need
3138 * to extend a BININT's sign bit to the full width.
3139 */
3140 if (x == 4 && l & (1L << 31))
3141 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003142#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003143 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003144}
3145
3146
3147static int
Tim Peterscba30e22003-02-01 06:24:36 +00003148load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149{
3150 PyObject *py_int = 0;
3151 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003154
Tim Peterscba30e22003-02-01 06:24:36 +00003155 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003158 PDATA_PUSH(self->stack, py_int, -1);
3159 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003160}
3161
3162
3163static int
Tim Peterscba30e22003-02-01 06:24:36 +00003164load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165{
3166 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167
Tim Peters0bc93f52003-02-02 18:29:33 +00003168 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172}
3173
3174
3175static int
Tim Peterscba30e22003-02-01 06:24:36 +00003176load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177{
3178 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179
Tim Peters0bc93f52003-02-02 18:29:33 +00003180 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184}
3185
3186
3187static int
Tim Peterscba30e22003-02-01 06:24:36 +00003188load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003189{
3190 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003191
Tim Peters0bc93f52003-02-02 18:29:33 +00003192 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003196}
Tim Peters84e87f32001-03-17 04:50:51 +00003197
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198static int
Tim Peterscba30e22003-02-01 06:24:36 +00003199load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200{
3201 PyObject *l = 0;
3202 char *end, *s;
3203 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204
Tim Peters0bc93f52003-02-02 18:29:33 +00003205 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 if (len < 2) return bad_readline();
3207 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Tim Peterscba30e22003-02-01 06:24:36 +00003209 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 free(s);
3213 PDATA_PUSH(self->stack, l, -1);
3214 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 finally:
3217 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220}
3221
Tim Petersee1a53c2003-02-02 02:57:53 +00003222/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3223 * data following.
3224 */
3225static int
3226load_counted_long(Unpicklerobject *self, int size)
3227{
3228 int i;
3229 char *nbytes;
3230 unsigned char *pdata;
3231 PyObject *along;
3232
3233 assert(size == 1 || size == 4);
3234 i = self->read_func(self, &nbytes, size);
3235 if (i < 0) return -1;
3236
3237 size = calc_binint(nbytes, size);
3238 if (size < 0) {
3239 /* Corrupt or hostile pickle -- we never write one like
3240 * this.
3241 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003242 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003243 "byte count");
3244 return -1;
3245 }
3246
3247 if (size == 0)
3248 along = PyLong_FromLong(0L);
3249 else {
3250 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003251 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003252 if (i < 0) return -1;
3253 along = _PyLong_FromByteArray(pdata, (size_t)size,
3254 1 /* little endian */, 1 /* signed */);
3255 }
3256 if (along == NULL)
3257 return -1;
3258 PDATA_PUSH(self->stack, along, -1);
3259 return 0;
3260}
Tim Peters84e87f32001-03-17 04:50:51 +00003261
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262static int
Tim Peterscba30e22003-02-01 06:24:36 +00003263load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264{
3265 PyObject *py_float = 0;
3266 char *endptr, *s;
3267 int len, res = -1;
3268 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269
Tim Peters0bc93f52003-02-02 18:29:33 +00003270 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 if (len < 2) return bad_readline();
3272 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 errno = 0;
3275 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3278 PyErr_SetString(PyExc_ValueError,
3279 "could not convert string to float");
3280 goto finally;
3281 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003282
Tim Peterscba30e22003-02-01 06:24:36 +00003283 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003286 free(s);
3287 PDATA_PUSH(self->stack, py_float, -1);
3288 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290 finally:
3291 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003293 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003294}
3295
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296static int
Tim Peterscba30e22003-02-01 06:24:36 +00003297load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298{
3299 PyObject *py_float = 0;
3300 int s, e;
3301 long fhi, flo;
3302 double x;
3303 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304
Tim Peters0bc93f52003-02-02 18:29:33 +00003305 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003308 /* First byte */
3309 s = (*p>>7) & 1;
3310 e = (*p & 0x7F) << 4;
3311 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003313 /* Second byte */
3314 e |= (*p>>4) & 0xF;
3315 fhi = (*p & 0xF) << 24;
3316 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003318 /* Third byte */
3319 fhi |= (*p & 0xFF) << 16;
3320 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 /* Fourth byte */
3323 fhi |= (*p & 0xFF) << 8;
3324 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003326 /* Fifth byte */
3327 fhi |= *p & 0xFF;
3328 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003330 /* Sixth byte */
3331 flo = (*p & 0xFF) << 16;
3332 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 /* Seventh byte */
3335 flo |= (*p & 0xFF) << 8;
3336 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 /* Eighth byte */
3339 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3342 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344 /* XXX This sadly ignores Inf/NaN */
3345 if (e == 0)
3346 e = -1022;
3347 else {
3348 x += 1.0;
3349 e -= 1023;
3350 }
3351 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 if (s)
3354 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 PDATA_PUSH(self->stack, py_float, -1);
3359 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003360}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
3362static int
Tim Peterscba30e22003-02-01 06:24:36 +00003363load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003364{
3365 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003366 int len, res = -1;
3367 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Tim Peters0bc93f52003-02-02 18:29:33 +00003369 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370 if (len < 2) return bad_readline();
3371 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003373
3374 /* Strip outermost quotes */
3375 while (s[len-1] <= ' ')
3376 len--;
3377 if(s[0]=='"' && s[len-1]=='"'){
3378 s[len-1] = '\0';
3379 p = s + 1 ;
3380 len -= 2;
3381 } else if(s[0]=='\'' && s[len-1]=='\''){
3382 s[len-1] = '\0';
3383 p = s + 1 ;
3384 len -= 2;
3385 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 goto insecure;
3387 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003388
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003389 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3390 if (str) {
3391 PDATA_PUSH(self->stack, str, -1);
3392 res = 0;
3393 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003395 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 insecure:
3398 free(s);
3399 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3400 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003401}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402
3403
3404static int
Tim Peterscba30e22003-02-01 06:24:36 +00003405load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406{
3407 PyObject *py_string = 0;
3408 long l;
3409 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003410
Tim Peters0bc93f52003-02-02 18:29:33 +00003411 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414
Tim Peters0bc93f52003-02-02 18:29:33 +00003415 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003417
Tim Peterscba30e22003-02-01 06:24:36 +00003418 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421 PDATA_PUSH(self->stack, py_string, -1);
3422 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423}
3424
3425
3426static int
Tim Peterscba30e22003-02-01 06:24:36 +00003427load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003428{
3429 PyObject *py_string = 0;
3430 unsigned char l;
3431 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Tim Peters0bc93f52003-02-02 18:29:33 +00003433 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Tim Peters0bc93f52003-02-02 18:29:33 +00003438 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 PDATA_PUSH(self->stack, py_string, -1);
3443 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003444}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445
3446
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003447#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448static int
Tim Peterscba30e22003-02-01 06:24:36 +00003449load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450{
3451 PyObject *str = 0;
3452 int len, res = -1;
3453 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003454
Tim Peters0bc93f52003-02-02 18:29:33 +00003455 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003457
Tim Peterscba30e22003-02-01 06:24:36 +00003458 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003459 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461 PDATA_PUSH(self->stack, str, -1);
3462 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 finally:
3465 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003466}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003467#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003468
3469
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003470#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003471static int
Tim Peterscba30e22003-02-01 06:24:36 +00003472load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473{
3474 PyObject *unicode;
3475 long l;
3476 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003477
Tim Peters0bc93f52003-02-02 18:29:33 +00003478 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003481
Tim Peters0bc93f52003-02-02 18:29:33 +00003482 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003484
Tim Peterscba30e22003-02-01 06:24:36 +00003485 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 PDATA_PUSH(self->stack, unicode, -1);
3489 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003490}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003491#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003492
3493
3494static int
Tim Peterscba30e22003-02-01 06:24:36 +00003495load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496{
3497 PyObject *tup;
3498 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 if ((i = marker(self)) < 0) return -1;
3501 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3502 PDATA_PUSH(self->stack, tup, -1);
3503 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504}
3505
3506static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003507load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003509 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510
Tim Peters1d63c9f2003-02-02 20:29:39 +00003511 if (tup == NULL)
3512 return -1;
3513
3514 while (--len >= 0) {
3515 PyObject *element;
3516
3517 PDATA_POP(self->stack, element);
3518 if (element == NULL)
3519 return -1;
3520 PyTuple_SET_ITEM(tup, len, element);
3521 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003522 PDATA_PUSH(self->stack, tup, -1);
3523 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003524}
3525
3526static int
Tim Peterscba30e22003-02-01 06:24:36 +00003527load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003528{
3529 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531 if (!( list=PyList_New(0))) return -1;
3532 PDATA_PUSH(self->stack, list, -1);
3533 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534}
3535
3536static int
Tim Peterscba30e22003-02-01 06:24:36 +00003537load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538{
3539 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541 if (!( dict=PyDict_New())) return -1;
3542 PDATA_PUSH(self->stack, dict, -1);
3543 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544}
3545
3546
3547static int
Tim Peterscba30e22003-02-01 06:24:36 +00003548load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003549{
3550 PyObject *list = 0;
3551 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553 if ((i = marker(self)) < 0) return -1;
3554 if (!( list=Pdata_popList(self->stack, i))) return -1;
3555 PDATA_PUSH(self->stack, list, -1);
3556 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557}
3558
3559static int
Tim Peterscba30e22003-02-01 06:24:36 +00003560load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561{
3562 PyObject *dict, *key, *value;
3563 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003565 if ((i = marker(self)) < 0) return -1;
3566 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003570 for (k = i+1; k < j; k += 2) {
3571 key =self->stack->data[k-1];
3572 value=self->stack->data[k ];
3573 if (PyDict_SetItem(dict, key, value) < 0) {
3574 Py_DECREF(dict);
3575 return -1;
3576 }
3577 }
3578 Pdata_clear(self->stack, i);
3579 PDATA_PUSH(self->stack, dict, -1);
3580 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581}
3582
3583static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003584Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003586 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 if (PyClass_Check(cls)) {
3589 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591 if ((l=PyObject_Size(args)) < 0) goto err;
3592 if (!( l )) {
3593 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003594
Tim Peterscba30e22003-02-01 06:24:36 +00003595 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596 __getinitargs___str);
3597 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003598 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599 so bypass usual construction */
3600 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003603 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 goto err;
3605 return inst;
3606 }
3607 Py_DECREF(__getinitargs__);
3608 }
Tim Peters84e87f32001-03-17 04:50:51 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 if ((r=PyInstance_New(cls, args, NULL))) return r;
3611 else goto err;
3612 }
Tim Peters84e87f32001-03-17 04:50:51 +00003613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003614 if (args==Py_None) {
3615 /* Special case, call cls.__basicnew__() */
3616 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003618 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3619 if (!basicnew) return NULL;
3620 r=PyObject_CallObject(basicnew, NULL);
3621 Py_DECREF(basicnew);
3622 if (r) return r;
3623 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627 err:
3628 {
3629 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 PyErr_Fetch(&tp, &v, &tb);
3632 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3633 Py_XDECREF(v);
3634 v=r;
3635 }
3636 PyErr_Restore(tp,v,tb);
3637 }
3638 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639}
Tim Peters84e87f32001-03-17 04:50:51 +00003640
Guido van Rossum60456fd1997-04-09 17:36:32 +00003641
3642static int
Tim Peterscba30e22003-02-01 06:24:36 +00003643load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644{
3645 PyObject *class, *tup, *obj=0;
3646 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648 if ((i = marker(self)) < 0) return -1;
3649 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3650 PDATA_POP(self->stack, class);
3651 if (class) {
3652 obj = Instance_New(class, tup);
3653 Py_DECREF(class);
3654 }
3655 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657 if (! obj) return -1;
3658 PDATA_PUSH(self->stack, obj, -1);
3659 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660}
3661
3662
3663static int
Tim Peterscba30e22003-02-01 06:24:36 +00003664load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665{
3666 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3667 int i, len;
3668 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003671
Tim Peters0bc93f52003-02-02 18:29:33 +00003672 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003673 if (len < 2) return bad_readline();
3674 module_name = PyString_FromStringAndSize(s, len - 1);
3675 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003676
Tim Peters0bc93f52003-02-02 18:29:33 +00003677 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 if (len < 2) return bad_readline();
3679 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003680 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681 self->find_class);
3682 Py_DECREF(class_name);
3683 }
3684 }
3685 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689 if ((tup=Pdata_popTuple(self->stack, i))) {
3690 obj = Instance_New(class, tup);
3691 Py_DECREF(tup);
3692 }
3693 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003697 PDATA_PUSH(self->stack, obj, -1);
3698 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003699}
3700
3701
3702static int
Tim Peterscba30e22003-02-01 06:24:36 +00003703load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003704{
3705 PyObject *class = 0, *module_name = 0, *class_name = 0;
3706 int len;
3707 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708
Tim Peters0bc93f52003-02-02 18:29:33 +00003709 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 if (len < 2) return bad_readline();
3711 module_name = PyString_FromStringAndSize(s, len - 1);
3712 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Tim Peters0bc93f52003-02-02 18:29:33 +00003714 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003715 if (len < 2) {
3716 Py_DECREF(module_name);
3717 return bad_readline();
3718 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003720 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003721 self->find_class);
3722 Py_DECREF(class_name);
3723 }
3724 }
3725 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 if (! class) return -1;
3728 PDATA_PUSH(self->stack, class, -1);
3729 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730}
3731
3732
3733static int
Tim Peterscba30e22003-02-01 06:24:36 +00003734load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735{
3736 PyObject *pid = 0;
3737 int len;
3738 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003741 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 if (len < 2) return bad_readline();
3743
3744 pid = PyString_FromStringAndSize(s, len - 1);
3745 if (!pid) return -1;
3746
3747 if (PyList_Check(self->pers_func)) {
3748 if (PyList_Append(self->pers_func, pid) < 0) {
3749 Py_DECREF(pid);
3750 return -1;
3751 }
3752 }
3753 else {
3754 ARG_TUP(self, pid);
3755 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003756 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 NULL);
3758 FREE_ARG_TUP(self);
3759 }
3760 }
3761
3762 if (! pid) return -1;
3763
3764 PDATA_PUSH(self->stack, pid, -1);
3765 return 0;
3766 }
3767 else {
3768 PyErr_SetString(UnpicklingError,
3769 "A load persistent id instruction was encountered,\n"
3770 "but no persistent_load function was specified.");
3771 return -1;
3772 }
3773}
3774
3775static int
Tim Peterscba30e22003-02-01 06:24:36 +00003776load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777{
3778 PyObject *pid = 0;
3779
3780 if (self->pers_func) {
3781 PDATA_POP(self->stack, pid);
3782 if (! pid) return -1;
3783
3784 if (PyList_Check(self->pers_func)) {
3785 if (PyList_Append(self->pers_func, pid) < 0) {
3786 Py_DECREF(pid);
3787 return -1;
3788 }
3789 }
3790 else {
3791 ARG_TUP(self, pid);
3792 if (self->arg) {
3793 pid = PyObject_Call(self->pers_func, self->arg,
3794 NULL);
3795 FREE_ARG_TUP(self);
3796 }
3797 if (! pid) return -1;
3798 }
3799
3800 PDATA_PUSH(self->stack, pid, -1);
3801 return 0;
3802 }
3803 else {
3804 PyErr_SetString(UnpicklingError,
3805 "A load persistent id instruction was encountered,\n"
3806 "but no persistent_load function was specified.");
3807 return -1;
3808 }
3809}
3810
3811
3812static int
Tim Peterscba30e22003-02-01 06:24:36 +00003813load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003814{
3815 int len;
3816
3817 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3818
3819 /* Note that we split the (pickle.py) stack into two stacks,
3820 an object stack and a mark stack. We have to be clever and
3821 pop the right one. We do this by looking at the top of the
3822 mark stack.
3823 */
3824
3825 if ((self->num_marks > 0) &&
3826 (self->marks[self->num_marks - 1] == len))
3827 self->num_marks--;
3828 else {
3829 len--;
3830 Py_DECREF(self->stack->data[len]);
3831 self->stack->length=len;
3832 }
3833
3834 return 0;
3835}
3836
3837
3838static int
Tim Peterscba30e22003-02-01 06:24:36 +00003839load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003840{
3841 int i;
3842
3843 if ((i = marker(self)) < 0)
3844 return -1;
3845
3846 Pdata_clear(self->stack, i);
3847
3848 return 0;
3849}
3850
3851
3852static int
Tim Peterscba30e22003-02-01 06:24:36 +00003853load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854{
3855 PyObject *last;
3856 int len;
3857
3858 if ((len = self->stack->length) <= 0) return stackUnderflow();
3859 last=self->stack->data[len-1];
3860 Py_INCREF(last);
3861 PDATA_PUSH(self->stack, last, -1);
3862 return 0;
3863}
3864
3865
3866static int
Tim Peterscba30e22003-02-01 06:24:36 +00003867load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868{
3869 PyObject *py_str = 0, *value = 0;
3870 int len;
3871 char *s;
3872 int rc;
3873
Tim Peters0bc93f52003-02-02 18:29:33 +00003874 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003875 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 value = PyDict_GetItem(self->memo, py_str);
3880 if (! value) {
3881 PyErr_SetObject(BadPickleGet, py_str);
3882 rc = -1;
3883 } else {
3884 PDATA_APPEND(self->stack, value, -1);
3885 rc = 0;
3886 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003888 Py_DECREF(py_str);
3889 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890}
3891
3892
3893static int
Tim Peterscba30e22003-02-01 06:24:36 +00003894load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895{
3896 PyObject *py_key = 0, *value = 0;
3897 unsigned char key;
3898 char *s;
3899 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900
Tim Peters0bc93f52003-02-02 18:29:33 +00003901 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003903 key = (unsigned char)s[0];
3904 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906 value = PyDict_GetItem(self->memo, py_key);
3907 if (! value) {
3908 PyErr_SetObject(BadPickleGet, py_key);
3909 rc = -1;
3910 } else {
3911 PDATA_APPEND(self->stack, value, -1);
3912 rc = 0;
3913 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915 Py_DECREF(py_key);
3916 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003917}
3918
3919
3920static int
Tim Peterscba30e22003-02-01 06:24:36 +00003921load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922{
3923 PyObject *py_key = 0, *value = 0;
3924 unsigned char c;
3925 char *s;
3926 long key;
3927 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Tim Peters0bc93f52003-02-02 18:29:33 +00003929 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 c = (unsigned char)s[0];
3932 key = (long)c;
3933 c = (unsigned char)s[1];
3934 key |= (long)c << 8;
3935 c = (unsigned char)s[2];
3936 key |= (long)c << 16;
3937 c = (unsigned char)s[3];
3938 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3941
3942 value = PyDict_GetItem(self->memo, py_key);
3943 if (! value) {
3944 PyErr_SetObject(BadPickleGet, py_key);
3945 rc = -1;
3946 } else {
3947 PDATA_APPEND(self->stack, value, -1);
3948 rc = 0;
3949 }
3950
3951 Py_DECREF(py_key);
3952 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953}
3954
Tim Peters2d629652003-02-04 05:06:17 +00003955/* Push an object from the extension registry (EXT[124]). nbytes is
3956 * the number of bytes following the opcode, holding the index (code) value.
3957 */
3958static int
3959load_extension(Unpicklerobject *self, int nbytes)
3960{
3961 char *codebytes; /* the nbytes bytes after the opcode */
3962 long code; /* calc_binint returns long */
3963 PyObject *py_code; /* code as a Python int */
3964 PyObject *obj; /* the object to push */
3965 PyObject *pair; /* (module_name, class_name) */
3966 PyObject *module_name, *class_name;
3967
3968 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3969 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3970 code = calc_binint(codebytes, nbytes);
3971 if (code <= 0) { /* note that 0 is forbidden */
3972 /* Corrupt or hostile pickle. */
3973 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3974 return -1;
3975 }
3976
3977 /* Look for the code in the cache. */
3978 py_code = PyInt_FromLong(code);
3979 if (py_code == NULL) return -1;
3980 obj = PyDict_GetItem(extension_cache, py_code);
3981 if (obj != NULL) {
3982 /* Bingo. */
3983 Py_DECREF(py_code);
3984 PDATA_APPEND(self->stack, obj, -1);
3985 return 0;
3986 }
3987
3988 /* Look up the (module_name, class_name) pair. */
3989 pair = PyDict_GetItem(inverted_registry, py_code);
3990 if (pair == NULL) {
3991 Py_DECREF(py_code);
3992 PyErr_Format(PyExc_ValueError, "unregistered extension "
3993 "code %ld", code);
3994 return -1;
3995 }
3996 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003997 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003998 */
3999 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4000 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4001 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4002 Py_DECREF(py_code);
4003 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4004 "isn't a 2-tuple of strings", code);
4005 return -1;
4006 }
4007 /* Load the object. */
4008 obj = find_class(module_name, class_name, self->find_class);
4009 if (obj == NULL) {
4010 Py_DECREF(py_code);
4011 return -1;
4012 }
4013 /* Cache code -> obj. */
4014 code = PyDict_SetItem(extension_cache, py_code, obj);
4015 Py_DECREF(py_code);
4016 if (code < 0) {
4017 Py_DECREF(obj);
4018 return -1;
4019 }
4020 PDATA_PUSH(self->stack, obj, -1);
4021 return 0;
4022}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004023
4024static int
Tim Peterscba30e22003-02-01 06:24:36 +00004025load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004026{
4027 PyObject *py_str = 0, *value = 0;
4028 int len, l;
4029 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004030
Tim Peters0bc93f52003-02-02 18:29:33 +00004031 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004032 if (l < 2) return bad_readline();
4033 if (!( len=self->stack->length )) return stackUnderflow();
4034 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4035 value=self->stack->data[len-1];
4036 l=PyDict_SetItem(self->memo, py_str, value);
4037 Py_DECREF(py_str);
4038 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039}
4040
4041
4042static int
Tim Peterscba30e22003-02-01 06:24:36 +00004043load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044{
4045 PyObject *py_key = 0, *value = 0;
4046 unsigned char key;
4047 char *s;
4048 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004049
Tim Peters0bc93f52003-02-02 18:29:33 +00004050 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004053 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4056 value=self->stack->data[len-1];
4057 len=PyDict_SetItem(self->memo, py_key, value);
4058 Py_DECREF(py_key);
4059 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004060}
4061
4062
4063static int
Tim Peterscba30e22003-02-01 06:24:36 +00004064load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065{
4066 PyObject *py_key = 0, *value = 0;
4067 long key;
4068 unsigned char c;
4069 char *s;
4070 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004071
Tim Peters0bc93f52003-02-02 18:29:33 +00004072 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 c = (unsigned char)s[0];
4076 key = (long)c;
4077 c = (unsigned char)s[1];
4078 key |= (long)c << 8;
4079 c = (unsigned char)s[2];
4080 key |= (long)c << 16;
4081 c = (unsigned char)s[3];
4082 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 if (!( py_key = PyInt_FromLong(key))) return -1;
4085 value=self->stack->data[len-1];
4086 len=PyDict_SetItem(self->memo, py_key, value);
4087 Py_DECREF(py_key);
4088 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089}
4090
4091
4092static int
Tim Peterscba30e22003-02-01 06:24:36 +00004093do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094{
4095 PyObject *value = 0, *list = 0, *append_method = 0;
4096 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004098 len=self->stack->length;
4099 if (!( len >= x && x > 0 )) return stackUnderflow();
4100 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004101 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 if (PyList_Check(list)) {
4106 PyObject *slice;
4107 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109 slice=Pdata_popList(self->stack, x);
4110 list_len = PyList_GET_SIZE(list);
4111 i=PyList_SetSlice(list, list_len, list_len, slice);
4112 Py_DECREF(slice);
4113 return i;
4114 }
4115 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004116
Tim Peterscba30e22003-02-01 06:24:36 +00004117 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 return -1;
4119
4120 for (i = x; i < len; i++) {
4121 PyObject *junk;
4122
4123 value=self->stack->data[i];
4124 junk=0;
4125 ARG_TUP(self, value);
4126 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004127 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 NULL);
4129 FREE_ARG_TUP(self);
4130 }
4131 if (! junk) {
4132 Pdata_clear(self->stack, i+1);
4133 self->stack->length=x;
4134 Py_DECREF(append_method);
4135 return -1;
4136 }
4137 Py_DECREF(junk);
4138 }
4139 self->stack->length=x;
4140 Py_DECREF(append_method);
4141 }
4142
4143 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004144}
4145
4146
4147static int
Tim Peterscba30e22003-02-01 06:24:36 +00004148load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149{
4150 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151}
4152
4153
4154static int
Tim Peterscba30e22003-02-01 06:24:36 +00004155load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004156{
4157 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158}
4159
4160
4161static int
Tim Peterscba30e22003-02-01 06:24:36 +00004162do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163{
4164 PyObject *value = 0, *key = 0, *dict = 0;
4165 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 if (!( (len=self->stack->length) >= x
4168 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 for (i = x+1; i < len; i += 2) {
4173 key =self->stack->data[i-1];
4174 value=self->stack->data[i ];
4175 if (PyObject_SetItem(dict, key, value) < 0) {
4176 r=-1;
4177 break;
4178 }
4179 }
4180
4181 Pdata_clear(self->stack, x);
4182
4183 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184}
4185
4186
Tim Peters84e87f32001-03-17 04:50:51 +00004187static int
Tim Peterscba30e22003-02-01 06:24:36 +00004188load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189{
4190 return do_setitems(self, self->stack->length - 2);
4191}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193static int
Tim Peterscba30e22003-02-01 06:24:36 +00004194load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195{
4196 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197}
4198
Tim Peters84e87f32001-03-17 04:50:51 +00004199
Guido van Rossum60456fd1997-04-09 17:36:32 +00004200static int
Tim Peterscba30e22003-02-01 06:24:36 +00004201load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202{
4203 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
4204 *junk = 0, *__setstate__ = 0;
4205 int i, r = 0;
4206
4207 if (self->stack->length < 2) return stackUnderflow();
4208 PDATA_POP(self->stack, value);
4209 if (! value) return -1;
4210 inst=self->stack->data[self->stack->length-1];
4211
4212 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
4213 ARG_TUP(self, value);
4214 if (self->arg) {
4215 junk = PyObject_Call(__setstate__, self->arg, NULL);
4216 FREE_ARG_TUP(self);
4217 }
4218 Py_DECREF(__setstate__);
4219 if (! junk) return -1;
4220 Py_DECREF(junk);
4221 return 0;
4222 }
4223
4224 PyErr_Clear();
4225 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
4226 i = 0;
4227 while (PyDict_Next(value, &i, &d_key, &d_value)) {
4228 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
4229 r=-1;
4230 break;
4231 }
4232 }
4233 Py_DECREF(instdict);
4234 }
4235 else r=-1;
4236
4237 Py_XDECREF(value);
4238
4239 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004240}
4241
4242
4243static int
Tim Peterscba30e22003-02-01 06:24:36 +00004244load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245{
4246 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248 /* Note that we split the (pickle.py) stack into two stacks, an
4249 object stack and a mark stack. Here we push a mark onto the
4250 mark stack.
4251 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 if ((self->num_marks + 1) >= self->marks_size) {
4254 s=self->marks_size+20;
4255 if (s <= self->num_marks) s=self->num_marks + 1;
4256 if (self->marks == NULL)
4257 self->marks=(int *)malloc(s * sizeof(int));
4258 else
Tim Peterscba30e22003-02-01 06:24:36 +00004259 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 s * sizeof(int));
4261 if (! self->marks) {
4262 PyErr_NoMemory();
4263 return -1;
4264 }
4265 self->marks_size = s;
4266 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271}
4272
Guido van Rossum60456fd1997-04-09 17:36:32 +00004273static int
Tim Peterscba30e22003-02-01 06:24:36 +00004274load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275{
4276 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 PDATA_POP(self->stack, arg_tup);
4279 if (! arg_tup) return -1;
4280 PDATA_POP(self->stack, callable);
4281 if (callable) {
4282 ob = Instance_New(callable, arg_tup);
4283 Py_DECREF(callable);
4284 }
4285 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 PDATA_PUSH(self->stack, ob, -1);
4290 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004291}
Tim Peters84e87f32001-03-17 04:50:51 +00004292
Tim Peters4190fb82003-02-02 16:09:05 +00004293/* Just raises an error if we don't know the protocol specified. PROTO
4294 * is the first opcode for protocols >= 2.
4295 */
4296static int
4297load_proto(Unpicklerobject *self)
4298{
4299 int i;
4300 char *protobyte;
4301
4302 i = self->read_func(self, &protobyte, 1);
4303 if (i < 0)
4304 return -1;
4305
4306 i = calc_binint(protobyte, 1);
4307 /* No point checking for < 0, since calc_binint returns an unsigned
4308 * int when chewing on 1 byte.
4309 */
4310 assert(i >= 0);
4311 if (i <= CURRENT_PROTOCOL_NUMBER)
4312 return 0;
4313
4314 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4315 return -1;
4316}
4317
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004319load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320{
4321 PyObject *err = 0, *val = 0;
4322 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324 self->num_marks = 0;
4325 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004328 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004329 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 switch (s[0]) {
4332 case NONE:
4333 if (load_none(self) < 0)
4334 break;
4335 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 case BININT:
4338 if (load_binint(self) < 0)
4339 break;
4340 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case BININT1:
4343 if (load_binint1(self) < 0)
4344 break;
4345 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 case BININT2:
4348 if (load_binint2(self) < 0)
4349 break;
4350 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352 case INT:
4353 if (load_int(self) < 0)
4354 break;
4355 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 case LONG:
4358 if (load_long(self) < 0)
4359 break;
4360 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004361
Tim Petersee1a53c2003-02-02 02:57:53 +00004362 case LONG1:
4363 if (load_counted_long(self, 1) < 0)
4364 break;
4365 continue;
4366
4367 case LONG4:
4368 if (load_counted_long(self, 4) < 0)
4369 break;
4370 continue;
4371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 case FLOAT:
4373 if (load_float(self) < 0)
4374 break;
4375 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 case BINFLOAT:
4378 if (load_binfloat(self) < 0)
4379 break;
4380 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 case BINSTRING:
4383 if (load_binstring(self) < 0)
4384 break;
4385 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 case SHORT_BINSTRING:
4388 if (load_short_binstring(self) < 0)
4389 break;
4390 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 case STRING:
4393 if (load_string(self) < 0)
4394 break;
4395 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004396
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004397#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398 case UNICODE:
4399 if (load_unicode(self) < 0)
4400 break;
4401 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 case BINUNICODE:
4404 if (load_binunicode(self) < 0)
4405 break;
4406 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004407#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004410 if (load_counted_tuple(self, 0) < 0)
4411 break;
4412 continue;
4413
4414 case TUPLE1:
4415 if (load_counted_tuple(self, 1) < 0)
4416 break;
4417 continue;
4418
4419 case TUPLE2:
4420 if (load_counted_tuple(self, 2) < 0)
4421 break;
4422 continue;
4423
4424 case TUPLE3:
4425 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426 break;
4427 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 case TUPLE:
4430 if (load_tuple(self) < 0)
4431 break;
4432 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434 case EMPTY_LIST:
4435 if (load_empty_list(self) < 0)
4436 break;
4437 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 case LIST:
4440 if (load_list(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 EMPTY_DICT:
4445 if (load_empty_dict(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 DICT:
4450 if (load_dict(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 OBJ:
4455 if (load_obj(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 INST:
4460 if (load_inst(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 GLOBAL:
4465 if (load_global(self) < 0)
4466 break;
4467 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 case APPEND:
4470 if (load_append(self) < 0)
4471 break;
4472 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 case APPENDS:
4475 if (load_appends(self) < 0)
4476 break;
4477 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case BUILD:
4480 if (load_build(self) < 0)
4481 break;
4482 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 case DUP:
4485 if (load_dup(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 BINGET:
4490 if (load_binget(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 LONG_BINGET:
4495 if (load_long_binget(self) < 0)
4496 break;
4497 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 case GET:
4500 if (load_get(self) < 0)
4501 break;
4502 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503
Tim Peters2d629652003-02-04 05:06:17 +00004504 case EXT1:
4505 if (load_extension(self, 1) < 0)
4506 break;
4507 continue;
4508
4509 case EXT2:
4510 if (load_extension(self, 2) < 0)
4511 break;
4512 continue;
4513
4514 case EXT4:
4515 if (load_extension(self, 4) < 0)
4516 break;
4517 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 case MARK:
4519 if (load_mark(self) < 0)
4520 break;
4521 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 case BINPUT:
4524 if (load_binput(self) < 0)
4525 break;
4526 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 case LONG_BINPUT:
4529 if (load_long_binput(self) < 0)
4530 break;
4531 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 case PUT:
4534 if (load_put(self) < 0)
4535 break;
4536 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 case POP:
4539 if (load_pop(self) < 0)
4540 break;
4541 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543 case POP_MARK:
4544 if (load_pop_mark(self) < 0)
4545 break;
4546 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 case SETITEM:
4549 if (load_setitem(self) < 0)
4550 break;
4551 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 case SETITEMS:
4554 if (load_setitems(self) < 0)
4555 break;
4556 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 case STOP:
4559 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 case PERSID:
4562 if (load_persid(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 BINPERSID:
4567 if (load_binpersid(self) < 0)
4568 break;
4569 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 case REDUCE:
4572 if (load_reduce(self) < 0)
4573 break;
4574 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Tim Peters4190fb82003-02-02 16:09:05 +00004576 case PROTO:
4577 if (load_proto(self) < 0)
4578 break;
4579 continue;
4580
Tim Peters3c67d792003-02-02 17:59:11 +00004581 case NEWTRUE:
4582 if (load_bool(self, Py_True) < 0)
4583 break;
4584 continue;
4585
4586 case NEWFALSE:
4587 if (load_bool(self, Py_False) < 0)
4588 break;
4589 continue;
4590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 case '\0':
4592 /* end of file */
4593 PyErr_SetNone(PyExc_EOFError);
4594 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004597 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 "invalid load key, '%s'.",
4599 "c", s[0]);
4600 return NULL;
4601 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 break;
4604 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 if ((err = PyErr_Occurred())) {
4607 if (err == PyExc_EOFError) {
4608 PyErr_SetNone(PyExc_EOFError);
4609 }
4610 return NULL;
4611 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 PDATA_POP(self->stack, val);
4614 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004615}
Tim Peters84e87f32001-03-17 04:50:51 +00004616
Guido van Rossum60456fd1997-04-09 17:36:32 +00004617
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004618/* No-load functions to support noload, which is used to
4619 find persistent references. */
4620
4621static int
Tim Peterscba30e22003-02-01 06:24:36 +00004622noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623{
4624 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 if ((i = marker(self)) < 0) return -1;
4627 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004628}
4629
4630
4631static int
Tim Peterscba30e22003-02-01 06:24:36 +00004632noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633{
4634 int i;
4635 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 if ((i = marker(self)) < 0) return -1;
4638 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004639 if (self->readline_func(self, &s) < 0) return -1;
4640 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 PDATA_APPEND(self->stack, Py_None,-1);
4642 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643}
4644
4645static int
Tim Peterscba30e22003-02-01 06:24:36 +00004646noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004647{
4648 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004649
Tim Peters0bc93f52003-02-02 18:29:33 +00004650 if (self->readline_func(self, &s) < 0) return -1;
4651 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 PDATA_APPEND(self->stack, Py_None,-1);
4653 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004654}
4655
4656static int
Tim Peterscba30e22003-02-01 06:24:36 +00004657noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660 if (self->stack->length < 2) return stackUnderflow();
4661 Pdata_clear(self->stack, self->stack->length-2);
4662 PDATA_APPEND(self->stack, Py_None,-1);
4663 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004664}
4665
4666static int
4667noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668
Guido van Rossum053b8df1998-11-25 16:18:00 +00004669 if (self->stack->length < 1) return stackUnderflow();
4670 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004671 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004672}
4673
Tim Peters2d629652003-02-04 05:06:17 +00004674static int
4675noload_extension(Unpicklerobject *self, int nbytes)
4676{
4677 char *codebytes;
4678
4679 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4680 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4681 PDATA_APPEND(self->stack, Py_None, -1);
4682 return 0;
4683}
4684
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004685
4686static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004687noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688{
4689 PyObject *err = 0, *val = 0;
4690 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692 self->num_marks = 0;
4693 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004696 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004699 switch (s[0]) {
4700 case NONE:
4701 if (load_none(self) < 0)
4702 break;
4703 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 case BININT:
4706 if (load_binint(self) < 0)
4707 break;
4708 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 case BININT1:
4711 if (load_binint1(self) < 0)
4712 break;
4713 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 case BININT2:
4716 if (load_binint2(self) < 0)
4717 break;
4718 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 case INT:
4721 if (load_int(self) < 0)
4722 break;
4723 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 case LONG:
4726 if (load_long(self) < 0)
4727 break;
4728 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004729
Tim Peters4190fb82003-02-02 16:09:05 +00004730 case LONG1:
4731 if (load_counted_long(self, 1) < 0)
4732 break;
4733 continue;
4734
4735 case LONG4:
4736 if (load_counted_long(self, 4) < 0)
4737 break;
4738 continue;
4739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 case FLOAT:
4741 if (load_float(self) < 0)
4742 break;
4743 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 case BINFLOAT:
4746 if (load_binfloat(self) < 0)
4747 break;
4748 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 case BINSTRING:
4751 if (load_binstring(self) < 0)
4752 break;
4753 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 case SHORT_BINSTRING:
4756 if (load_short_binstring(self) < 0)
4757 break;
4758 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 case STRING:
4761 if (load_string(self) < 0)
4762 break;
4763 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004764
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004765#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 case UNICODE:
4767 if (load_unicode(self) < 0)
4768 break;
4769 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 case BINUNICODE:
4772 if (load_binunicode(self) < 0)
4773 break;
4774 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004775#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004778 if (load_counted_tuple(self, 0) < 0)
4779 break;
4780 continue;
4781
4782 case TUPLE1:
4783 if (load_counted_tuple(self, 1) < 0)
4784 break;
4785 continue;
4786
4787 case TUPLE2:
4788 if (load_counted_tuple(self, 2) < 0)
4789 break;
4790 continue;
4791
4792 case TUPLE3:
4793 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 break;
4795 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004797 case TUPLE:
4798 if (load_tuple(self) < 0)
4799 break;
4800 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004802 case EMPTY_LIST:
4803 if (load_empty_list(self) < 0)
4804 break;
4805 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 case LIST:
4808 if (load_list(self) < 0)
4809 break;
4810 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 case EMPTY_DICT:
4813 if (load_empty_dict(self) < 0)
4814 break;
4815 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 case DICT:
4818 if (load_dict(self) < 0)
4819 break;
4820 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 case OBJ:
4823 if (noload_obj(self) < 0)
4824 break;
4825 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 case INST:
4828 if (noload_inst(self) < 0)
4829 break;
4830 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 case GLOBAL:
4833 if (noload_global(self) < 0)
4834 break;
4835 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 case APPEND:
4838 if (load_append(self) < 0)
4839 break;
4840 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842 case APPENDS:
4843 if (load_appends(self) < 0)
4844 break;
4845 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004847 case BUILD:
4848 if (noload_build(self) < 0)
4849 break;
4850 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 case DUP:
4853 if (load_dup(self) < 0)
4854 break;
4855 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004857 case BINGET:
4858 if (load_binget(self) < 0)
4859 break;
4860 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 case LONG_BINGET:
4863 if (load_long_binget(self) < 0)
4864 break;
4865 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 case GET:
4868 if (load_get(self) < 0)
4869 break;
4870 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004871
Tim Peters2d629652003-02-04 05:06:17 +00004872 case EXT1:
4873 if (noload_extension(self, 1) < 0)
4874 break;
4875 continue;
4876
4877 case EXT2:
4878 if (noload_extension(self, 2) < 0)
4879 break;
4880 continue;
4881
4882 case EXT4:
4883 if (noload_extension(self, 4) < 0)
4884 break;
4885 continue;
4886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004887 case MARK:
4888 if (load_mark(self) < 0)
4889 break;
4890 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 case BINPUT:
4893 if (load_binput(self) < 0)
4894 break;
4895 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 case LONG_BINPUT:
4898 if (load_long_binput(self) < 0)
4899 break;
4900 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 case PUT:
4903 if (load_put(self) < 0)
4904 break;
4905 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907 case POP:
4908 if (load_pop(self) < 0)
4909 break;
4910 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 case POP_MARK:
4913 if (load_pop_mark(self) < 0)
4914 break;
4915 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004917 case SETITEM:
4918 if (load_setitem(self) < 0)
4919 break;
4920 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 case SETITEMS:
4923 if (load_setitems(self) < 0)
4924 break;
4925 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004927 case STOP:
4928 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930 case PERSID:
4931 if (load_persid(self) < 0)
4932 break;
4933 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 case BINPERSID:
4936 if (load_binpersid(self) < 0)
4937 break;
4938 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004940 case REDUCE:
4941 if (noload_reduce(self) < 0)
4942 break;
4943 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004944
Tim Peters4190fb82003-02-02 16:09:05 +00004945 case PROTO:
4946 if (load_proto(self) < 0)
4947 break;
4948 continue;
4949
Tim Peters3c67d792003-02-02 17:59:11 +00004950 case NEWTRUE:
4951 if (load_bool(self, Py_True) < 0)
4952 break;
4953 continue;
4954
4955 case NEWFALSE:
4956 if (load_bool(self, Py_False) < 0)
4957 break;
4958 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004960 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004961 "invalid load key, '%s'.",
4962 "c", s[0]);
4963 return NULL;
4964 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 break;
4967 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 if ((err = PyErr_Occurred())) {
4970 if (err == PyExc_EOFError) {
4971 PyErr_SetNone(PyExc_EOFError);
4972 }
4973 return NULL;
4974 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 PDATA_POP(self->stack, val);
4977 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004978}
Tim Peters84e87f32001-03-17 04:50:51 +00004979
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004980
Guido van Rossum60456fd1997-04-09 17:36:32 +00004981static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004982Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983{
Tim Peterscba30e22003-02-01 06:24:36 +00004984 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004985 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004988}
4989
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004990static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004991Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992{
Tim Peterscba30e22003-02-01 06:24:36 +00004993 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004994 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004997}
4998
Guido van Rossum60456fd1997-04-09 17:36:32 +00004999
5000static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005001 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005002 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005003 },
Neal Norwitzb0493252002-03-31 14:44:22 +00005004 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005005 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005006 "noload() -- not load a pickle, but go through most of the motions\n"
5007 "\n"
5008 "This function can be used to read past a pickle without instantiating\n"
5009 "any objects or importing any modules. It can also be used to find all\n"
5010 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005011 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005012 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005013 {NULL, NULL} /* sentinel */
5014};
5015
5016
5017static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005018newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005019{
5020 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005021
Tim Peterscba30e22003-02-01 06:24:36 +00005022 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005023 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 self->file = NULL;
5026 self->arg = NULL;
5027 self->stack = (Pdata*)Pdata_New();
5028 self->pers_func = NULL;
5029 self->last_string = NULL;
5030 self->marks = NULL;
5031 self->num_marks = 0;
5032 self->marks_size = 0;
5033 self->buf_size = 0;
5034 self->read = NULL;
5035 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005037
Tim Peterscba30e22003-02-01 06:24:36 +00005038 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005039 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005041 Py_INCREF(f);
5042 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005044 /* Set read, readline based on type of f */
5045 if (PyFile_Check(f)) {
5046 self->fp = PyFile_AsFile(f);
5047 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005048 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005049 "I/O operation on closed file");
5050 goto err;
5051 }
5052 self->read_func = read_file;
5053 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005054 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005055 else if (PycStringIO_InputCheck(f)) {
5056 self->fp = NULL;
5057 self->read_func = read_cStringIO;
5058 self->readline_func = readline_cStringIO;
5059 }
5060 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005062 self->fp = NULL;
5063 self->read_func = read_other;
5064 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5067 (self->read = PyObject_GetAttr(f, read_str)))) {
5068 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005069 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005070 "argument must have 'read' and "
5071 "'readline' attributes" );
5072 goto err;
5073 }
5074 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005076 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005078 err:
5079 Py_DECREF((PyObject *)self);
5080 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005081}
5082
5083
5084static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005085get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086{
5087 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00005088
Tim Peterscba30e22003-02-01 06:24:36 +00005089 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005090 return NULL;
5091 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005092}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005093
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005094
Guido van Rossum60456fd1997-04-09 17:36:32 +00005095static void
Tim Peterscba30e22003-02-01 06:24:36 +00005096Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005097{
5098 Py_XDECREF(self->readline);
5099 Py_XDECREF(self->read);
5100 Py_XDECREF(self->file);
5101 Py_XDECREF(self->memo);
5102 Py_XDECREF(self->stack);
5103 Py_XDECREF(self->pers_func);
5104 Py_XDECREF(self->arg);
5105 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 if (self->marks) {
5108 free(self->marks);
5109 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005111 if (self->buf_size) {
5112 free(self->buf);
5113 }
Tim Peters84e87f32001-03-17 04:50:51 +00005114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005115 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005116}
5117
5118
5119static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005120Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121{
5122 if (!strcmp(name, "persistent_load")) {
5123 if (!self->pers_func) {
5124 PyErr_SetString(PyExc_AttributeError, name);
5125 return NULL;
5126 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 Py_INCREF(self->pers_func);
5129 return self->pers_func;
5130 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 if (!strcmp(name, "find_global")) {
5133 if (!self->find_class) {
5134 PyErr_SetString(PyExc_AttributeError, name);
5135 return NULL;
5136 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 Py_INCREF(self->find_class);
5139 return self->find_class;
5140 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005142 if (!strcmp(name, "memo")) {
5143 if (!self->memo) {
5144 PyErr_SetString(PyExc_AttributeError, name);
5145 return NULL;
5146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 Py_INCREF(self->memo);
5149 return self->memo;
5150 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 if (!strcmp(name, "UnpicklingError")) {
5153 Py_INCREF(UnpicklingError);
5154 return UnpicklingError;
5155 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005158}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005159
Guido van Rossum60456fd1997-04-09 17:36:32 +00005160
5161static int
Tim Peterscba30e22003-02-01 06:24:36 +00005162Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005165 if (!strcmp(name, "persistent_load")) {
5166 Py_XDECREF(self->pers_func);
5167 self->pers_func = value;
5168 Py_XINCREF(value);
5169 return 0;
5170 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005172 if (!strcmp(name, "find_global")) {
5173 Py_XDECREF(self->find_class);
5174 self->find_class = value;
5175 Py_XINCREF(value);
5176 return 0;
5177 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 if (! value) {
5180 PyErr_SetString(PyExc_TypeError,
5181 "attribute deletion is not supported");
5182 return -1;
5183 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005185 if (strcmp(name, "memo") == 0) {
5186 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005187 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005188 "memo must be a dictionary");
5189 return -1;
5190 }
5191 Py_XDECREF(self->memo);
5192 self->memo = value;
5193 Py_INCREF(value);
5194 return 0;
5195 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005197 PyErr_SetString(PyExc_AttributeError, name);
5198 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005199}
5200
Tim Peters5bd2a792003-02-01 16:45:06 +00005201/* ---------------------------------------------------------------------------
5202 * Module-level functions.
5203 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005204
Tim Peters5bd2a792003-02-01 16:45:06 +00005205/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005206static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005207cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208{
5209 PyObject *ob, *file, *res = NULL;
5210 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005211 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005212
Tim Peters5bd2a792003-02-01 16:45:06 +00005213 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005215
Tim Peters5bd2a792003-02-01 16:45:06 +00005216 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005217 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 if (dump(pickler, ob) < 0)
5220 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005222 Py_INCREF(Py_None);
5223 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225 finally:
5226 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005228 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005229}
5230
5231
Tim Peters5bd2a792003-02-01 16:45:06 +00005232/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005233static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005234cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235{
5236 PyObject *ob, *file = 0, *res = NULL;
5237 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005238 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005239
Tim Peters5bd2a792003-02-01 16:45:06 +00005240 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005241 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Tim Peterscba30e22003-02-01 06:24:36 +00005243 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005245
Tim Peters5bd2a792003-02-01 16:45:06 +00005246 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005247 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005249 if (dump(pickler, ob) < 0)
5250 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005252 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 finally:
5255 Py_XDECREF(pickler);
5256 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005259}
5260
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005261
Tim Peters5bd2a792003-02-01 16:45:06 +00005262/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005263static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005264cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265{
5266 Unpicklerobject *unpickler = 0;
5267 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005268
Tim Peterscba30e22003-02-01 06:24:36 +00005269 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005270 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005271
Tim Peterscba30e22003-02-01 06:24:36 +00005272 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005273 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005275 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005277 finally:
5278 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005280 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005281}
5282
5283
Tim Peters5bd2a792003-02-01 16:45:06 +00005284/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005285static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005286cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005287{
5288 PyObject *ob, *file = 0, *res = NULL;
5289 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005290
Tim Peterscba30e22003-02-01 06:24:36 +00005291 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005292 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005293
Tim Peterscba30e22003-02-01 06:24:36 +00005294 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005295 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005296
Tim Peterscba30e22003-02-01 06:24:36 +00005297 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005300 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005302 finally:
5303 Py_XDECREF(file);
5304 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005306 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005307}
5308
5309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005310PyDoc_STRVAR(Unpicklertype__doc__,
5311"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005312
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005313static PyTypeObject Unpicklertype = {
5314 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00005315 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00005316 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00005317 sizeof(Unpicklerobject), /*tp_basicsize*/
5318 0, /*tp_itemsize*/
5319 /* methods */
5320 (destructor)Unpickler_dealloc, /*tp_dealloc*/
5321 (printfunc)0, /*tp_print*/
5322 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
5323 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
5324 (cmpfunc)0, /*tp_compare*/
5325 (reprfunc)0, /*tp_repr*/
5326 0, /*tp_as_number*/
5327 0, /*tp_as_sequence*/
5328 0, /*tp_as_mapping*/
5329 (hashfunc)0, /*tp_hash*/
5330 (ternaryfunc)0, /*tp_call*/
5331 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005332
Guido van Rossum60456fd1997-04-09 17:36:32 +00005333 /* Space for future expansion */
5334 0L,0L,0L,0L,
5335 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005336};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005337
Guido van Rossum60456fd1997-04-09 17:36:32 +00005338static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005339 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005340 PyDoc_STR("dump(object, file, proto=0) -- "
5341 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005342 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005343 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005344 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005345
Neal Norwitzb0493252002-03-31 14:44:22 +00005346 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005347 PyDoc_STR("dumps(object, proto=0) -- "
5348 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005349 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005350 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005351 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005352
Neal Norwitzb0493252002-03-31 14:44:22 +00005353 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005354 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005355
Neal Norwitzb0493252002-03-31 14:44:22 +00005356 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005357 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005358
Neal Norwitzb0493252002-03-31 14:44:22 +00005359 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005360 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005361 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005362 "This takes a file-like object for writing a pickle data stream.\n"
5363 "The optional proto argument tells the pickler to use the given\n"
5364 "protocol; supported protocols are 0, 1, 2. The default\n"
5365 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5366 "only protocol that can be written to a file opened in text\n"
5367 "mode and read back successfully. When using a protocol higher\n"
5368 "than 0, make sure the file is opened in binary mode, both when\n"
5369 "pickling and unpickling.)\n"
5370 "\n"
5371 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5372 "more efficient than protocol 1.\n"
5373 "\n"
5374 "Specifying a negative protocol version selects the highest\n"
5375 "protocol version supported. The higher the protocol used, the\n"
5376 "more recent the version of Python needed to read the pickle\n"
5377 "produced.\n"
5378 "\n"
5379 "The file parameter must have a write() method that accepts a single\n"
5380 "string argument. It can thus be an open file object, a StringIO\n"
5381 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005382 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005383
Neal Norwitzb0493252002-03-31 14:44:22 +00005384 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005385 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5386
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005387 { NULL, NULL }
5388};
5389
Guido van Rossum60456fd1997-04-09 17:36:32 +00005390static int
Tim Peterscba30e22003-02-01 06:24:36 +00005391init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005392{
5393 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005394
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005395#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 INIT_STR(__class__);
5398 INIT_STR(__getinitargs__);
5399 INIT_STR(__dict__);
5400 INIT_STR(__getstate__);
5401 INIT_STR(__setstate__);
5402 INIT_STR(__name__);
5403 INIT_STR(__main__);
5404 INIT_STR(__reduce__);
5405 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005406 INIT_STR(append);
5407 INIT_STR(read);
5408 INIT_STR(readline);
5409 INIT_STR(copy_reg);
5410 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005411 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005412
Tim Peterscba30e22003-02-01 06:24:36 +00005413 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005415
Tim Peters1f1b2d22003-02-01 02:16:37 +00005416 /* This is special because we want to use a different
5417 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005419 if (!dispatch_table) return -1;
5420
5421 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005422 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005423 if (!extension_registry) return -1;
5424
5425 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005426 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005427 if (!inverted_registry) return -1;
5428
5429 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005430 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005431 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005433 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005434
Tim Peters731098b2003-02-04 20:56:09 +00005435 if (!(empty_tuple = PyTuple_New(0)))
5436 return -1;
5437
5438 two_tuple = PyTuple_New(2);
5439 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005440 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005441 /* We use this temp container with no regard to refcounts, or to
5442 * keeping containees alive. Exempt from GC, because we don't
5443 * want anything looking at two_tuple() by magic.
5444 */
5445 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005447 /* Ugh */
5448 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5449 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5450 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005452 if (!( t=PyDict_New())) return -1;
5453 if (!( r=PyRun_String(
5454 "def __init__(self, *args): self.args=args\n\n"
5455 "def __str__(self):\n"
5456 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5457 Py_file_input,
5458 module_dict, t) )) return -1;
5459 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005462 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005466
Tim Peterscba30e22003-02-01 06:24:36 +00005467 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005469 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 if (!( t=PyDict_New())) return -1;
5473 if (!( r=PyRun_String(
5474 "def __init__(self, *args): self.args=args\n\n"
5475 "def __str__(self):\n"
5476 " a=self.args\n"
5477 " a=a and type(a[0]) or '(what)'\n"
5478 " return 'Cannot pickle %s objects' % a\n"
5479 , Py_file_input,
5480 module_dict, t) )) return -1;
5481 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005483 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005484 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005485 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005489 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005490 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005491 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005492
Martin v. Löwis658009a2002-09-16 17:26:24 +00005493 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5494 UnpicklingError, NULL)))
5495 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497 if (PyDict_SetItemString(module_dict, "PickleError",
5498 PickleError) < 0)
5499 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005501 if (PyDict_SetItemString(module_dict, "PicklingError",
5502 PicklingError) < 0)
5503 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005505 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5506 UnpicklingError) < 0)
5507 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005509 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5510 UnpickleableError) < 0)
5511 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005513 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5514 BadPickleGet) < 0)
5515 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005517 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005519 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005520}
5521
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005522#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5523#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005524#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005525PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005526initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005527{
5528 PyObject *m, *d, *di, *v, *k;
5529 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005530 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005531 PyObject *format_version;
5532 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005534 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005535 Unpicklertype.ob_type = &PyType_Type;
5536 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005538 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005539 * so we're forced to use a temporary dictionary. :(
5540 */
5541 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005542 if (!di) return;
5543 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005545 /* Create the module and add the functions */
5546 m = Py_InitModule4("cPickle", cPickle_methods,
5547 cPickle_module_documentation,
5548 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005550 /* Add some symbolic constants to the module */
5551 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005552 v = PyString_FromString(rev);
5553 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005554 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005556 /* Copy data from di. Waaa. */
5557 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5558 if (PyObject_SetItem(d, k, v) < 0) {
5559 Py_DECREF(di);
5560 return;
5561 }
5562 }
5563 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005564
Tim Peters5b7da392003-02-04 00:21:07 +00005565 /* These are purely informational; no code uses them. */
5566 /* File format version we write. */
5567 format_version = PyString_FromString("2.0");
5568 /* Format versions we can read. */
5569 compatible_formats = Py_BuildValue("[sssss]",
5570 "1.0", /* Original protocol 0 */
5571 "1.1", /* Protocol 0 + INST */
5572 "1.2", /* Original protocol 1 */
5573 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005574 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005575 PyDict_SetItemString(d, "format_version", format_version);
5576 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5577 Py_XDECREF(format_version);
5578 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005579}