blob: a3a07b2169796272703c62e5ab3625aef3b6fc1e [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
Guido van Rossum60456fd1997-04-09 17:36:32 +000090static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossumc03158b1999-06-09 15:23:31 +000092static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000094static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000096static PyObject *BadPickleGet;
97
Tim Peters5b7da392003-02-04 00:21:07 +000098/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100
Tim Peters5b7da392003-02-04 00:21:07 +0000101/* copy_reg.dispatch_table, {type_object: pickling_function} */
102static PyObject *dispatch_table;
103
104/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000105/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000106static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000107/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000108static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000109/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000110static PyObject *extension_cache;
111
Guido van Rossum60456fd1997-04-09 17:36:32 +0000112static PyObject *__class___str, *__getinitargs___str, *__dict___str,
113 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000114 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000115 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000116 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000117
Guido van Rossum053b8df1998-11-25 16:18:00 +0000118/*************************************************************************
119 Internal Data type for pickle data. */
120
121typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000122 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000123 int length; /* number of initial slots in data currently used */
124 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000125 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000126} Pdata;
127
Tim Peters84e87f32001-03-17 04:50:51 +0000128static void
Tim Peterscba30e22003-02-01 06:24:36 +0000129Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000130{
131 int i;
132 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000133
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 for (i = self->length, p = self->data; --i >= 0; p++) {
135 Py_DECREF(*p);
136 }
137 if (self->data)
138 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000139 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000140}
141
142static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000143 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
144 (destructor)Pdata_dealloc,
145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000146};
147
148#define Pdata_Check(O) ((O)->ob_type == &PdataType)
149
150static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000151Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000152{
153 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000154
Tim Peters1d63c9f2003-02-02 20:29:39 +0000155 if (!(self = PyObject_New(Pdata, &PdataType)))
156 return NULL;
157 self->size = 8;
158 self->length = 0;
159 self->data = malloc(self->size * sizeof(PyObject*));
160 if (self->data)
161 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000162 Py_DECREF(self);
163 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164}
165
Tim Peters84e87f32001-03-17 04:50:51 +0000166static int
Tim Peterscba30e22003-02-01 06:24:36 +0000167stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168{
169 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
170 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171}
172
Tim Peters1d63c9f2003-02-02 20:29:39 +0000173/* Retain only the initial clearto items. If clearto >= the current
174 * number of items, this is a (non-erroneous) NOP.
175 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000176static int
Tim Peterscba30e22003-02-01 06:24:36 +0000177Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178{
179 int i;
180 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000182 if (clearto < 0) return stackUnderflow();
183 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000184
Tim Peters1d63c9f2003-02-02 20:29:39 +0000185 for (i = self->length, p = self->data + clearto;
186 --i >= clearto;
187 p++) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000188 Py_DECREF(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000189 }
190 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000192 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000193}
194
Tim Peters84e87f32001-03-17 04:50:51 +0000195static int
Tim Peterscba30e22003-02-01 06:24:36 +0000196Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000197{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000198 int bigger;
199 size_t nbytes;
200
Tim Peters1d63c9f2003-02-02 20:29:39 +0000201 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000202 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000203 goto nomemory;
204 if ((int)(size_t)bigger != bigger)
205 goto nomemory;
206 nbytes = (size_t)bigger * sizeof(PyObject *);
207 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
208 goto nomemory;
209 self->data = realloc(self->data, nbytes);
210 if (self->data == NULL)
211 goto nomemory;
212 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000213 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000214
215 nomemory:
216 self->size = 0;
217 PyErr_NoMemory();
218 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000219}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000220
Tim Peterse0a39072003-02-03 15:45:56 +0000221/* D is a Pdata*. Pop the topmost element and store it into V, which
222 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 * is raised and V is set to NULL. D and V may be evaluated several times.
224 */
225#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000226 if ((D)->length) \
227 (V) = (D)->data[--((D)->length)]; \
228 else { \
229 PyErr_SetString(UnpicklingError, "bad pickle data"); \
230 (V) = NULL; \
231 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232}
233
Tim Peterse0a39072003-02-03 15:45:56 +0000234/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
235 * D. If the Pdata stack can't be grown to hold the new value, both
236 * raise MemoryError and execute "return ER". The difference is in ownership
237 * of O after: _PUSH transfers ownership of O from the caller to the stack
238 * (no incref of O is done, and in case of error O is decrefed), while
239 * _APPEND pushes a new reference.
240 */
241
242/* Push O on stack D, giving ownership of O to the stack. */
243#define PDATA_PUSH(D, O, ER) { \
244 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
245 Pdata_grow((Pdata*)(D)) < 0) { \
246 Py_DECREF(O); \
247 return ER; \
248 } \
249 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
250}
251
252/* Push O on stack D, pushing a new reference. */
253#define PDATA_APPEND(D, O, ER) { \
254 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
255 Pdata_grow((Pdata*)(D)) < 0) \
256 return ER; \
257 Py_INCREF(O); \
258 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
259}
260
261
Guido van Rossum053b8df1998-11-25 16:18:00 +0000262static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000263Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000264{
265 PyObject *r;
266 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000267
Tim Peters1d63c9f2003-02-02 20:29:39 +0000268 l = self->length-start;
269 r = PyTuple_New(l);
270 if (r == NULL)
271 return NULL;
272 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000273 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000274
Tim Peters1d63c9f2003-02-02 20:29:39 +0000275 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000277}
278
279static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000280Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000281{
282 PyObject *r;
283 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 l=self->length-start;
286 if (!( r=PyList_New(l))) return NULL;
287 for (i=start, j=0 ; j < l; i++, j++)
288 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000290 self->length=start;
291 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000292}
293
Guido van Rossum053b8df1998-11-25 16:18:00 +0000294/*************************************************************************/
295
296#define ARG_TUP(self, o) { \
297 if (self->arg || (self->arg=PyTuple_New(1))) { \
298 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
299 PyTuple_SET_ITEM(self->arg,0,o); \
300 } \
301 else { \
302 Py_DECREF(o); \
303 } \
304}
305
306#define FREE_ARG_TUP(self) { \
307 if (self->arg->ob_refcnt > 1) { \
308 Py_DECREF(self->arg); \
309 self->arg=NULL; \
310 } \
311 }
312
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000313typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000314 PyObject_HEAD
315 FILE *fp;
316 PyObject *write;
317 PyObject *file;
318 PyObject *memo;
319 PyObject *arg;
320 PyObject *pers_func;
321 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000322
323 /* pickle protocol number, >= 0 */
324 int proto;
325
326 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000327 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000329 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000330 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000331 int (*write_func)(struct Picklerobject *, char *, int);
332 char *write_buf;
333 int buf_size;
334 PyObject *dispatch_table;
335 int fast_container; /* count nested container dumps */
336 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000337} Picklerobject;
338
Barry Warsaw52acb492001-12-21 20:04:22 +0000339#ifndef PY_CPICKLE_FAST_LIMIT
340#define PY_CPICKLE_FAST_LIMIT 50
341#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000342
Jeremy Hylton938ace62002-07-17 16:30:39 +0000343static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000344
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000345typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000346 PyObject_HEAD
347 FILE *fp;
348 PyObject *file;
349 PyObject *readline;
350 PyObject *read;
351 PyObject *memo;
352 PyObject *arg;
353 Pdata *stack;
354 PyObject *mark;
355 PyObject *pers_func;
356 PyObject *last_string;
357 int *marks;
358 int num_marks;
359 int marks_size;
360 int (*read_func)(struct Unpicklerobject *, char **, int);
361 int (*readline_func)(struct Unpicklerobject *, char **);
362 int buf_size;
363 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000364 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000365} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000366
Jeremy Hylton938ace62002-07-17 16:30:39 +0000367static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000368
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000369/* Forward decls that need the above structs */
370static int save(Picklerobject *, PyObject *, int);
371static int put2(Picklerobject *, PyObject *);
372
Guido van Rossumd385d591997-04-09 17:47:47 +0000373static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000374PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000375cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
376{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000377 va_list va;
378 PyObject *args=0, *retval=0;
379 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000381 if (format) args = Py_VaBuildValue(format, va);
382 va_end(va);
383 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000384 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000385 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 if (retval) {
388 if (args) {
389 PyObject *v;
390 v=PyString_Format(retval, args);
391 Py_DECREF(retval);
392 Py_DECREF(args);
393 if (! v) return NULL;
394 retval=v;
395 }
396 }
397 else
398 if (args) retval=args;
399 else {
400 PyErr_SetObject(ErrType,Py_None);
401 return NULL;
402 }
403 PyErr_SetObject(ErrType,retval);
404 Py_DECREF(retval);
405 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000406}
407
Tim Peters84e87f32001-03-17 04:50:51 +0000408static int
Tim Peterscba30e22003-02-01 06:24:36 +0000409write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000410{
411 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000413 if (s == NULL) {
414 return 0;
415 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000417 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000418 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000419 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000420 if (nbyteswritten != (size_t)n) {
421 PyErr_SetFromErrno(PyExc_IOError);
422 return -1;
423 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000426}
427
Tim Peters84e87f32001-03-17 04:50:51 +0000428static int
Tim Peterscba30e22003-02-01 06:24:36 +0000429write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000430{
431 if (s == NULL) {
432 return 0;
433 }
Tim Peterscba30e22003-02-01 06:24:36 +0000434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000435 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
436 return -1;
437 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000440}
441
Tim Peters84e87f32001-03-17 04:50:51 +0000442static int
Tim Peterscba30e22003-02-01 06:24:36 +0000443write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444{
445 if (s == NULL) return 0;
446 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000447}
448
Tim Peters84e87f32001-03-17 04:50:51 +0000449static int
Tim Peterscba30e22003-02-01 06:24:36 +0000450write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000451{
452 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 if (s == NULL) {
455 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000456 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000457 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000458 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000459 return -1;
460 }
461 else {
462 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
463 if (write_other(self, NULL, 0) < 0)
464 return -1;
465 }
Tim Peterscba30e22003-02-01 06:24:36 +0000466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 if (n > WRITE_BUF_SIZE) {
468 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000469 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000470 return -1;
471 }
472 else {
473 memcpy(self->write_buf + self->buf_size, s, n);
474 self->buf_size += n;
475 return n;
476 }
477 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000479 if (self->write) {
480 /* object with write method */
481 ARG_TUP(self, py_str);
482 if (self->arg) {
483 junk = PyObject_Call(self->write, self->arg, NULL);
484 FREE_ARG_TUP(self);
485 }
486 if (junk) Py_DECREF(junk);
487 else return -1;
488 }
489 else
490 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 self->buf_size = 0;
493 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000494}
495
496
Tim Peters84e87f32001-03-17 04:50:51 +0000497static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000498read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499{
500 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 if (self->buf_size == 0) {
503 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000506 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000507 PyErr_NoMemory();
508 return -1;
509 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000511 self->buf_size = size;
512 }
513 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000514 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 if (!self->buf) {
516 PyErr_NoMemory();
517 return -1;
518 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000519 self->buf_size = n;
520 }
Tim Peters84e87f32001-03-17 04:50:51 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 Py_BEGIN_ALLOW_THREADS
523 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
524 Py_END_ALLOW_THREADS
525 if (nbytesread != (size_t)n) {
526 if (feof(self->fp)) {
527 PyErr_SetNone(PyExc_EOFError);
528 return -1;
529 }
Tim Peterscba30e22003-02-01 06:24:36 +0000530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000531 PyErr_SetFromErrno(PyExc_IOError);
532 return -1;
533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000535 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000537 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000538}
539
540
Tim Peters84e87f32001-03-17 04:50:51 +0000541static int
Tim Peterscba30e22003-02-01 06:24:36 +0000542readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543{
544 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000547 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000548 PyErr_NoMemory();
549 return -1;
550 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551 self->buf_size = 40;
552 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 i = 0;
555 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000556 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000558 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 (self->buf[i] = getc(self->fp)) == '\n') {
560 self->buf[i + 1] = '\0';
561 *s = self->buf;
562 return i + 1;
563 }
564 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000565 bigger = self->buf_size << 1;
566 if (bigger <= 0) { /* overflow */
567 PyErr_NoMemory();
568 return -1;
569 }
570 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 if (!self->buf) {
572 PyErr_NoMemory();
573 return -1;
574 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000575 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 }
Tim Peters84e87f32001-03-17 04:50:51 +0000577}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000578
579
Tim Peters84e87f32001-03-17 04:50:51 +0000580static int
Tim Peterscba30e22003-02-01 06:24:36 +0000581read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582{
583 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
586 PyErr_SetNone(PyExc_EOFError);
587 return -1;
588 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000590 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000592 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593}
594
595
Tim Peters84e87f32001-03-17 04:50:51 +0000596static int
Tim Peterscba30e22003-02-01 06:24:36 +0000597readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598{
599 int n;
600 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
603 return -1;
604 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000606 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609}
610
611
Tim Peters84e87f32001-03-17 04:50:51 +0000612static int
Tim Peterscba30e22003-02-01 06:24:36 +0000613read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614{
615 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619 ARG_TUP(self, bytes);
620 if (self->arg) {
621 str = PyObject_Call(self->read, self->arg, NULL);
622 FREE_ARG_TUP(self);
623 }
624 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000626 Py_XDECREF(self->last_string);
627 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629 if (! (*s = PyString_AsString(str))) return -1;
630 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000631}
632
633
Tim Peters84e87f32001-03-17 04:50:51 +0000634static int
Tim Peterscba30e22003-02-01 06:24:36 +0000635readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636{
637 PyObject *str;
638 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
641 return -1;
642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 if ((str_size = PyString_Size(str)) < 0)
645 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 Py_XDECREF(self->last_string);
648 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 if (! (*s = PyString_AsString(str)))
651 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000653 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654}
655
Tim Petersee1a53c2003-02-02 02:57:53 +0000656/* Copy the first n bytes from s into newly malloc'ed memory, plus a
657 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
658 * The caller is responsible for free()'ing the return value.
659 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000660static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000661pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662{
Tim Petersee1a53c2003-02-02 02:57:53 +0000663 char *r = (char *)malloc(n+1);
664 if (r == NULL)
665 return (char*)PyErr_NoMemory();
666 memcpy(r, s, n);
667 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000668 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000669}
670
671
672static int
Tim Peterscba30e22003-02-01 06:24:36 +0000673get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000674{
675 PyObject *value, *mv;
676 long c_value;
677 char s[30];
678 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680 if (!( mv = PyDict_GetItem(self->memo, id))) {
681 PyErr_SetObject(PyExc_KeyError, id);
682 return -1;
683 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000684
Tim Peterscba30e22003-02-01 06:24:36 +0000685 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000686 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000688 if (!( PyInt_Check(value))) {
689 PyErr_SetString(PicklingError, "no int where int expected in memo");
690 return -1;
691 }
692 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000694 if (!self->bin) {
695 s[0] = GET;
696 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
697 len = strlen(s);
698 }
699 else if (Pdata_Check(self->file)) {
700 if (write_other(self, NULL, 0) < 0) return -1;
701 PDATA_APPEND(self->file, mv, -1);
702 return 0;
703 }
704 else {
705 if (c_value < 256) {
706 s[0] = BINGET;
707 s[1] = (int)(c_value & 0xff);
708 len = 2;
709 }
710 else {
711 s[0] = LONG_BINGET;
712 s[1] = (int)(c_value & 0xff);
713 s[2] = (int)((c_value >> 8) & 0xff);
714 s[3] = (int)((c_value >> 16) & 0xff);
715 s[4] = (int)((c_value >> 24) & 0xff);
716 len = 5;
717 }
718 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000719
Tim Peters0bc93f52003-02-02 18:29:33 +0000720 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000722
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000723 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000725
Guido van Rossum60456fd1997-04-09 17:36:32 +0000726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000727static int
Tim Peterscba30e22003-02-01 06:24:36 +0000728put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000729{
Tim Peterscba30e22003-02-01 06:24:36 +0000730 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000731 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000733 return put2(self, ob);
734}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000735
Guido van Rossum053b8df1998-11-25 16:18:00 +0000736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737static int
Tim Peterscba30e22003-02-01 06:24:36 +0000738put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000739{
740 char c_str[30];
741 int p;
742 size_t len;
743 int res = -1;
744 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000746 if (self->fast)
747 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 if ((p = PyDict_Size(self->memo)) < 0)
750 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000752 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000753 /* XXX Why?
754 * XXX And does "positive" really mean non-negative?
755 * XXX pickle.py starts with PUT index 0, not 1. This makes for
756 * XXX gratuitous differences between the pickling modules.
757 */
Tim Peterscba30e22003-02-01 06:24:36 +0000758 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000759
Tim Peterscba30e22003-02-01 06:24:36 +0000760 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000761 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000762
Tim Peterscba30e22003-02-01 06:24:36 +0000763 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000765
Tim Peterscba30e22003-02-01 06:24:36 +0000766 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000767 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769 PyTuple_SET_ITEM(t, 0, memo_len);
770 Py_INCREF(memo_len);
771 PyTuple_SET_ITEM(t, 1, ob);
772 Py_INCREF(ob);
773
774 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
775 goto finally;
776
777 if (!self->bin) {
778 c_str[0] = PUT;
779 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
780 len = strlen(c_str);
781 }
782 else if (Pdata_Check(self->file)) {
783 if (write_other(self, NULL, 0) < 0) return -1;
784 PDATA_APPEND(self->file, memo_len, -1);
785 res=0; /* Job well done ;) */
786 goto finally;
787 }
788 else {
789 if (p >= 256) {
790 c_str[0] = LONG_BINPUT;
791 c_str[1] = (int)(p & 0xff);
792 c_str[2] = (int)((p >> 8) & 0xff);
793 c_str[3] = (int)((p >> 16) & 0xff);
794 c_str[4] = (int)((p >> 24) & 0xff);
795 len = 5;
796 }
797 else {
798 c_str[0] = BINPUT;
799 c_str[1] = p;
800 len = 2;
801 }
802 }
803
Tim Peters0bc93f52003-02-02 18:29:33 +0000804 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000805 goto finally;
806
807 res = 0;
808
809 finally:
810 Py_XDECREF(py_ob_id);
811 Py_XDECREF(memo_len);
812 Py_XDECREF(t);
813
814 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000815}
816
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000817#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000818
819static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000820PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821{
822 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
823 static PyObject *standard_builtins=0;
824 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000826 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000827 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000828 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000829 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000831 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832 return NULL;
833 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000835 if ((globals=PyEval_GetGlobals())) {
836 Py_INCREF(globals);
837 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000838 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 goto err;
840 }
841 else {
842 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000845 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 __builtins__=standard_builtins;
849 Py_INCREF(__builtins__);
850 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000851 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 goto err;
853 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 if (PyDict_Check(__builtins__)) {
856 __import__=PyObject_GetItem(__builtins__,__import___str);
857 if (!__import__) goto err;
858 }
859 else {
860 __import__=PyObject_GetAttr(__builtins__,__import___str);
861 if (!__import__) goto err;
862 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 r=PyObject_CallFunction(__import__,"OOOO",
865 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000866 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 Py_DECREF(globals);
870 Py_DECREF(__builtins__);
871 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 return r;
874 err:
875 Py_XDECREF(globals);
876 Py_XDECREF(__builtins__);
877 Py_XDECREF(__import__);
878 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000879}
880
881static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000882whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883{
884 int i, j;
885 PyObject *module = 0, *modules_dict = 0,
886 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 module = PyObject_GetAttrString(global, "__module__");
889 if (module) return module;
890 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000891
Tim Peterscba30e22003-02-01 06:24:36 +0000892 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000893 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 i = 0;
896 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000900 global_name_attr = PyObject_GetAttr(module, global_name);
901 if (!global_name_attr) {
902 PyErr_Clear();
903 continue;
904 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000906 if (global_name_attr != global) {
907 Py_DECREF(global_name_attr);
908 continue;
909 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000911 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 break;
914 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 /* The following implements the rule in pickle.py added in 1.5
917 that used __main__ if no module is found. I don't actually
918 like this rule. jlf
919 */
920 if (!j) {
921 j=1;
922 name=__main___str;
923 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 Py_INCREF(name);
926 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000927}
928
929
Guido van Rossum60456fd1997-04-09 17:36:32 +0000930static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931fast_save_enter(Picklerobject *self, PyObject *obj)
932{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 /* if fast_container < 0, we're doing an error exit. */
934 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
935 PyObject *key = NULL;
936 if (self->fast_memo == NULL) {
937 self->fast_memo = PyDict_New();
938 if (self->fast_memo == NULL) {
939 self->fast_container = -1;
940 return 0;
941 }
942 }
943 key = PyLong_FromVoidPtr(obj);
944 if (key == NULL)
945 return 0;
946 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000947 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948 PyErr_Format(PyExc_ValueError,
949 "fast mode: can't pickle cyclic objects including object type %s at %p",
950 obj->ob_type->tp_name, obj);
951 self->fast_container = -1;
952 return 0;
953 }
954 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000955 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 self->fast_container = -1;
957 return 0;
958 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000959 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000960 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000961 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000962}
963
Tim Peterscba30e22003-02-01 06:24:36 +0000964int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000965fast_save_leave(Picklerobject *self, PyObject *obj)
966{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000967 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
968 PyObject *key = PyLong_FromVoidPtr(obj);
969 if (key == NULL)
970 return 0;
971 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000972 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000973 return 0;
974 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000975 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000976 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000978}
979
980static int
Tim Peterscba30e22003-02-01 06:24:36 +0000981save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982{
983 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000984 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000987 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000988}
989
Guido van Rossum77f6a652002-04-03 22:41:51 +0000990static int
Tim Peterscba30e22003-02-01 06:24:36 +0000991save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000992{
Guido van Rossume2763392002-04-05 19:30:08 +0000993 static char *buf[2] = {FALSE, TRUE};
994 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000995 long l = PyInt_AS_LONG((PyIntObject *)args);
996
Tim Peters3c67d792003-02-02 17:59:11 +0000997 if (self->proto >= 2) {
998 char opcode = l ? NEWTRUE : NEWFALSE;
999 if (self->write_func(self, &opcode, 1) < 0)
1000 return -1;
1001 }
1002 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +00001003 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001004 return 0;
1005}
Tim Peters84e87f32001-03-17 04:50:51 +00001006
Guido van Rossum60456fd1997-04-09 17:36:32 +00001007static int
Tim Peterscba30e22003-02-01 06:24:36 +00001008save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009{
1010 char c_str[32];
1011 long l = PyInt_AS_LONG((PyIntObject *)args);
1012 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001015#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001016 || l > 0x7fffffffL
1017 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001018#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 ) {
1020 /* Text-mode pickle, or long too big to fit in the 4-byte
1021 * signed BININT format: store as a string.
1022 */
1023 c_str[0] = INT;
1024 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001025 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 return -1;
1027 }
1028 else {
1029 /* Binary pickle and l fits in a signed 4-byte int. */
1030 c_str[1] = (int)( l & 0xff);
1031 c_str[2] = (int)((l >> 8) & 0xff);
1032 c_str[3] = (int)((l >> 16) & 0xff);
1033 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1036 if (c_str[2] == 0) {
1037 c_str[0] = BININT1;
1038 len = 2;
1039 }
1040 else {
1041 c_str[0] = BININT2;
1042 len = 3;
1043 }
1044 }
1045 else {
1046 c_str[0] = BININT;
1047 len = 5;
1048 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001049
Tim Peters0bc93f52003-02-02 18:29:33 +00001050 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001051 return -1;
1052 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001054 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001055}
1056
1057
1058static int
Tim Peterscba30e22003-02-01 06:24:36 +00001059save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060{
Tim Petersee1a53c2003-02-02 02:57:53 +00001061 int size;
1062 int res = -1;
1063 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001065 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001066
Tim Petersee1a53c2003-02-02 02:57:53 +00001067 if (self->proto >= 2) {
1068 /* Linear-time pickling. */
1069 size_t nbits;
1070 size_t nbytes;
1071 unsigned char *pdata;
1072 char c_str[5];
1073 int i;
1074 int sign = _PyLong_Sign(args);
1075
1076 if (sign == 0) {
1077 /* It's 0 -- an empty bytestring. */
1078 c_str[0] = LONG1;
1079 c_str[1] = 0;
1080 i = self->write_func(self, c_str, 2);
1081 if (i < 0) goto finally;
1082 res = 0;
1083 goto finally;
1084 }
1085 nbits = _PyLong_NumBits(args);
1086 if (nbits == (size_t)-1 && PyErr_Occurred())
1087 goto finally;
1088 /* How many bytes do we need? There are nbits >> 3 full
1089 * bytes of data, and nbits & 7 leftover bits. If there
1090 * are any leftover bits, then we clearly need another
1091 * byte. Wnat's not so obvious is that we *probably*
1092 * need another byte even if there aren't any leftovers:
1093 * the most-significant bit of the most-significant byte
1094 * acts like a sign bit, and it's usually got a sense
1095 * opposite of the one we need. The exception is longs
1096 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1097 * its own 256's-complement, so has the right sign bit
1098 * even without the extra byte. That's a pain to check
1099 * for in advance, though, so we always grab an extra
1100 * byte at the start, and cut it back later if possible.
1101 */
1102 nbytes = (nbits >> 3) + 1;
1103 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1104 PyErr_SetString(PyExc_OverflowError, "long too large "
1105 "to pickle");
1106 goto finally;
1107 }
1108 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1109 if (repr == NULL) goto finally;
1110 pdata = (unsigned char *)PyString_AS_STRING(repr);
1111 i = _PyLong_AsByteArray((PyLongObject *)args,
1112 pdata, nbytes,
1113 1 /* little endian */, 1 /* signed */);
1114 if (i < 0) goto finally;
1115 /* If the long is negative, this may be a byte more than
1116 * needed. This is so iff the MSB is all redundant sign
1117 * bits.
1118 */
1119 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1120 (pdata[nbytes - 2] & 0x80) != 0)
1121 --nbytes;
1122
1123 if (nbytes < 256) {
1124 c_str[0] = LONG1;
1125 c_str[1] = (char)nbytes;
1126 size = 2;
1127 }
1128 else {
1129 c_str[0] = LONG4;
1130 size = (int)nbytes;
1131 for (i = 1; i < 5; i++) {
1132 c_str[i] = (char)(size & 0xff);
1133 size >>= 8;
1134 }
1135 size = 5;
1136 }
1137 i = self->write_func(self, c_str, size);
1138 if (i < 0) goto finally;
1139 i = self->write_func(self, (char *)pdata, (int)nbytes);
1140 if (i < 0) goto finally;
1141 res = 0;
1142 goto finally;
1143 }
1144
1145 /* proto < 2: write the repr and newline. This is quadratic-time
1146 * (in the number of digits), in both directions.
1147 */
Tim Peterscba30e22003-02-01 06:24:36 +00001148 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 if ((size = PyString_Size(repr)) < 0)
1152 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Tim Peters0bc93f52003-02-02 18:29:33 +00001154 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Tim Peters0bc93f52003-02-02 18:29:33 +00001157 if (self->write_func(self,
1158 PyString_AS_STRING((PyStringObject *)repr),
1159 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Tim Peters0bc93f52003-02-02 18:29:33 +00001162 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 finally:
1168 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170}
1171
1172
1173static int
Tim Peterscba30e22003-02-01 06:24:36 +00001174save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175{
1176 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001178 if (self->bin) {
1179 int s, e;
1180 double f;
1181 long fhi, flo;
1182 char str[9];
1183 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 *p = BINFLOAT;
1186 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 if (x < 0) {
1189 s = 1;
1190 x = -x;
1191 }
1192 else
1193 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 /* Normalize f to be in the range [1.0, 2.0) */
1198 if (0.5 <= f && f < 1.0) {
1199 f *= 2.0;
1200 e--;
1201 }
1202 else if (f == 0.0) {
1203 e = 0;
1204 }
1205 else {
1206 PyErr_SetString(PyExc_SystemError,
1207 "frexp() result out of range");
1208 return -1;
1209 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if (e >= 1024) {
1212 /* XXX 1024 itself is reserved for Inf/NaN */
1213 PyErr_SetString(PyExc_OverflowError,
1214 "float too large to pack with d format");
1215 return -1;
1216 }
1217 else if (e < -1022) {
1218 /* Gradual underflow */
1219 f = ldexp(f, 1022 + e);
1220 e = 0;
1221 }
1222 else if (!(e == 0 && f == 0.0)) {
1223 e += 1023;
1224 f -= 1.0; /* Get rid of leading 1 */
1225 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001226
Tim Peterscba30e22003-02-01 06:24:36 +00001227 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001228 flo the low 24 bits (== 52 bits) */
1229 f *= 268435456.0; /* 2**28 */
1230 fhi = (long) floor(f); /* Truncate */
1231 f -= (double)fhi;
1232 f *= 16777216.0; /* 2**24 */
1233 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 /* First byte */
1236 *p = (s<<7) | (e>>4);
1237 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 /* Second byte */
1240 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1241 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 /* Third byte */
1244 *p = (unsigned char) ((fhi>>16) & 0xFF);
1245 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 /* Fourth byte */
1248 *p = (unsigned char) ((fhi>>8) & 0xFF);
1249 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 /* Fifth byte */
1252 *p = (unsigned char) (fhi & 0xFF);
1253 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 /* Sixth byte */
1256 *p = (unsigned char) ((flo>>16) & 0xFF);
1257 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 /* Seventh byte */
1260 *p = (unsigned char) ((flo>>8) & 0xFF);
1261 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 /* Eighth byte */
1264 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001265
Tim Peters0bc93f52003-02-02 18:29:33 +00001266 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 return -1;
1268 }
1269 else {
1270 char c_str[250];
1271 c_str[0] = FLOAT;
1272 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001273
Tim Peters0bc93f52003-02-02 18:29:33 +00001274 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 return -1;
1276 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001279}
1280
1281
1282static int
Tim Peterscba30e22003-02-01 06:24:36 +00001283save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284{
1285 int size, len;
1286 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if ((size = PyString_Size(args)) < 0)
1289 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if (!self->bin) {
1292 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001295
Tim Peterscba30e22003-02-01 06:24:36 +00001296 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001299 if ((len = PyString_Size(repr)) < 0)
1300 goto err;
1301 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001302
Tim Peters0bc93f52003-02-02 18:29:33 +00001303 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001305
Tim Peters0bc93f52003-02-02 18:29:33 +00001306 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001308
Tim Peters0bc93f52003-02-02 18:29:33 +00001309 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 Py_XDECREF(repr);
1313 }
1314 else {
1315 int i;
1316 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001318 if ((size = PyString_Size(args)) < 0)
1319 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 if (size < 256) {
1322 c_str[0] = SHORT_BINSTRING;
1323 c_str[1] = size;
1324 len = 2;
1325 }
1326 else {
1327 c_str[0] = BINSTRING;
1328 for (i = 1; i < 5; i++)
1329 c_str[i] = (int)(size >> ((i - 1) * 8));
1330 len = 5;
1331 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001332
Tim Peters0bc93f52003-02-02 18:29:33 +00001333 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 if (size > 128 && Pdata_Check(self->file)) {
1337 if (write_other(self, NULL, 0) < 0) return -1;
1338 PDATA_APPEND(self->file, args, -1);
1339 }
1340 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001341 if (self->write_func(self,
1342 PyString_AS_STRING(
1343 (PyStringObject *)args),
1344 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 return -1;
1346 }
1347 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if (doput)
1350 if (put(self, args) < 0)
1351 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 err:
1356 Py_XDECREF(repr);
1357 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001358}
1359
1360
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001361#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001362/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1363 backslash and newline characters to \uXXXX escapes. */
1364static PyObject *
1365modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1366{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 PyObject *repr;
1368 char *p;
1369 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001373 repr = PyString_FromStringAndSize(NULL, 6 * size);
1374 if (repr == NULL)
1375 return NULL;
1376 if (size == 0)
1377 return repr;
1378
1379 p = q = PyString_AS_STRING(repr);
1380 while (size-- > 0) {
1381 Py_UNICODE ch = *s++;
1382 /* Map 16-bit characters to '\uxxxx' */
1383 if (ch >= 256 || ch == '\\' || ch == '\n') {
1384 *p++ = '\\';
1385 *p++ = 'u';
1386 *p++ = hexdigit[(ch >> 12) & 0xf];
1387 *p++ = hexdigit[(ch >> 8) & 0xf];
1388 *p++ = hexdigit[(ch >> 4) & 0xf];
1389 *p++ = hexdigit[ch & 15];
1390 }
1391 /* Copy everything else as-is */
1392 else
1393 *p++ = (char) ch;
1394 }
1395 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001396 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001397 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001398}
1399
1400
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401static int
Tim Peterscba30e22003-02-01 06:24:36 +00001402save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403{
1404 int size, len;
1405 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 if (!PyUnicode_Check(args))
1408 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 if (!self->bin) {
1411 char *repr_str;
1412 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 repr = modified_EncodeRawUnicodeEscape(
1415 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001416 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if ((len = PyString_Size(repr)) < 0)
1420 goto err;
1421 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001422
Tim Peters0bc93f52003-02-02 18:29:33 +00001423 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001425
Tim Peters0bc93f52003-02-02 18:29:33 +00001426 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428
Tim Peters0bc93f52003-02-02 18:29:33 +00001429 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001432 Py_XDECREF(repr);
1433 }
1434 else {
1435 int i;
1436 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001437
Tim Peterscba30e22003-02-01 06:24:36 +00001438 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 if ((size = PyString_Size(repr)) < 0)
1442 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001444 c_str[0] = BINUNICODE;
1445 for (i = 1; i < 5; i++)
1446 c_str[i] = (int)(size >> ((i - 1) * 8));
1447 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001448
Tim Peters0bc93f52003-02-02 18:29:33 +00001449 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if (size > 128 && Pdata_Check(self->file)) {
1453 if (write_other(self, NULL, 0) < 0)
1454 goto err;
1455 PDATA_APPEND(self->file, repr, -1);
1456 }
1457 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001458 if (self->write_func(self, PyString_AS_STRING(repr),
1459 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 goto err;
1461 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 Py_DECREF(repr);
1464 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 if (doput)
1467 if (put(self, args) < 0)
1468 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 err:
1473 Py_XDECREF(repr);
1474 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001475}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001476#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001477
Tim Peters1d63c9f2003-02-02 20:29:39 +00001478/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1479static int
1480store_tuple_elememts(Picklerobject *self, PyObject *t, int len)
1481{
1482 int i;
1483 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001484
Tim Peters1d63c9f2003-02-02 20:29:39 +00001485 assert(PyTuple_Size(t) == len);
1486
1487 for (i = 0; i < len; i++) {
1488 PyObject *element = PyTuple_GET_ITEM(t, i);
1489
1490 if (element == NULL)
1491 goto finally;
1492 if (save(self, element, 0) < 0)
1493 goto finally;
1494 }
1495 res = 0;
1496
1497 finally:
1498 return res;
1499}
1500
1501/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1502 * used across protocols to minimize the space needed to pickle them.
1503 * Tuples are also the only builtin immuatable type that can be recursive
1504 * (a tuple can be reached from itself), and that requires some subtle
1505 * magic so that it works in all cases. IOW, this is a long routine.
1506 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001507static int
Tim Peterscba30e22003-02-01 06:24:36 +00001508save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001510 PyObject *py_tuple_id = NULL;
1511 int len, i;
1512 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001514 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001515 static char pop = POP;
1516 static char pop_mark = POP_MARK;
1517 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519 if ((len = PyTuple_Size(args)) < 0)
1520 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001521
Tim Peters1d63c9f2003-02-02 20:29:39 +00001522 if (len == 0) {
1523 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001524
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 if (self->proto) {
1526 c_str[0] = EMPTY_TUPLE;
1527 len = 1;
1528 }
1529 else {
1530 c_str[0] = MARK;
1531 c_str[1] = TUPLE;
1532 len = 2;
1533 }
1534 if (self->write_func(self, c_str, len) >= 0)
1535 res = 0;
1536 /* Don't memoize an empty tuple. */
1537 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001538 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001539
Tim Peters1d63c9f2003-02-02 20:29:39 +00001540 /* A non-empty tuple. */
1541
1542 /* id(tuple) isn't in the memo now. If it shows up there after
1543 * saving the tuple elements, the tuple must be recursive, in
1544 * which case we'll pop everything we put on the stack, and fetch
1545 * its value from the memo.
1546 */
1547 py_tuple_id = PyLong_FromVoidPtr(args);
1548 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001549 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001550
Tim Peters1d63c9f2003-02-02 20:29:39 +00001551 if (len <= 3 && self->proto >= 2) {
1552 /* Use TUPLE{1,2,3} opcodes. */
1553 if (store_tuple_elememts(self, args, len) < 0)
1554 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001555 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001556 /* pop the len elements */
1557 for (i = 0; i < len; ++i)
1558 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001560 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 if (get(self, py_tuple_id) < 0)
1562 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 res = 0;
1564 goto finally;
1565 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001566 /* Not recursive. */
1567 if (self->write_func(self, len2opcode + len, 1) < 0)
1568 goto finally;
1569 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001571
Tim Peters1d63c9f2003-02-02 20:29:39 +00001572 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1573 * Generate MARK elt1 elt2 ... TUPLE
1574 */
1575 if (self->write_func(self, &MARKv, 1) < 0)
1576 goto finally;
1577
1578 if (store_tuple_elememts(self, args, len) < 0)
1579 goto finally;
1580
1581 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1582 /* pop the stack stuff we pushed */
1583 if (self->bin) {
1584 if (self->write_func(self, &pop_mark, 1) < 0)
1585 goto finally;
1586 }
1587 else {
1588 /* Note that we pop one more than len, to remove
1589 * the MARK too.
1590 */
1591 for (i = 0; i <= len; i++)
1592 if (self->write_func(self, &pop, 1) < 0)
1593 goto finally;
1594 }
1595 /* fetch from memo */
1596 if (get(self, py_tuple_id) >= 0)
1597 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 goto finally;
1599 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001600
Tim Peters1d63c9f2003-02-02 20:29:39 +00001601 /* Not recursive. */
1602 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001604
Tim Peters1d63c9f2003-02-02 20:29:39 +00001605 memoize:
1606 if (put(self, args) >= 0)
1607 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 finally:
1610 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001612}
1613
1614static int
Tim Peterscba30e22003-02-01 06:24:36 +00001615save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616{
1617 PyObject *element = 0;
1618 int s_len, len, i, using_appends, res = -1;
1619 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001623 if (self->fast && !fast_save_enter(self, args))
1624 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if (self->bin) {
1627 s[0] = EMPTY_LIST;
1628 s_len = 1;
1629 }
1630 else {
1631 s[0] = MARK;
1632 s[1] = LIST;
1633 s_len = 2;
1634 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001636 if ((len = PyList_Size(args)) < 0)
1637 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Tim Peters0bc93f52003-02-02 18:29:33 +00001639 if (self->write_func(self, s, s_len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001642 if (len == 0) {
1643 if (put(self, args) < 0)
1644 goto finally;
1645 }
1646 else {
1647 if (put2(self, args) < 0)
1648 goto finally;
1649 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 if ((using_appends = (self->bin && (len > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001652 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001653 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001656 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001657 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001659 if (save(self, element, 0) < 0)
1660 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001662 if (!using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001663 if (self->write_func(self, &append, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001664 goto finally;
1665 }
1666 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if (using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001669 if (self->write_func(self, &appends, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001670 goto finally;
1671 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 finally:
1676 if (self->fast && !fast_save_leave(self, args))
1677 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001679 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001680}
1681
1682
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683static int
Tim Peterscba30e22003-02-01 06:24:36 +00001684save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685{
1686 PyObject *key = 0, *value = 0;
1687 int i, len, res = -1, using_setitems;
1688 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 if (self->fast && !fast_save_enter(self, args))
1693 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 if (self->bin) {
1696 s[0] = EMPTY_DICT;
1697 len = 1;
1698 }
1699 else {
1700 s[0] = MARK;
1701 s[1] = DICT;
1702 len = 2;
1703 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001704
Tim Peters0bc93f52003-02-02 18:29:33 +00001705 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001708 if ((len = PyDict_Size(args)) < 0)
1709 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 if (len == 0) {
1712 if (put(self, args) < 0)
1713 goto finally;
1714 }
1715 else {
1716 if (put2(self, args) < 0)
1717 goto finally;
1718 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001721 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 i = 0;
1725 while (PyDict_Next(args, &i, &key, &value)) {
1726 if (save(self, key, 0) < 0)
1727 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001729 if (save(self, value, 0) < 0)
1730 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 if (!using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001733 if (self->write_func(self, &setitem, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001734 goto finally;
1735 }
1736 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 if (using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001739 if (self->write_func(self, &setitems, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 goto finally;
1741 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 finally:
1746 if (self->fast && !fast_save_leave(self, args))
1747 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001750}
1751
1752
Tim Peters84e87f32001-03-17 04:50:51 +00001753static int
Tim Peterscba30e22003-02-01 06:24:36 +00001754save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001755{
1756 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1757 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1758 char *module_str, *name_str;
1759 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 if (self->fast && !fast_save_enter(self, args))
1764 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001765
Tim Peters0bc93f52003-02-02 18:29:33 +00001766 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Tim Peterscba30e22003-02-01 06:24:36 +00001769 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 if (self->bin) {
1773 if (save(self, class, 0) < 0)
1774 goto finally;
1775 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1778 PyObject *element = 0;
1779 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001782 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 if ((len = PyObject_Size(class_args)) < 0)
1786 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001789 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001790 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 if (save(self, element, 0) < 0) {
1793 Py_DECREF(element);
1794 goto finally;
1795 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 Py_DECREF(element);
1798 }
1799 }
1800 else {
1801 PyErr_Clear();
1802 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 if (!self->bin) {
1805 if (!( name = ((PyClassObject *)class)->cl_name )) {
1806 PyErr_SetString(PicklingError, "class has no name");
1807 goto finally;
1808 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001809
Tim Peterscba30e22003-02-01 06:24:36 +00001810 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001812
Tim Peters84e87f32001-03-17 04:50:51 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 if ((module_size = PyString_Size(module)) < 0 ||
1815 (name_size = PyString_Size(name)) < 0)
1816 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 module_str = PyString_AS_STRING((PyStringObject *)module);
1819 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Tim Peters0bc93f52003-02-02 18:29:33 +00001821 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Tim Peters0bc93f52003-02-02 18:29:33 +00001824 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Tim Peters0bc93f52003-02-02 18:29:33 +00001827 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001829
Tim Peters0bc93f52003-02-02 18:29:33 +00001830 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001832
Tim Peters0bc93f52003-02-02 18:29:33 +00001833 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 goto finally;
1835 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001836 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 goto finally;
1838 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1841 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001842 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 goto finally;
1844 }
1845 else {
1846 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001848 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1849 PyErr_Clear();
1850 res = 0;
1851 goto finally;
1852 }
1853 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 if (!PyDict_Check(state)) {
1856 if (put2(self, args) < 0)
1857 goto finally;
1858 }
1859 else {
1860 if (put(self, args) < 0)
1861 goto finally;
1862 }
Tim Peters84e87f32001-03-17 04:50:51 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 if (save(self, state, 0) < 0)
1865 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001866
Tim Peters0bc93f52003-02-02 18:29:33 +00001867 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001872 finally:
1873 if (self->fast && !fast_save_leave(self, args))
1874 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 Py_XDECREF(module);
1877 Py_XDECREF(class);
1878 Py_XDECREF(state);
1879 Py_XDECREF(getinitargs_func);
1880 Py_XDECREF(getstate_func);
1881 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001884}
1885
1886
Guido van Rossum60456fd1997-04-09 17:36:32 +00001887static int
Tim Peterscba30e22003-02-01 06:24:36 +00001888save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001890 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 char *name_str, *module_str;
1892 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001894 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001896 if (name) {
1897 global_name = name;
1898 Py_INCREF(global_name);
1899 }
1900 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001901 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 goto finally;
1903 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001904
Tim Peterscba30e22003-02-01 06:24:36 +00001905 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 if ((module_size = PyString_Size(module)) < 0 ||
1909 (name_size = PyString_Size(global_name)) < 0)
1910 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 module_str = PyString_AS_STRING((PyStringObject *)module);
1913 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001914
Guido van Rossum75bfd052002-12-24 18:10:07 +00001915 /* XXX This can be doing a relative import. Clearly it shouldn't,
1916 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001917 mod = PyImport_ImportModule(module_str);
1918 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001919 cPickle_ErrFormat(PicklingError,
1920 "Can't pickle %s: it's not found as %s.%s",
1921 "OSS", args, module, global_name);
1922 goto finally;
1923 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001924 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 if (klass == NULL) {
1926 cPickle_ErrFormat(PicklingError,
1927 "Can't pickle %s: it's not found as %s.%s",
1928 "OSS", args, module, global_name);
1929 goto finally;
1930 }
1931 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001932 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 cPickle_ErrFormat(PicklingError,
1934 "Can't pickle %s: it's not the same object as %s.%s",
1935 "OSS", args, module, global_name);
1936 goto finally;
1937 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001938 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001939
Tim Peters0bc93f52003-02-02 18:29:33 +00001940 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Tim Peters0bc93f52003-02-02 18:29:33 +00001943 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Tim Peters0bc93f52003-02-02 18:29:33 +00001946 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Tim Peters0bc93f52003-02-02 18:29:33 +00001949 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Tim Peters0bc93f52003-02-02 18:29:33 +00001952 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 if (put(self, args) < 0)
1956 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001960 finally:
1961 Py_XDECREF(module);
1962 Py_XDECREF(global_name);
1963 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966}
1967
Guido van Rossum60456fd1997-04-09 17:36:32 +00001968static int
Tim Peterscba30e22003-02-01 06:24:36 +00001969save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001970{
1971 PyObject *pid = 0;
1972 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976 Py_INCREF(args);
1977 ARG_TUP(self, args);
1978 if (self->arg) {
1979 pid = PyObject_Call(f, self->arg, NULL);
1980 FREE_ARG_TUP(self);
1981 }
1982 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (pid != Py_None) {
1985 if (!self->bin) {
1986 if (!PyString_Check(pid)) {
1987 PyErr_SetString(PicklingError,
1988 "persistent id must be string");
1989 goto finally;
1990 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001991
Tim Peters0bc93f52003-02-02 18:29:33 +00001992 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001993 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001995 if ((size = PyString_Size(pid)) < 0)
1996 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Tim Peters0bc93f52003-02-02 18:29:33 +00001998 if (self->write_func(self,
1999 PyString_AS_STRING(
2000 (PyStringObject *)pid),
2001 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002003
Tim Peters0bc93f52003-02-02 18:29:33 +00002004 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 res = 1;
2008 goto finally;
2009 }
2010 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002011 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 res = -1;
2013 else
2014 res = 1;
2015 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 goto finally;
2018 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002022 finally:
2023 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002027
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002028
Tim Peters84e87f32001-03-17 04:50:51 +00002029static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002030save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002031 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032{
2033 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002035 if (save(self, callable, 0) < 0)
2036 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 if (save(self, tup, 0) < 0)
2039 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002040
Tim Peters0bc93f52003-02-02 18:29:33 +00002041 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 if (ob != NULL) {
2045 if (state && !PyDict_Check(state)) {
2046 if (put2(self, ob) < 0)
2047 return -1;
2048 }
2049 else {
2050 if (put(self, ob) < 0)
2051 return -1;
2052 }
2053 }
Tim Peters84e87f32001-03-17 04:50:51 +00002054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 if (state) {
2056 if (save(self, state, 0) < 0)
2057 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002058
Tim Peters0bc93f52003-02-02 18:29:33 +00002059 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 return -1;
2061 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002064}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002065
Guido van Rossum60456fd1997-04-09 17:36:32 +00002066static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002067save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068{
2069 PyTypeObject *type;
2070 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2071 *callable = 0, *state = 0;
2072 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002073
Martin v. Löwis5a395302002-08-04 08:20:23 +00002074 if (self->nesting++ > Py_GetRecursionLimit()){
2075 PyErr_SetString(PyExc_RuntimeError,
2076 "maximum recursion depth exceeded");
2077 goto finally;
2078 }
2079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 if (!pers_save && self->pers_func) {
2081 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2082 res = tmp;
2083 goto finally;
2084 }
2085 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if (args == Py_None) {
2088 res = save_none(self, args);
2089 goto finally;
2090 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002092 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002095 case 'b':
2096 if (args == Py_False || args == Py_True) {
2097 res = save_bool(self, args);
2098 goto finally;
2099 }
2100 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002101 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002102 if (type == &PyInt_Type) {
2103 res = save_int(self, args);
2104 goto finally;
2105 }
2106 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002107
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 if (type == &PyLong_Type) {
2110 res = save_long(self, args);
2111 goto finally;
2112 }
2113 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002114
Guido van Rossum60456fd1997-04-09 17:36:32 +00002115 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 if (type == &PyFloat_Type) {
2117 res = save_float(self, args);
2118 goto finally;
2119 }
2120 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002121
Guido van Rossum60456fd1997-04-09 17:36:32 +00002122 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002123 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2124 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 goto finally;
2126 }
2127 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Guido van Rossum60456fd1997-04-09 17:36:32 +00002129 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2131 res = save_string(self, args, 0);
2132 goto finally;
2133 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002134
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002135#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002136 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2138 res = save_unicode(self, args, 0);
2139 goto finally;
2140 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002141#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002145 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002148 if (PyDict_GetItem(self->memo, py_ob_id)) {
2149 if (get(self, py_ob_id) < 0)
2150 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 res = 0;
2153 goto finally;
2154 }
2155 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002157 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002158 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002159 if (type == &PyString_Type) {
2160 res = save_string(self, args, 1);
2161 goto finally;
2162 }
2163 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002164
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002165#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002166 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167 if (type == &PyUnicode_Type) {
2168 res = save_unicode(self, args, 1);
2169 goto finally;
2170 }
2171 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002172#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002173
Guido van Rossum60456fd1997-04-09 17:36:32 +00002174 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002175 if (type == &PyTuple_Type) {
2176 res = save_tuple(self, args);
2177 goto finally;
2178 }
2179 if (type == &PyType_Type) {
2180 res = save_global(self, args, NULL);
2181 goto finally;
2182 }
2183 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002184
Guido van Rossum60456fd1997-04-09 17:36:32 +00002185 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 if (type == &PyList_Type) {
2187 res = save_list(self, args);
2188 goto finally;
2189 }
2190 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002191
2192 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002193 if (type == &PyDict_Type) {
2194 res = save_dict(self, args);
2195 goto finally;
2196 }
2197 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002198
2199 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002200 if (type == &PyInstance_Type) {
2201 res = save_inst(self, args);
2202 goto finally;
2203 }
2204 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002205
2206 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002207 if (type == &PyClass_Type) {
2208 res = save_global(self, args, NULL);
2209 goto finally;
2210 }
2211 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002212
2213 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002214 if (type == &PyFunction_Type) {
2215 res = save_global(self, args, NULL);
2216 goto finally;
2217 }
2218 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002219
2220 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002221 if (type == &PyCFunction_Type) {
2222 res = save_global(self, args, NULL);
2223 goto finally;
2224 }
2225 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002227 if (!pers_save && self->inst_pers_func) {
2228 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2229 res = tmp;
2230 goto finally;
2231 }
2232 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002233
Jeremy Hylton39c61162002-07-16 19:47:43 +00002234 if (PyType_IsSubtype(type, &PyType_Type)) {
2235 res = save_global(self, args, NULL);
2236 goto finally;
2237 }
2238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2240 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002242 Py_INCREF(args);
2243 ARG_TUP(self, args);
2244 if (self->arg) {
2245 t = PyObject_Call(__reduce__, self->arg, NULL);
2246 FREE_ARG_TUP(self);
2247 }
2248 if (! t) goto finally;
2249 }
2250 else {
2251 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002253 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2254 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002255 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002256 goto finally;
2257 }
2258 else {
2259 PyErr_Clear();
2260 }
2261 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002263 if (t) {
2264 if (PyString_Check(t)) {
2265 res = save_global(self, args, t);
2266 goto finally;
2267 }
Tim Peters84e87f32001-03-17 04:50:51 +00002268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002269 if (!PyTuple_Check(t)) {
2270 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2271 "be a tuple", "O", __reduce__);
2272 goto finally;
2273 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277 if ((size != 3) && (size != 2)) {
2278 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2279 "contain only two or three elements", "O", __reduce__);
2280 goto finally;
2281 }
Tim Peters84e87f32001-03-17 04:50:51 +00002282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002283 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002285 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287 if (size > 2) {
2288 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002289 if (state == Py_None)
2290 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2294 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2295 "returned by %s must be a tuple", "O", __reduce__);
2296 goto finally;
2297 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 res = save_reduce(self, callable, arg_tup, state, args);
2300 goto finally;
2301 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002305 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002306 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 Py_XDECREF(py_ob_id);
2308 Py_XDECREF(__reduce__);
2309 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002312}
2313
2314
2315static int
Tim Peterscba30e22003-02-01 06:24:36 +00002316dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317{
2318 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002319
Tim Peters4190fb82003-02-02 16:09:05 +00002320 if (self->proto >= 2) {
2321 char bytes[2];
2322
2323 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002324 assert(self->proto >= 0 && self->proto < 256);
2325 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002326 if (self->write_func(self, bytes, 2) < 0)
2327 return -1;
2328 }
2329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 if (save(self, args, 0) < 0)
2331 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002332
Tim Peters4190fb82003-02-02 16:09:05 +00002333 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002335
Tim Peters4190fb82003-02-02 16:09:05 +00002336 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002340}
2341
2342static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002343Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344{
Tim Peterscba30e22003-02-01 06:24:36 +00002345 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002346 PyDict_Clear(self->memo);
2347 Py_INCREF(Py_None);
2348 return Py_None;
2349}
2350
2351static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002352Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353{
2354 int l, i, rsize, ssize, clear=1, lm;
2355 long ik;
2356 PyObject *k, *r;
2357 char *s, *p, *have_get;
2358 Pdata *data;
2359
2360 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002361 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002362 return NULL;
2363
2364 /* Check to make sure we are based on a list */
2365 if (! Pdata_Check(self->file)) {
2366 PyErr_SetString(PicklingError,
2367 "Attempt to getvalue() a non-list-based pickler");
2368 return NULL;
2369 }
2370
2371 /* flush write buffer */
2372 if (write_other(self, NULL, 0) < 0) return NULL;
2373
2374 data=(Pdata*)self->file;
2375 l=data->length;
2376
2377 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002378 lm = PyDict_Size(self->memo);
2379 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002381 have_get = malloc(lm);
2382 if (have_get == NULL) return PyErr_NoMemory();
2383 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384
2385 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002386 for (rsize = 0, i = l; --i >= 0; ) {
2387 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002388
Tim Petersac5687a2003-02-02 18:08:34 +00002389 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002390 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391
2392 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002393 ik = PyInt_AS_LONG((PyIntObject*)k);
2394 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 PyErr_SetString(PicklingError,
2396 "Invalid get data");
2397 return NULL;
2398 }
Tim Petersac5687a2003-02-02 18:08:34 +00002399 if (have_get[ik]) /* with matching get */
2400 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 }
2402
2403 else if (! (PyTuple_Check(k) &&
2404 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002405 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 ) {
2407 PyErr_SetString(PicklingError,
2408 "Unexpected data in internal list");
2409 return NULL;
2410 }
2411
2412 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002413 ik = PyInt_AS_LONG((PyIntObject *)k);
2414 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415 PyErr_SetString(PicklingError,
2416 "Invalid get data");
2417 return NULL;
2418 }
Tim Petersac5687a2003-02-02 18:08:34 +00002419 have_get[ik] = 1;
2420 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002422 }
2423
2424 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002425 r = PyString_FromStringAndSize(NULL, rsize);
2426 if (r == NULL) goto err;
2427 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428
Tim Petersac5687a2003-02-02 18:08:34 +00002429 for (i = 0; i < l; i++) {
2430 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431
2432 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002433 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002434 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002435 p=PyString_AS_STRING((PyStringObject *)k);
2436 while (--ssize >= 0)
2437 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 }
2439 }
2440
2441 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002442 ik = PyInt_AS_LONG((PyIntObject *)
2443 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002444 if (ik < 256) {
2445 *s++ = BINGET;
2446 *s++ = (int)(ik & 0xff);
2447 }
2448 else {
2449 *s++ = LONG_BINGET;
2450 *s++ = (int)(ik & 0xff);
2451 *s++ = (int)((ik >> 8) & 0xff);
2452 *s++ = (int)((ik >> 16) & 0xff);
2453 *s++ = (int)((ik >> 24) & 0xff);
2454 }
2455 }
2456
2457 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002458 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002459
2460 if (have_get[ik]) { /* with matching get */
2461 if (ik < 256) {
2462 *s++ = BINPUT;
2463 *s++ = (int)(ik & 0xff);
2464 }
2465 else {
2466 *s++ = LONG_BINPUT;
2467 *s++ = (int)(ik & 0xff);
2468 *s++ = (int)((ik >> 8) & 0xff);
2469 *s++ = (int)((ik >> 16) & 0xff);
2470 *s++ = (int)((ik >> 24) & 0xff);
2471 }
2472 }
2473 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 }
2475
2476 if (clear) {
2477 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002478 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002479 }
2480
2481 free(have_get);
2482 return r;
2483 err:
2484 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002485 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002486}
2487
2488static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002489Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002490{
2491 PyObject *ob;
2492 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002493
Tim Peterscba30e22003-02-01 06:24:36 +00002494 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 if (dump(self, ob) < 0)
2498 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002500 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 /* XXX Why does dump() return self? */
2503 Py_INCREF(self);
2504 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002505}
2506
2507
Tim Peterscba30e22003-02-01 06:24:36 +00002508static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509{
Neal Norwitzb0493252002-03-31 14:44:22 +00002510 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002511 PyDoc_STR("dump(object) -- "
2512 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002513 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002514 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002515 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002516 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002517 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002518};
2519
2520
2521static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002522newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523{
2524 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002525
Tim Peters5bd2a792003-02-01 16:45:06 +00002526 if (proto < 0)
2527 proto = CURRENT_PROTOCOL_NUMBER;
2528 if (proto > CURRENT_PROTOCOL_NUMBER) {
2529 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2530 "the highest available protocol is %d",
2531 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002533 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002534
Tim Peters5bd2a792003-02-01 16:45:06 +00002535 self = PyObject_New(Picklerobject, &Picklertype);
2536 if (self == NULL)
2537 return NULL;
2538 self->proto = proto;
2539 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002540 self->fp = NULL;
2541 self->write = NULL;
2542 self->memo = NULL;
2543 self->arg = NULL;
2544 self->pers_func = NULL;
2545 self->inst_pers_func = NULL;
2546 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002547 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002548 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002549 self->fast_container = 0;
2550 self->fast_memo = NULL;
2551 self->buf_size = 0;
2552 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002553
Tim Peters5bd2a792003-02-01 16:45:06 +00002554 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555 if (file)
2556 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002557 else {
2558 file = Pdata_New();
2559 if (file == NULL)
2560 goto err;
2561 }
2562 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002563
Tim Peterscba30e22003-02-01 06:24:36 +00002564 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 if (PyFile_Check(file)) {
2568 self->fp = PyFile_AsFile(file);
2569 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002570 PyErr_SetString(PyExc_ValueError,
2571 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002572 goto err;
2573 }
2574 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002575 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002576 else if (PycStringIO_OutputCheck(file)) {
2577 self->write_func = write_cStringIO;
2578 }
2579 else if (file == Py_None) {
2580 self->write_func = write_none;
2581 }
2582 else {
2583 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585 if (! Pdata_Check(file)) {
2586 self->write = PyObject_GetAttr(file, write_str);
2587 if (!self->write) {
2588 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002589 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002590 "argument must have 'write' "
2591 "attribute");
2592 goto err;
2593 }
2594 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002595
Tim Peters5bd2a792003-02-01 16:45:06 +00002596 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2597 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 PyErr_NoMemory();
2599 goto err;
2600 }
2601 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 if (PyEval_GetRestricted()) {
2604 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002605 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002606
Tim Peters5b7da392003-02-04 00:21:07 +00002607 if (m == NULL)
2608 goto err;
2609 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002611 if (self->dispatch_table == NULL)
2612 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613 }
2614 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002615 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616 Py_INCREF(dispatch_table);
2617 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002622 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002623 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002624}
2625
2626
2627static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002628get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002629{
2630 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002631 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002632
Tim Peters5bd2a792003-02-01 16:45:06 +00002633 /* XXX What is this doing? The documented signature is
2634 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2635 * XXX Pickler(integer) too. The meaning then is clear as mud.
2636 * XXX Bug? Feature?
2637 */
2638 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002639 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002640 proto = 0;
2641 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002642 return NULL;
2643 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002644 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002645}
2646
2647
2648static void
Tim Peterscba30e22003-02-01 06:24:36 +00002649Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002650{
2651 Py_XDECREF(self->write);
2652 Py_XDECREF(self->memo);
2653 Py_XDECREF(self->fast_memo);
2654 Py_XDECREF(self->arg);
2655 Py_XDECREF(self->file);
2656 Py_XDECREF(self->pers_func);
2657 Py_XDECREF(self->inst_pers_func);
2658 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002659 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002661}
2662
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002663static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002664Pickler_get_pers_func(Picklerobject *p)
2665{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 if (p->pers_func == NULL)
2667 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2668 else
2669 Py_INCREF(p->pers_func);
2670 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002671}
2672
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002673static int
2674Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2675{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 if (v == NULL) {
2677 PyErr_SetString(PyExc_TypeError,
2678 "attribute deletion is not supported");
2679 return -1;
2680 }
2681 Py_XDECREF(p->pers_func);
2682 Py_INCREF(v);
2683 p->pers_func = v;
2684 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002685}
2686
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002687static int
2688Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2689{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690 if (v == NULL) {
2691 PyErr_SetString(PyExc_TypeError,
2692 "attribute deletion is not supported");
2693 return -1;
2694 }
2695 Py_XDECREF(p->inst_pers_func);
2696 Py_INCREF(v);
2697 p->inst_pers_func = v;
2698 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002699}
2700
2701static PyObject *
2702Pickler_get_memo(Picklerobject *p)
2703{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704 if (p->memo == NULL)
2705 PyErr_SetString(PyExc_AttributeError, "memo");
2706 else
2707 Py_INCREF(p->memo);
2708 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002709}
2710
2711static int
2712Pickler_set_memo(Picklerobject *p, PyObject *v)
2713{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 if (v == NULL) {
2715 PyErr_SetString(PyExc_TypeError,
2716 "attribute deletion is not supported");
2717 return -1;
2718 }
2719 if (!PyDict_Check(v)) {
2720 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2721 return -1;
2722 }
2723 Py_XDECREF(p->memo);
2724 Py_INCREF(v);
2725 p->memo = v;
2726 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002727}
2728
2729static PyObject *
2730Pickler_get_error(Picklerobject *p)
2731{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 /* why is this an attribute on the Pickler? */
2733 Py_INCREF(PicklingError);
2734 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002735}
2736
2737static PyMemberDef Pickler_members[] = {
2738 {"binary", T_INT, offsetof(Picklerobject, bin)},
2739 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002740 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002741};
2742
2743static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002744 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002745 (setter)Pickler_set_pers_func},
2746 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2747 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002748 {"PicklingError", (getter)Pickler_get_error, NULL},
2749 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002750};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(Picklertype__doc__,
2753"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002754
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002755static PyTypeObject Picklertype = {
2756 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002757 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002758 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002759 sizeof(Picklerobject), /*tp_basicsize*/
2760 0,
2761 (destructor)Pickler_dealloc, /* tp_dealloc */
2762 0, /* tp_print */
2763 0, /* tp_getattr */
2764 0, /* tp_setattr */
2765 0, /* tp_compare */
2766 0, /* tp_repr */
2767 0, /* tp_as_number */
2768 0, /* tp_as_sequence */
2769 0, /* tp_as_mapping */
2770 0, /* tp_hash */
2771 0, /* tp_call */
2772 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002773 PyObject_GenericGetAttr, /* tp_getattro */
2774 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002775 0, /* tp_as_buffer */
2776 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2777 Picklertype__doc__, /* tp_doc */
2778 0, /* tp_traverse */
2779 0, /* tp_clear */
2780 0, /* tp_richcompare */
2781 0, /* tp_weaklistoffset */
2782 0, /* tp_iter */
2783 0, /* tp_iternext */
2784 Pickler_methods, /* tp_methods */
2785 Pickler_members, /* tp_members */
2786 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002787};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002788
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002789static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002790find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791{
2792 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 if (fc) {
2795 if (fc==Py_None) {
2796 PyErr_SetString(UnpicklingError,
2797 "Global and instance pickles are not supported.");
2798 return NULL;
2799 }
Tim Peterscba30e22003-02-01 06:24:36 +00002800 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 py_global_name);
2802 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 module = PySys_GetObject("modules");
2805 if (module == NULL)
2806 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 module = PyDict_GetItem(module, py_module_name);
2809 if (module == NULL) {
2810 module = PyImport_Import(py_module_name);
2811 if (!module)
2812 return NULL;
2813 global = PyObject_GetAttr(module, py_global_name);
2814 Py_DECREF(module);
2815 }
2816 else
2817 global = PyObject_GetAttr(module, py_global_name);
2818 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002819}
2820
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002821static int
Tim Peterscba30e22003-02-01 06:24:36 +00002822marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823{
2824 if (self->num_marks < 1) {
2825 PyErr_SetString(UnpicklingError, "could not find MARK");
2826 return -1;
2827 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830}
2831
Tim Peters84e87f32001-03-17 04:50:51 +00002832
Guido van Rossum60456fd1997-04-09 17:36:32 +00002833static int
Tim Peterscba30e22003-02-01 06:24:36 +00002834load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835{
2836 PDATA_APPEND(self->stack, Py_None, -1);
2837 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838}
2839
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002840static int
Tim Peterscba30e22003-02-01 06:24:36 +00002841bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842{
2843 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2844 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002845}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
2847static int
Tim Peterscba30e22003-02-01 06:24:36 +00002848load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849{
2850 PyObject *py_int = 0;
2851 char *endptr, *s;
2852 int len, res = -1;
2853 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
Tim Peters0bc93f52003-02-02 18:29:33 +00002855 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 if (len < 2) return bad_readline();
2857 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 errno = 0;
2860 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2863 /* Hm, maybe we've got something long. Let's try reading
2864 it as a Python long object. */
2865 errno = 0;
2866 py_int = PyLong_FromString(s, NULL, 0);
2867 if (py_int == NULL) {
2868 PyErr_SetString(PyExc_ValueError,
2869 "could not convert string to int");
2870 goto finally;
2871 }
2872 }
2873 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002874 if (len == 3 && (l == 0 || l == 1)) {
2875 if (!( py_int = PyBool_FromLong(l))) goto finally;
2876 }
2877 else {
2878 if (!( py_int = PyInt_FromLong(l))) goto finally;
2879 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 free(s);
2883 PDATA_PUSH(self->stack, py_int, -1);
2884 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 finally:
2887 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890}
2891
Tim Peters3c67d792003-02-02 17:59:11 +00002892static int
2893load_bool(Unpicklerobject *self, PyObject *boolean)
2894{
2895 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002896 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002897 return 0;
2898}
2899
Tim Petersee1a53c2003-02-02 02:57:53 +00002900/* s contains x bytes of a little-endian integer. Return its value as a
2901 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2902 * int, but when x is 4 it's a signed one. This is an historical source
2903 * of x-platform bugs.
2904 */
Tim Peters84e87f32001-03-17 04:50:51 +00002905static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002906calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907{
2908 unsigned char c;
2909 int i;
2910 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912 for (i = 0, l = 0L; i < x; i++) {
2913 c = (unsigned char)s[i];
2914 l |= (long)c << (i * 8);
2915 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002916#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2918 * is signed, so on a box with longs bigger than 4 bytes we need
2919 * to extend a BININT's sign bit to the full width.
2920 */
2921 if (x == 4 && l & (1L << 31))
2922 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002923#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925}
2926
2927
2928static int
Tim Peterscba30e22003-02-01 06:24:36 +00002929load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930{
2931 PyObject *py_int = 0;
2932 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Tim Peterscba30e22003-02-01 06:24:36 +00002936 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 PDATA_PUSH(self->stack, py_int, -1);
2940 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941}
2942
2943
2944static int
Tim Peterscba30e22003-02-01 06:24:36 +00002945load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946{
2947 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
Tim Peters0bc93f52003-02-02 18:29:33 +00002949 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953}
2954
2955
2956static int
Tim Peterscba30e22003-02-01 06:24:36 +00002957load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958{
2959 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960
Tim Peters0bc93f52003-02-02 18:29:33 +00002961 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965}
2966
2967
2968static int
Tim Peterscba30e22003-02-01 06:24:36 +00002969load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970{
2971 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002972
Tim Peters0bc93f52003-02-02 18:29:33 +00002973 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977}
Tim Peters84e87f32001-03-17 04:50:51 +00002978
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979static int
Tim Peterscba30e22003-02-01 06:24:36 +00002980load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981{
2982 PyObject *l = 0;
2983 char *end, *s;
2984 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985
Tim Peters0bc93f52003-02-02 18:29:33 +00002986 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 if (len < 2) return bad_readline();
2988 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989
Tim Peterscba30e22003-02-01 06:24:36 +00002990 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 free(s);
2994 PDATA_PUSH(self->stack, l, -1);
2995 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 finally:
2998 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001}
3002
Tim Petersee1a53c2003-02-02 02:57:53 +00003003/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3004 * data following.
3005 */
3006static int
3007load_counted_long(Unpicklerobject *self, int size)
3008{
3009 int i;
3010 char *nbytes;
3011 unsigned char *pdata;
3012 PyObject *along;
3013
3014 assert(size == 1 || size == 4);
3015 i = self->read_func(self, &nbytes, size);
3016 if (i < 0) return -1;
3017
3018 size = calc_binint(nbytes, size);
3019 if (size < 0) {
3020 /* Corrupt or hostile pickle -- we never write one like
3021 * this.
3022 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003023 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003024 "byte count");
3025 return -1;
3026 }
3027
3028 if (size == 0)
3029 along = PyLong_FromLong(0L);
3030 else {
3031 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003032 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003033 if (i < 0) return -1;
3034 along = _PyLong_FromByteArray(pdata, (size_t)size,
3035 1 /* little endian */, 1 /* signed */);
3036 }
3037 if (along == NULL)
3038 return -1;
3039 PDATA_PUSH(self->stack, along, -1);
3040 return 0;
3041}
Tim Peters84e87f32001-03-17 04:50:51 +00003042
Guido van Rossum60456fd1997-04-09 17:36:32 +00003043static int
Tim Peterscba30e22003-02-01 06:24:36 +00003044load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045{
3046 PyObject *py_float = 0;
3047 char *endptr, *s;
3048 int len, res = -1;
3049 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050
Tim Peters0bc93f52003-02-02 18:29:33 +00003051 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052 if (len < 2) return bad_readline();
3053 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 errno = 0;
3056 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3059 PyErr_SetString(PyExc_ValueError,
3060 "could not convert string to float");
3061 goto finally;
3062 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063
Tim Peterscba30e22003-02-01 06:24:36 +00003064 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 free(s);
3068 PDATA_PUSH(self->stack, py_float, -1);
3069 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 finally:
3072 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003074 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075}
3076
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077static int
Tim Peterscba30e22003-02-01 06:24:36 +00003078load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079{
3080 PyObject *py_float = 0;
3081 int s, e;
3082 long fhi, flo;
3083 double x;
3084 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Tim Peters0bc93f52003-02-02 18:29:33 +00003086 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 /* First byte */
3090 s = (*p>>7) & 1;
3091 e = (*p & 0x7F) << 4;
3092 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 /* Second byte */
3095 e |= (*p>>4) & 0xF;
3096 fhi = (*p & 0xF) << 24;
3097 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 /* Third byte */
3100 fhi |= (*p & 0xFF) << 16;
3101 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 /* Fourth byte */
3104 fhi |= (*p & 0xFF) << 8;
3105 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 /* Fifth byte */
3108 fhi |= *p & 0xFF;
3109 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 /* Sixth byte */
3112 flo = (*p & 0xFF) << 16;
3113 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 /* Seventh byte */
3116 flo |= (*p & 0xFF) << 8;
3117 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 /* Eighth byte */
3120 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3123 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 /* XXX This sadly ignores Inf/NaN */
3126 if (e == 0)
3127 e = -1022;
3128 else {
3129 x += 1.0;
3130 e -= 1023;
3131 }
3132 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 if (s)
3135 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003137 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 PDATA_PUSH(self->stack, py_float, -1);
3140 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142
3143static int
Tim Peterscba30e22003-02-01 06:24:36 +00003144load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145{
3146 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003147 int len, res = -1;
3148 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Tim Peters0bc93f52003-02-02 18:29:33 +00003150 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151 if (len < 2) return bad_readline();
3152 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003154
3155 /* Strip outermost quotes */
3156 while (s[len-1] <= ' ')
3157 len--;
3158 if(s[0]=='"' && s[len-1]=='"'){
3159 s[len-1] = '\0';
3160 p = s + 1 ;
3161 len -= 2;
3162 } else if(s[0]=='\'' && s[len-1]=='\''){
3163 s[len-1] = '\0';
3164 p = s + 1 ;
3165 len -= 2;
3166 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167 goto insecure;
3168 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003169
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003170 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3171 if (str) {
3172 PDATA_PUSH(self->stack, str, -1);
3173 res = 0;
3174 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003176 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 insecure:
3179 free(s);
3180 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3181 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003182}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003183
3184
3185static int
Tim Peterscba30e22003-02-01 06:24:36 +00003186load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187{
3188 PyObject *py_string = 0;
3189 long l;
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, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Tim Peters0bc93f52003-02-02 18:29:33 +00003196 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198
Tim Peterscba30e22003-02-01 06:24:36 +00003199 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 PDATA_PUSH(self->stack, py_string, -1);
3203 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204}
3205
3206
3207static int
Tim Peterscba30e22003-02-01 06:24:36 +00003208load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209{
3210 PyObject *py_string = 0;
3211 unsigned char l;
3212 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003213
Tim Peters0bc93f52003-02-02 18:29:33 +00003214 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Tim Peters0bc93f52003-02-02 18:29:33 +00003219 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 PDATA_PUSH(self->stack, py_string, -1);
3224 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003225}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003226
3227
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003228#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229static int
Tim Peterscba30e22003-02-01 06:24:36 +00003230load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231{
3232 PyObject *str = 0;
3233 int len, res = -1;
3234 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003235
Tim Peters0bc93f52003-02-02 18:29:33 +00003236 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003238
Tim Peterscba30e22003-02-01 06:24:36 +00003239 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242 PDATA_PUSH(self->stack, str, -1);
3243 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 finally:
3246 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003247}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003248#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003249
3250
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003251#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003252static int
Tim Peterscba30e22003-02-01 06:24:36 +00003253load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003254{
3255 PyObject *unicode;
3256 long l;
3257 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003258
Tim Peters0bc93f52003-02-02 18:29:33 +00003259 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003262
Tim Peters0bc93f52003-02-02 18:29:33 +00003263 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003265
Tim Peterscba30e22003-02-01 06:24:36 +00003266 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003269 PDATA_PUSH(self->stack, unicode, -1);
3270 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003271}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003272#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003273
3274
3275static int
Tim Peterscba30e22003-02-01 06:24:36 +00003276load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277{
3278 PyObject *tup;
3279 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281 if ((i = marker(self)) < 0) return -1;
3282 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3283 PDATA_PUSH(self->stack, tup, -1);
3284 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285}
3286
3287static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003288load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003289{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003290 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003291
Tim Peters1d63c9f2003-02-02 20:29:39 +00003292 if (tup == NULL)
3293 return -1;
3294
3295 while (--len >= 0) {
3296 PyObject *element;
3297
3298 PDATA_POP(self->stack, element);
3299 if (element == NULL)
3300 return -1;
3301 PyTuple_SET_ITEM(tup, len, element);
3302 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303 PDATA_PUSH(self->stack, tup, -1);
3304 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003305}
3306
3307static int
Tim Peterscba30e22003-02-01 06:24:36 +00003308load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309{
3310 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003312 if (!( list=PyList_New(0))) return -1;
3313 PDATA_PUSH(self->stack, list, -1);
3314 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003315}
3316
3317static int
Tim Peterscba30e22003-02-01 06:24:36 +00003318load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319{
3320 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 if (!( dict=PyDict_New())) return -1;
3323 PDATA_PUSH(self->stack, dict, -1);
3324 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003325}
3326
3327
3328static int
Tim Peterscba30e22003-02-01 06:24:36 +00003329load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003330{
3331 PyObject *list = 0;
3332 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 if ((i = marker(self)) < 0) return -1;
3335 if (!( list=Pdata_popList(self->stack, i))) return -1;
3336 PDATA_PUSH(self->stack, list, -1);
3337 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338}
3339
3340static int
Tim Peterscba30e22003-02-01 06:24:36 +00003341load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342{
3343 PyObject *dict, *key, *value;
3344 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 if ((i = marker(self)) < 0) return -1;
3347 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003351 for (k = i+1; k < j; k += 2) {
3352 key =self->stack->data[k-1];
3353 value=self->stack->data[k ];
3354 if (PyDict_SetItem(dict, key, value) < 0) {
3355 Py_DECREF(dict);
3356 return -1;
3357 }
3358 }
3359 Pdata_clear(self->stack, i);
3360 PDATA_PUSH(self->stack, dict, -1);
3361 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362}
3363
3364static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003365Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003367 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369 if (PyClass_Check(cls)) {
3370 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 if ((l=PyObject_Size(args)) < 0) goto err;
3373 if (!( l )) {
3374 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003375
Tim Peterscba30e22003-02-01 06:24:36 +00003376 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003377 __getinitargs___str);
3378 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003379 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 so bypass usual construction */
3381 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003384 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 goto err;
3386 return inst;
3387 }
3388 Py_DECREF(__getinitargs__);
3389 }
Tim Peters84e87f32001-03-17 04:50:51 +00003390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391 if ((r=PyInstance_New(cls, args, NULL))) return r;
3392 else goto err;
3393 }
Tim Peters84e87f32001-03-17 04:50:51 +00003394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003395 if (args==Py_None) {
3396 /* Special case, call cls.__basicnew__() */
3397 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3400 if (!basicnew) return NULL;
3401 r=PyObject_CallObject(basicnew, NULL);
3402 Py_DECREF(basicnew);
3403 if (r) return r;
3404 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 err:
3409 {
3410 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003412 PyErr_Fetch(&tp, &v, &tb);
3413 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3414 Py_XDECREF(v);
3415 v=r;
3416 }
3417 PyErr_Restore(tp,v,tb);
3418 }
3419 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420}
Tim Peters84e87f32001-03-17 04:50:51 +00003421
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
3423static int
Tim Peterscba30e22003-02-01 06:24:36 +00003424load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425{
3426 PyObject *class, *tup, *obj=0;
3427 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429 if ((i = marker(self)) < 0) return -1;
3430 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3431 PDATA_POP(self->stack, class);
3432 if (class) {
3433 obj = Instance_New(class, tup);
3434 Py_DECREF(class);
3435 }
3436 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438 if (! obj) return -1;
3439 PDATA_PUSH(self->stack, obj, -1);
3440 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441}
3442
3443
3444static int
Tim Peterscba30e22003-02-01 06:24:36 +00003445load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003446{
3447 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3448 int i, len;
3449 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003451 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003452
Tim Peters0bc93f52003-02-02 18:29:33 +00003453 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454 if (len < 2) return bad_readline();
3455 module_name = PyString_FromStringAndSize(s, len - 1);
3456 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003457
Tim Peters0bc93f52003-02-02 18:29:33 +00003458 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003459 if (len < 2) return bad_readline();
3460 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003461 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 self->find_class);
3463 Py_DECREF(class_name);
3464 }
3465 }
3466 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 if ((tup=Pdata_popTuple(self->stack, i))) {
3471 obj = Instance_New(class, tup);
3472 Py_DECREF(tup);
3473 }
3474 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478 PDATA_PUSH(self->stack, obj, -1);
3479 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480}
3481
3482
3483static int
Tim Peterscba30e22003-02-01 06:24:36 +00003484load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485{
3486 PyObject *class = 0, *module_name = 0, *class_name = 0;
3487 int len;
3488 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Tim Peters0bc93f52003-02-02 18:29:33 +00003490 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if (len < 2) return bad_readline();
3492 module_name = PyString_FromStringAndSize(s, len - 1);
3493 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003494
Tim Peters0bc93f52003-02-02 18:29:33 +00003495 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003496 if (len < 2) {
3497 Py_DECREF(module_name);
3498 return bad_readline();
3499 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003501 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502 self->find_class);
3503 Py_DECREF(class_name);
3504 }
3505 }
3506 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 if (! class) return -1;
3509 PDATA_PUSH(self->stack, class, -1);
3510 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511}
3512
3513
3514static int
Tim Peterscba30e22003-02-01 06:24:36 +00003515load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516{
3517 PyObject *pid = 0;
3518 int len;
3519 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003522 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 if (len < 2) return bad_readline();
3524
3525 pid = PyString_FromStringAndSize(s, len - 1);
3526 if (!pid) return -1;
3527
3528 if (PyList_Check(self->pers_func)) {
3529 if (PyList_Append(self->pers_func, pid) < 0) {
3530 Py_DECREF(pid);
3531 return -1;
3532 }
3533 }
3534 else {
3535 ARG_TUP(self, pid);
3536 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003537 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 NULL);
3539 FREE_ARG_TUP(self);
3540 }
3541 }
3542
3543 if (! pid) return -1;
3544
3545 PDATA_PUSH(self->stack, pid, -1);
3546 return 0;
3547 }
3548 else {
3549 PyErr_SetString(UnpicklingError,
3550 "A load persistent id instruction was encountered,\n"
3551 "but no persistent_load function was specified.");
3552 return -1;
3553 }
3554}
3555
3556static int
Tim Peterscba30e22003-02-01 06:24:36 +00003557load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558{
3559 PyObject *pid = 0;
3560
3561 if (self->pers_func) {
3562 PDATA_POP(self->stack, pid);
3563 if (! pid) return -1;
3564
3565 if (PyList_Check(self->pers_func)) {
3566 if (PyList_Append(self->pers_func, pid) < 0) {
3567 Py_DECREF(pid);
3568 return -1;
3569 }
3570 }
3571 else {
3572 ARG_TUP(self, pid);
3573 if (self->arg) {
3574 pid = PyObject_Call(self->pers_func, self->arg,
3575 NULL);
3576 FREE_ARG_TUP(self);
3577 }
3578 if (! pid) return -1;
3579 }
3580
3581 PDATA_PUSH(self->stack, pid, -1);
3582 return 0;
3583 }
3584 else {
3585 PyErr_SetString(UnpicklingError,
3586 "A load persistent id instruction was encountered,\n"
3587 "but no persistent_load function was specified.");
3588 return -1;
3589 }
3590}
3591
3592
3593static int
Tim Peterscba30e22003-02-01 06:24:36 +00003594load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595{
3596 int len;
3597
3598 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3599
3600 /* Note that we split the (pickle.py) stack into two stacks,
3601 an object stack and a mark stack. We have to be clever and
3602 pop the right one. We do this by looking at the top of the
3603 mark stack.
3604 */
3605
3606 if ((self->num_marks > 0) &&
3607 (self->marks[self->num_marks - 1] == len))
3608 self->num_marks--;
3609 else {
3610 len--;
3611 Py_DECREF(self->stack->data[len]);
3612 self->stack->length=len;
3613 }
3614
3615 return 0;
3616}
3617
3618
3619static int
Tim Peterscba30e22003-02-01 06:24:36 +00003620load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621{
3622 int i;
3623
3624 if ((i = marker(self)) < 0)
3625 return -1;
3626
3627 Pdata_clear(self->stack, i);
3628
3629 return 0;
3630}
3631
3632
3633static int
Tim Peterscba30e22003-02-01 06:24:36 +00003634load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635{
3636 PyObject *last;
3637 int len;
3638
3639 if ((len = self->stack->length) <= 0) return stackUnderflow();
3640 last=self->stack->data[len-1];
3641 Py_INCREF(last);
3642 PDATA_PUSH(self->stack, last, -1);
3643 return 0;
3644}
3645
3646
3647static int
Tim Peterscba30e22003-02-01 06:24:36 +00003648load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003649{
3650 PyObject *py_str = 0, *value = 0;
3651 int len;
3652 char *s;
3653 int rc;
3654
Tim Peters0bc93f52003-02-02 18:29:33 +00003655 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003656 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003658 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660 value = PyDict_GetItem(self->memo, py_str);
3661 if (! value) {
3662 PyErr_SetObject(BadPickleGet, py_str);
3663 rc = -1;
3664 } else {
3665 PDATA_APPEND(self->stack, value, -1);
3666 rc = 0;
3667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669 Py_DECREF(py_str);
3670 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671}
3672
3673
3674static int
Tim Peterscba30e22003-02-01 06:24:36 +00003675load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676{
3677 PyObject *py_key = 0, *value = 0;
3678 unsigned char key;
3679 char *s;
3680 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003681
Tim Peters0bc93f52003-02-02 18:29:33 +00003682 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684 key = (unsigned char)s[0];
3685 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 value = PyDict_GetItem(self->memo, py_key);
3688 if (! value) {
3689 PyErr_SetObject(BadPickleGet, py_key);
3690 rc = -1;
3691 } else {
3692 PDATA_APPEND(self->stack, value, -1);
3693 rc = 0;
3694 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696 Py_DECREF(py_key);
3697 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003698}
3699
3700
3701static int
Tim Peterscba30e22003-02-01 06:24:36 +00003702load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703{
3704 PyObject *py_key = 0, *value = 0;
3705 unsigned char c;
3706 char *s;
3707 long key;
3708 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003709
Tim Peters0bc93f52003-02-02 18:29:33 +00003710 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712 c = (unsigned char)s[0];
3713 key = (long)c;
3714 c = (unsigned char)s[1];
3715 key |= (long)c << 8;
3716 c = (unsigned char)s[2];
3717 key |= (long)c << 16;
3718 c = (unsigned char)s[3];
3719 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003721 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3722
3723 value = PyDict_GetItem(self->memo, py_key);
3724 if (! value) {
3725 PyErr_SetObject(BadPickleGet, py_key);
3726 rc = -1;
3727 } else {
3728 PDATA_APPEND(self->stack, value, -1);
3729 rc = 0;
3730 }
3731
3732 Py_DECREF(py_key);
3733 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734}
3735
Tim Peters2d629652003-02-04 05:06:17 +00003736/* Push an object from the extension registry (EXT[124]). nbytes is
3737 * the number of bytes following the opcode, holding the index (code) value.
3738 */
3739static int
3740load_extension(Unpicklerobject *self, int nbytes)
3741{
3742 char *codebytes; /* the nbytes bytes after the opcode */
3743 long code; /* calc_binint returns long */
3744 PyObject *py_code; /* code as a Python int */
3745 PyObject *obj; /* the object to push */
3746 PyObject *pair; /* (module_name, class_name) */
3747 PyObject *module_name, *class_name;
3748
3749 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3750 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3751 code = calc_binint(codebytes, nbytes);
3752 if (code <= 0) { /* note that 0 is forbidden */
3753 /* Corrupt or hostile pickle. */
3754 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3755 return -1;
3756 }
3757
3758 /* Look for the code in the cache. */
3759 py_code = PyInt_FromLong(code);
3760 if (py_code == NULL) return -1;
3761 obj = PyDict_GetItem(extension_cache, py_code);
3762 if (obj != NULL) {
3763 /* Bingo. */
3764 Py_DECREF(py_code);
3765 PDATA_APPEND(self->stack, obj, -1);
3766 return 0;
3767 }
3768
3769 /* Look up the (module_name, class_name) pair. */
3770 pair = PyDict_GetItem(inverted_registry, py_code);
3771 if (pair == NULL) {
3772 Py_DECREF(py_code);
3773 PyErr_Format(PyExc_ValueError, "unregistered extension "
3774 "code %ld", code);
3775 return -1;
3776 }
3777 /* Since the extension registry is manipulable via Python code,
3778 * confirm that obj is really a 2-tuple of strings.
3779 */
3780 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3781 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3782 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3783 Py_DECREF(py_code);
3784 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3785 "isn't a 2-tuple of strings", code);
3786 return -1;
3787 }
3788 /* Load the object. */
3789 obj = find_class(module_name, class_name, self->find_class);
3790 if (obj == NULL) {
3791 Py_DECREF(py_code);
3792 return -1;
3793 }
3794 /* Cache code -> obj. */
3795 code = PyDict_SetItem(extension_cache, py_code, obj);
3796 Py_DECREF(py_code);
3797 if (code < 0) {
3798 Py_DECREF(obj);
3799 return -1;
3800 }
3801 PDATA_PUSH(self->stack, obj, -1);
3802 return 0;
3803}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
3805static int
Tim Peterscba30e22003-02-01 06:24:36 +00003806load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807{
3808 PyObject *py_str = 0, *value = 0;
3809 int len, l;
3810 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Tim Peters0bc93f52003-02-02 18:29:33 +00003812 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003813 if (l < 2) return bad_readline();
3814 if (!( len=self->stack->length )) return stackUnderflow();
3815 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3816 value=self->stack->data[len-1];
3817 l=PyDict_SetItem(self->memo, py_str, value);
3818 Py_DECREF(py_str);
3819 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820}
3821
3822
3823static int
Tim Peterscba30e22003-02-01 06:24:36 +00003824load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825{
3826 PyObject *py_key = 0, *value = 0;
3827 unsigned char key;
3828 char *s;
3829 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003830
Tim Peters0bc93f52003-02-02 18:29:33 +00003831 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003832 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3837 value=self->stack->data[len-1];
3838 len=PyDict_SetItem(self->memo, py_key, value);
3839 Py_DECREF(py_key);
3840 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841}
3842
3843
3844static int
Tim Peterscba30e22003-02-01 06:24:36 +00003845load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003846{
3847 PyObject *py_key = 0, *value = 0;
3848 long key;
3849 unsigned char c;
3850 char *s;
3851 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003852
Tim Peters0bc93f52003-02-02 18:29:33 +00003853 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 c = (unsigned char)s[0];
3857 key = (long)c;
3858 c = (unsigned char)s[1];
3859 key |= (long)c << 8;
3860 c = (unsigned char)s[2];
3861 key |= (long)c << 16;
3862 c = (unsigned char)s[3];
3863 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003865 if (!( py_key = PyInt_FromLong(key))) return -1;
3866 value=self->stack->data[len-1];
3867 len=PyDict_SetItem(self->memo, py_key, value);
3868 Py_DECREF(py_key);
3869 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003870}
3871
3872
3873static int
Tim Peterscba30e22003-02-01 06:24:36 +00003874do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875{
3876 PyObject *value = 0, *list = 0, *append_method = 0;
3877 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 len=self->stack->length;
3880 if (!( len >= x && x > 0 )) return stackUnderflow();
3881 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003882 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 if (PyList_Check(list)) {
3887 PyObject *slice;
3888 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890 slice=Pdata_popList(self->stack, x);
3891 list_len = PyList_GET_SIZE(list);
3892 i=PyList_SetSlice(list, list_len, list_len, slice);
3893 Py_DECREF(slice);
3894 return i;
3895 }
3896 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003897
Tim Peterscba30e22003-02-01 06:24:36 +00003898 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 return -1;
3900
3901 for (i = x; i < len; i++) {
3902 PyObject *junk;
3903
3904 value=self->stack->data[i];
3905 junk=0;
3906 ARG_TUP(self, value);
3907 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003908 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 NULL);
3910 FREE_ARG_TUP(self);
3911 }
3912 if (! junk) {
3913 Pdata_clear(self->stack, i+1);
3914 self->stack->length=x;
3915 Py_DECREF(append_method);
3916 return -1;
3917 }
3918 Py_DECREF(junk);
3919 }
3920 self->stack->length=x;
3921 Py_DECREF(append_method);
3922 }
3923
3924 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925}
3926
3927
3928static int
Tim Peterscba30e22003-02-01 06:24:36 +00003929load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930{
3931 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003932}
3933
3934
3935static int
Tim Peterscba30e22003-02-01 06:24:36 +00003936load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937{
3938 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939}
3940
3941
3942static int
Tim Peterscba30e22003-02-01 06:24:36 +00003943do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944{
3945 PyObject *value = 0, *key = 0, *dict = 0;
3946 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 if (!( (len=self->stack->length) >= x
3949 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953 for (i = x+1; i < len; i += 2) {
3954 key =self->stack->data[i-1];
3955 value=self->stack->data[i ];
3956 if (PyObject_SetItem(dict, key, value) < 0) {
3957 r=-1;
3958 break;
3959 }
3960 }
3961
3962 Pdata_clear(self->stack, x);
3963
3964 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965}
3966
3967
Tim Peters84e87f32001-03-17 04:50:51 +00003968static int
Tim Peterscba30e22003-02-01 06:24:36 +00003969load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970{
3971 return do_setitems(self, self->stack->length - 2);
3972}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003974static int
Tim Peterscba30e22003-02-01 06:24:36 +00003975load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976{
3977 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978}
3979
Tim Peters84e87f32001-03-17 04:50:51 +00003980
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981static int
Tim Peterscba30e22003-02-01 06:24:36 +00003982load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983{
3984 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3985 *junk = 0, *__setstate__ = 0;
3986 int i, r = 0;
3987
3988 if (self->stack->length < 2) return stackUnderflow();
3989 PDATA_POP(self->stack, value);
3990 if (! value) return -1;
3991 inst=self->stack->data[self->stack->length-1];
3992
3993 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3994 ARG_TUP(self, value);
3995 if (self->arg) {
3996 junk = PyObject_Call(__setstate__, self->arg, NULL);
3997 FREE_ARG_TUP(self);
3998 }
3999 Py_DECREF(__setstate__);
4000 if (! junk) return -1;
4001 Py_DECREF(junk);
4002 return 0;
4003 }
4004
4005 PyErr_Clear();
4006 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
4007 i = 0;
4008 while (PyDict_Next(value, &i, &d_key, &d_value)) {
4009 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
4010 r=-1;
4011 break;
4012 }
4013 }
4014 Py_DECREF(instdict);
4015 }
4016 else r=-1;
4017
4018 Py_XDECREF(value);
4019
4020 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004021}
4022
4023
4024static int
Tim Peterscba30e22003-02-01 06:24:36 +00004025load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004026{
4027 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004029 /* Note that we split the (pickle.py) stack into two stacks, an
4030 object stack and a mark stack. Here we push a mark onto the
4031 mark stack.
4032 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 if ((self->num_marks + 1) >= self->marks_size) {
4035 s=self->marks_size+20;
4036 if (s <= self->num_marks) s=self->num_marks + 1;
4037 if (self->marks == NULL)
4038 self->marks=(int *)malloc(s * sizeof(int));
4039 else
Tim Peterscba30e22003-02-01 06:24:36 +00004040 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041 s * sizeof(int));
4042 if (! self->marks) {
4043 PyErr_NoMemory();
4044 return -1;
4045 }
4046 self->marks_size = s;
4047 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004052}
4053
Guido van Rossum60456fd1997-04-09 17:36:32 +00004054static int
Tim Peterscba30e22003-02-01 06:24:36 +00004055load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056{
4057 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 PDATA_POP(self->stack, arg_tup);
4060 if (! arg_tup) return -1;
4061 PDATA_POP(self->stack, callable);
4062 if (callable) {
4063 ob = Instance_New(callable, arg_tup);
4064 Py_DECREF(callable);
4065 }
4066 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004068 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 PDATA_PUSH(self->stack, ob, -1);
4071 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004072}
Tim Peters84e87f32001-03-17 04:50:51 +00004073
Tim Peters4190fb82003-02-02 16:09:05 +00004074/* Just raises an error if we don't know the protocol specified. PROTO
4075 * is the first opcode for protocols >= 2.
4076 */
4077static int
4078load_proto(Unpicklerobject *self)
4079{
4080 int i;
4081 char *protobyte;
4082
4083 i = self->read_func(self, &protobyte, 1);
4084 if (i < 0)
4085 return -1;
4086
4087 i = calc_binint(protobyte, 1);
4088 /* No point checking for < 0, since calc_binint returns an unsigned
4089 * int when chewing on 1 byte.
4090 */
4091 assert(i >= 0);
4092 if (i <= CURRENT_PROTOCOL_NUMBER)
4093 return 0;
4094
4095 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4096 return -1;
4097}
4098
Guido van Rossum60456fd1997-04-09 17:36:32 +00004099static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004100load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101{
4102 PyObject *err = 0, *val = 0;
4103 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 self->num_marks = 0;
4106 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004109 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 switch (s[0]) {
4113 case NONE:
4114 if (load_none(self) < 0)
4115 break;
4116 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 case BININT:
4119 if (load_binint(self) < 0)
4120 break;
4121 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 case BININT1:
4124 if (load_binint1(self) < 0)
4125 break;
4126 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 case BININT2:
4129 if (load_binint2(self) < 0)
4130 break;
4131 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 case INT:
4134 if (load_int(self) < 0)
4135 break;
4136 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 case LONG:
4139 if (load_long(self) < 0)
4140 break;
4141 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004142
Tim Petersee1a53c2003-02-02 02:57:53 +00004143 case LONG1:
4144 if (load_counted_long(self, 1) < 0)
4145 break;
4146 continue;
4147
4148 case LONG4:
4149 if (load_counted_long(self, 4) < 0)
4150 break;
4151 continue;
4152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 case FLOAT:
4154 if (load_float(self) < 0)
4155 break;
4156 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 case BINFLOAT:
4159 if (load_binfloat(self) < 0)
4160 break;
4161 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 case BINSTRING:
4164 if (load_binstring(self) < 0)
4165 break;
4166 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 case SHORT_BINSTRING:
4169 if (load_short_binstring(self) < 0)
4170 break;
4171 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 case STRING:
4174 if (load_string(self) < 0)
4175 break;
4176 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004177
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004178#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 case UNICODE:
4180 if (load_unicode(self) < 0)
4181 break;
4182 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case BINUNICODE:
4185 if (load_binunicode(self) < 0)
4186 break;
4187 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004188#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004191 if (load_counted_tuple(self, 0) < 0)
4192 break;
4193 continue;
4194
4195 case TUPLE1:
4196 if (load_counted_tuple(self, 1) < 0)
4197 break;
4198 continue;
4199
4200 case TUPLE2:
4201 if (load_counted_tuple(self, 2) < 0)
4202 break;
4203 continue;
4204
4205 case TUPLE3:
4206 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 break;
4208 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 case TUPLE:
4211 if (load_tuple(self) < 0)
4212 break;
4213 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 case EMPTY_LIST:
4216 if (load_empty_list(self) < 0)
4217 break;
4218 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220 case LIST:
4221 if (load_list(self) < 0)
4222 break;
4223 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 case EMPTY_DICT:
4226 if (load_empty_dict(self) < 0)
4227 break;
4228 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 case DICT:
4231 if (load_dict(self) < 0)
4232 break;
4233 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case OBJ:
4236 if (load_obj(self) < 0)
4237 break;
4238 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case INST:
4241 if (load_inst(self) < 0)
4242 break;
4243 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case GLOBAL:
4246 if (load_global(self) < 0)
4247 break;
4248 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case APPEND:
4251 if (load_append(self) < 0)
4252 break;
4253 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 case APPENDS:
4256 if (load_appends(self) < 0)
4257 break;
4258 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case BUILD:
4261 if (load_build(self) < 0)
4262 break;
4263 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 case DUP:
4266 if (load_dup(self) < 0)
4267 break;
4268 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 case BINGET:
4271 if (load_binget(self) < 0)
4272 break;
4273 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 case LONG_BINGET:
4276 if (load_long_binget(self) < 0)
4277 break;
4278 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 case GET:
4281 if (load_get(self) < 0)
4282 break;
4283 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004284
Tim Peters2d629652003-02-04 05:06:17 +00004285 case EXT1:
4286 if (load_extension(self, 1) < 0)
4287 break;
4288 continue;
4289
4290 case EXT2:
4291 if (load_extension(self, 2) < 0)
4292 break;
4293 continue;
4294
4295 case EXT4:
4296 if (load_extension(self, 4) < 0)
4297 break;
4298 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 case MARK:
4300 if (load_mark(self) < 0)
4301 break;
4302 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 case BINPUT:
4305 if (load_binput(self) < 0)
4306 break;
4307 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309 case LONG_BINPUT:
4310 if (load_long_binput(self) < 0)
4311 break;
4312 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 case PUT:
4315 if (load_put(self) < 0)
4316 break;
4317 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319 case POP:
4320 if (load_pop(self) < 0)
4321 break;
4322 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324 case POP_MARK:
4325 if (load_pop_mark(self) < 0)
4326 break;
4327 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004329 case SETITEM:
4330 if (load_setitem(self) < 0)
4331 break;
4332 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 case SETITEMS:
4335 if (load_setitems(self) < 0)
4336 break;
4337 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004339 case STOP:
4340 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case PERSID:
4343 if (load_persid(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 BINPERSID:
4348 if (load_binpersid(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 REDUCE:
4353 if (load_reduce(self) < 0)
4354 break;
4355 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Tim Peters4190fb82003-02-02 16:09:05 +00004357 case PROTO:
4358 if (load_proto(self) < 0)
4359 break;
4360 continue;
4361
Tim Peters3c67d792003-02-02 17:59:11 +00004362 case NEWTRUE:
4363 if (load_bool(self, Py_True) < 0)
4364 break;
4365 continue;
4366
4367 case NEWFALSE:
4368 if (load_bool(self, Py_False) < 0)
4369 break;
4370 continue;
4371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 case '\0':
4373 /* end of file */
4374 PyErr_SetNone(PyExc_EOFError);
4375 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004378 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 "invalid load key, '%s'.",
4380 "c", s[0]);
4381 return NULL;
4382 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 break;
4385 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 if ((err = PyErr_Occurred())) {
4388 if (err == PyExc_EOFError) {
4389 PyErr_SetNone(PyExc_EOFError);
4390 }
4391 return NULL;
4392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394 PDATA_POP(self->stack, val);
4395 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004396}
Tim Peters84e87f32001-03-17 04:50:51 +00004397
Guido van Rossum60456fd1997-04-09 17:36:32 +00004398
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004399/* No-load functions to support noload, which is used to
4400 find persistent references. */
4401
4402static int
Tim Peterscba30e22003-02-01 06:24:36 +00004403noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404{
4405 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 if ((i = marker(self)) < 0) return -1;
4408 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004409}
4410
4411
4412static int
Tim Peterscba30e22003-02-01 06:24:36 +00004413noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004414{
4415 int i;
4416 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004418 if ((i = marker(self)) < 0) return -1;
4419 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004420 if (self->readline_func(self, &s) < 0) return -1;
4421 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 PDATA_APPEND(self->stack, Py_None,-1);
4423 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004424}
4425
4426static int
Tim Peterscba30e22003-02-01 06:24:36 +00004427noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428{
4429 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004430
Tim Peters0bc93f52003-02-02 18:29:33 +00004431 if (self->readline_func(self, &s) < 0) return -1;
4432 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 PDATA_APPEND(self->stack, Py_None,-1);
4434 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004435}
4436
4437static int
Tim Peterscba30e22003-02-01 06:24:36 +00004438noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 if (self->stack->length < 2) return stackUnderflow();
4442 Pdata_clear(self->stack, self->stack->length-2);
4443 PDATA_APPEND(self->stack, Py_None,-1);
4444 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004445}
4446
4447static int
4448noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004449
Guido van Rossum053b8df1998-11-25 16:18:00 +00004450 if (self->stack->length < 1) return stackUnderflow();
4451 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004452 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004453}
4454
Tim Peters2d629652003-02-04 05:06:17 +00004455static int
4456noload_extension(Unpicklerobject *self, int nbytes)
4457{
4458 char *codebytes;
4459
4460 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4461 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4462 PDATA_APPEND(self->stack, Py_None, -1);
4463 return 0;
4464}
4465
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004466
4467static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004468noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469{
4470 PyObject *err = 0, *val = 0;
4471 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 self->num_marks = 0;
4474 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004477 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480 switch (s[0]) {
4481 case NONE:
4482 if (load_none(self) < 0)
4483 break;
4484 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 case BININT:
4487 if (load_binint(self) < 0)
4488 break;
4489 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 case BININT1:
4492 if (load_binint1(self) < 0)
4493 break;
4494 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 case BININT2:
4497 if (load_binint2(self) < 0)
4498 break;
4499 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501 case INT:
4502 if (load_int(self) < 0)
4503 break;
4504 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 case LONG:
4507 if (load_long(self) < 0)
4508 break;
4509 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004510
Tim Peters4190fb82003-02-02 16:09:05 +00004511 case LONG1:
4512 if (load_counted_long(self, 1) < 0)
4513 break;
4514 continue;
4515
4516 case LONG4:
4517 if (load_counted_long(self, 4) < 0)
4518 break;
4519 continue;
4520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 case FLOAT:
4522 if (load_float(self) < 0)
4523 break;
4524 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 case BINFLOAT:
4527 if (load_binfloat(self) < 0)
4528 break;
4529 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 case BINSTRING:
4532 if (load_binstring(self) < 0)
4533 break;
4534 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 case SHORT_BINSTRING:
4537 if (load_short_binstring(self) < 0)
4538 break;
4539 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 case STRING:
4542 if (load_string(self) < 0)
4543 break;
4544 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004545
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004546#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 case UNICODE:
4548 if (load_unicode(self) < 0)
4549 break;
4550 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 case BINUNICODE:
4553 if (load_binunicode(self) < 0)
4554 break;
4555 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004556#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004559 if (load_counted_tuple(self, 0) < 0)
4560 break;
4561 continue;
4562
4563 case TUPLE1:
4564 if (load_counted_tuple(self, 1) < 0)
4565 break;
4566 continue;
4567
4568 case TUPLE2:
4569 if (load_counted_tuple(self, 2) < 0)
4570 break;
4571 continue;
4572
4573 case TUPLE3:
4574 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 break;
4576 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 case TUPLE:
4579 if (load_tuple(self) < 0)
4580 break;
4581 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 case EMPTY_LIST:
4584 if (load_empty_list(self) < 0)
4585 break;
4586 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 case LIST:
4589 if (load_list(self) < 0)
4590 break;
4591 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 case EMPTY_DICT:
4594 if (load_empty_dict(self) < 0)
4595 break;
4596 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 case DICT:
4599 if (load_dict(self) < 0)
4600 break;
4601 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 case OBJ:
4604 if (noload_obj(self) < 0)
4605 break;
4606 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 case INST:
4609 if (noload_inst(self) < 0)
4610 break;
4611 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 case GLOBAL:
4614 if (noload_global(self) < 0)
4615 break;
4616 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 case APPEND:
4619 if (load_append(self) < 0)
4620 break;
4621 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623 case APPENDS:
4624 if (load_appends(self) < 0)
4625 break;
4626 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 case BUILD:
4629 if (noload_build(self) < 0)
4630 break;
4631 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 case DUP:
4634 if (load_dup(self) < 0)
4635 break;
4636 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004638 case BINGET:
4639 if (load_binget(self) < 0)
4640 break;
4641 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004643 case LONG_BINGET:
4644 if (load_long_binget(self) < 0)
4645 break;
4646 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 case GET:
4649 if (load_get(self) < 0)
4650 break;
4651 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004652
Tim Peters2d629652003-02-04 05:06:17 +00004653 case EXT1:
4654 if (noload_extension(self, 1) < 0)
4655 break;
4656 continue;
4657
4658 case EXT2:
4659 if (noload_extension(self, 2) < 0)
4660 break;
4661 continue;
4662
4663 case EXT4:
4664 if (noload_extension(self, 4) < 0)
4665 break;
4666 continue;
4667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 case MARK:
4669 if (load_mark(self) < 0)
4670 break;
4671 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 case BINPUT:
4674 if (load_binput(self) < 0)
4675 break;
4676 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678 case LONG_BINPUT:
4679 if (load_long_binput(self) < 0)
4680 break;
4681 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 case PUT:
4684 if (load_put(self) < 0)
4685 break;
4686 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688 case POP:
4689 if (load_pop(self) < 0)
4690 break;
4691 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004693 case POP_MARK:
4694 if (load_pop_mark(self) < 0)
4695 break;
4696 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 case SETITEM:
4699 if (load_setitem(self) < 0)
4700 break;
4701 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 case SETITEMS:
4704 if (load_setitems(self) < 0)
4705 break;
4706 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 case STOP:
4709 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 case PERSID:
4712 if (load_persid(self) < 0)
4713 break;
4714 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 case BINPERSID:
4717 if (load_binpersid(self) < 0)
4718 break;
4719 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 case REDUCE:
4722 if (noload_reduce(self) < 0)
4723 break;
4724 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004725
Tim Peters4190fb82003-02-02 16:09:05 +00004726 case PROTO:
4727 if (load_proto(self) < 0)
4728 break;
4729 continue;
4730
Tim Peters3c67d792003-02-02 17:59:11 +00004731 case NEWTRUE:
4732 if (load_bool(self, Py_True) < 0)
4733 break;
4734 continue;
4735
4736 case NEWFALSE:
4737 if (load_bool(self, Py_False) < 0)
4738 break;
4739 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004741 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 "invalid load key, '%s'.",
4743 "c", s[0]);
4744 return NULL;
4745 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 break;
4748 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 if ((err = PyErr_Occurred())) {
4751 if (err == PyExc_EOFError) {
4752 PyErr_SetNone(PyExc_EOFError);
4753 }
4754 return NULL;
4755 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 PDATA_POP(self->stack, val);
4758 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004759}
Tim Peters84e87f32001-03-17 04:50:51 +00004760
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004761
Guido van Rossum60456fd1997-04-09 17:36:32 +00004762static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004763Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764{
Tim Peterscba30e22003-02-01 06:24:36 +00004765 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004769}
4770
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004771static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004772Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773{
Tim Peterscba30e22003-02-01 06:24:36 +00004774 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004778}
4779
Guido van Rossum60456fd1997-04-09 17:36:32 +00004780
4781static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004782 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004783 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004784 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004785 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004786 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004787 "noload() -- not load a pickle, but go through most of the motions\n"
4788 "\n"
4789 "This function can be used to read past a pickle without instantiating\n"
4790 "any objects or importing any modules. It can also be used to find all\n"
4791 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004792 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004793 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004794 {NULL, NULL} /* sentinel */
4795};
4796
4797
4798static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004799newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004800{
4801 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004802
Tim Peterscba30e22003-02-01 06:24:36 +00004803 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 self->file = NULL;
4807 self->arg = NULL;
4808 self->stack = (Pdata*)Pdata_New();
4809 self->pers_func = NULL;
4810 self->last_string = NULL;
4811 self->marks = NULL;
4812 self->num_marks = 0;
4813 self->marks_size = 0;
4814 self->buf_size = 0;
4815 self->read = NULL;
4816 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004818
Tim Peterscba30e22003-02-01 06:24:36 +00004819 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004820 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 Py_INCREF(f);
4823 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825 /* Set read, readline based on type of f */
4826 if (PyFile_Check(f)) {
4827 self->fp = PyFile_AsFile(f);
4828 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004829 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004830 "I/O operation on closed file");
4831 goto err;
4832 }
4833 self->read_func = read_file;
4834 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004835 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 else if (PycStringIO_InputCheck(f)) {
4837 self->fp = NULL;
4838 self->read_func = read_cStringIO;
4839 self->readline_func = readline_cStringIO;
4840 }
4841 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004843 self->fp = NULL;
4844 self->read_func = read_other;
4845 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004847 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4848 (self->read = PyObject_GetAttr(f, read_str)))) {
4849 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004850 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004851 "argument must have 'read' and "
4852 "'readline' attributes" );
4853 goto err;
4854 }
4855 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004857 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 err:
4860 Py_DECREF((PyObject *)self);
4861 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004862}
4863
4864
4865static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004866get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867{
4868 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004869
Tim Peterscba30e22003-02-01 06:24:36 +00004870 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004871 return NULL;
4872 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004873}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004874
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004875
Guido van Rossum60456fd1997-04-09 17:36:32 +00004876static void
Tim Peterscba30e22003-02-01 06:24:36 +00004877Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878{
4879 Py_XDECREF(self->readline);
4880 Py_XDECREF(self->read);
4881 Py_XDECREF(self->file);
4882 Py_XDECREF(self->memo);
4883 Py_XDECREF(self->stack);
4884 Py_XDECREF(self->pers_func);
4885 Py_XDECREF(self->arg);
4886 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004888 if (self->marks) {
4889 free(self->marks);
4890 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 if (self->buf_size) {
4893 free(self->buf);
4894 }
Tim Peters84e87f32001-03-17 04:50:51 +00004895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004896 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004897}
4898
4899
4900static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004901Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902{
4903 if (!strcmp(name, "persistent_load")) {
4904 if (!self->pers_func) {
4905 PyErr_SetString(PyExc_AttributeError, name);
4906 return NULL;
4907 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004909 Py_INCREF(self->pers_func);
4910 return self->pers_func;
4911 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004913 if (!strcmp(name, "find_global")) {
4914 if (!self->find_class) {
4915 PyErr_SetString(PyExc_AttributeError, name);
4916 return NULL;
4917 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 Py_INCREF(self->find_class);
4920 return self->find_class;
4921 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004923 if (!strcmp(name, "memo")) {
4924 if (!self->memo) {
4925 PyErr_SetString(PyExc_AttributeError, name);
4926 return NULL;
4927 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004929 Py_INCREF(self->memo);
4930 return self->memo;
4931 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933 if (!strcmp(name, "UnpicklingError")) {
4934 Py_INCREF(UnpicklingError);
4935 return UnpicklingError;
4936 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004939}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004940
Guido van Rossum60456fd1997-04-09 17:36:32 +00004941
4942static int
Tim Peterscba30e22003-02-01 06:24:36 +00004943Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 if (!strcmp(name, "persistent_load")) {
4947 Py_XDECREF(self->pers_func);
4948 self->pers_func = value;
4949 Py_XINCREF(value);
4950 return 0;
4951 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 if (!strcmp(name, "find_global")) {
4954 Py_XDECREF(self->find_class);
4955 self->find_class = value;
4956 Py_XINCREF(value);
4957 return 0;
4958 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004960 if (! value) {
4961 PyErr_SetString(PyExc_TypeError,
4962 "attribute deletion is not supported");
4963 return -1;
4964 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 if (strcmp(name, "memo") == 0) {
4967 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004968 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 "memo must be a dictionary");
4970 return -1;
4971 }
4972 Py_XDECREF(self->memo);
4973 self->memo = value;
4974 Py_INCREF(value);
4975 return 0;
4976 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 PyErr_SetString(PyExc_AttributeError, name);
4979 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004980}
4981
Tim Peters5bd2a792003-02-01 16:45:06 +00004982/* ---------------------------------------------------------------------------
4983 * Module-level functions.
4984 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004985
Tim Peters5bd2a792003-02-01 16:45:06 +00004986/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004987static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004988cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004989{
4990 PyObject *ob, *file, *res = NULL;
4991 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004992 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004993
Tim Peters5bd2a792003-02-01 16:45:06 +00004994 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004995 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004996
Tim Peters5bd2a792003-02-01 16:45:06 +00004997 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004998 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005000 if (dump(pickler, ob) < 0)
5001 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005003 Py_INCREF(Py_None);
5004 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005006 finally:
5007 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005010}
5011
5012
Tim Peters5bd2a792003-02-01 16:45:06 +00005013/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005014static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005015cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016{
5017 PyObject *ob, *file = 0, *res = NULL;
5018 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005019 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005020
Tim Peters5bd2a792003-02-01 16:45:06 +00005021 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005022 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005023
Tim Peterscba30e22003-02-01 06:24:36 +00005024 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005026
Tim Peters5bd2a792003-02-01 16:45:06 +00005027 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005028 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005030 if (dump(pickler, ob) < 0)
5031 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005035 finally:
5036 Py_XDECREF(pickler);
5037 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005039 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005040}
5041
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005042
Tim Peters5bd2a792003-02-01 16:45:06 +00005043/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005044static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005045cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005046{
5047 Unpicklerobject *unpickler = 0;
5048 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005049
Tim Peterscba30e22003-02-01 06:24:36 +00005050 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005051 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005052
Tim Peterscba30e22003-02-01 06:24:36 +00005053 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005054 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058 finally:
5059 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005062}
5063
5064
Tim Peters5bd2a792003-02-01 16:45:06 +00005065/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005066static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005067cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005068{
5069 PyObject *ob, *file = 0, *res = NULL;
5070 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005071
Tim Peterscba30e22003-02-01 06:24:36 +00005072 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005073 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005074
Tim Peterscba30e22003-02-01 06:24:36 +00005075 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005076 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005077
Tim Peterscba30e22003-02-01 06:24:36 +00005078 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005079 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005083 finally:
5084 Py_XDECREF(file);
5085 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005088}
5089
5090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005091PyDoc_STRVAR(Unpicklertype__doc__,
5092"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005093
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005094static PyTypeObject Unpicklertype = {
5095 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00005096 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00005097 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00005098 sizeof(Unpicklerobject), /*tp_basicsize*/
5099 0, /*tp_itemsize*/
5100 /* methods */
5101 (destructor)Unpickler_dealloc, /*tp_dealloc*/
5102 (printfunc)0, /*tp_print*/
5103 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
5104 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
5105 (cmpfunc)0, /*tp_compare*/
5106 (reprfunc)0, /*tp_repr*/
5107 0, /*tp_as_number*/
5108 0, /*tp_as_sequence*/
5109 0, /*tp_as_mapping*/
5110 (hashfunc)0, /*tp_hash*/
5111 (ternaryfunc)0, /*tp_call*/
5112 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005113
Guido van Rossum60456fd1997-04-09 17:36:32 +00005114 /* Space for future expansion */
5115 0L,0L,0L,0L,
5116 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005117};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005118
Guido van Rossum60456fd1997-04-09 17:36:32 +00005119static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005120 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005121 PyDoc_STR("dump(object, file, proto=0) -- "
5122 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005123 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005124 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005125 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005126
Neal Norwitzb0493252002-03-31 14:44:22 +00005127 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005128 PyDoc_STR("dumps(object, proto=0) -- "
5129 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005130 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005131 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005132 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005133
Neal Norwitzb0493252002-03-31 14:44:22 +00005134 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005135 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005136
Neal Norwitzb0493252002-03-31 14:44:22 +00005137 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005138 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005139
Neal Norwitzb0493252002-03-31 14:44:22 +00005140 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005141 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005142 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005143 "This takes a file-like object for writing a pickle data stream.\n"
5144 "The optional proto argument tells the pickler to use the given\n"
5145 "protocol; supported protocols are 0, 1, 2. The default\n"
5146 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5147 "only protocol that can be written to a file opened in text\n"
5148 "mode and read back successfully. When using a protocol higher\n"
5149 "than 0, make sure the file is opened in binary mode, both when\n"
5150 "pickling and unpickling.)\n"
5151 "\n"
5152 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5153 "more efficient than protocol 1.\n"
5154 "\n"
5155 "Specifying a negative protocol version selects the highest\n"
5156 "protocol version supported. The higher the protocol used, the\n"
5157 "more recent the version of Python needed to read the pickle\n"
5158 "produced.\n"
5159 "\n"
5160 "The file parameter must have a write() method that accepts a single\n"
5161 "string argument. It can thus be an open file object, a StringIO\n"
5162 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005163 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005164
Neal Norwitzb0493252002-03-31 14:44:22 +00005165 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005166 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5167
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005168 { NULL, NULL }
5169};
5170
Guido van Rossum60456fd1997-04-09 17:36:32 +00005171static int
Tim Peterscba30e22003-02-01 06:24:36 +00005172init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005173{
5174 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005175
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005176#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005178 INIT_STR(__class__);
5179 INIT_STR(__getinitargs__);
5180 INIT_STR(__dict__);
5181 INIT_STR(__getstate__);
5182 INIT_STR(__setstate__);
5183 INIT_STR(__name__);
5184 INIT_STR(__main__);
5185 INIT_STR(__reduce__);
5186 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005187 INIT_STR(append);
5188 INIT_STR(read);
5189 INIT_STR(readline);
5190 INIT_STR(copy_reg);
5191 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005192 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005193
Tim Peterscba30e22003-02-01 06:24:36 +00005194 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005196
Tim Peters1f1b2d22003-02-01 02:16:37 +00005197 /* This is special because we want to use a different
5198 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005199 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005200 if (!dispatch_table) return -1;
5201
5202 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005203 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005204 if (!extension_registry) return -1;
5205
5206 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005207 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005208 if (!inverted_registry) return -1;
5209
5210 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005211 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005212 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005215
Tim Peterscba30e22003-02-01 06:24:36 +00005216 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005217 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 /* Ugh */
5220 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5221 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5222 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005224 if (!( t=PyDict_New())) return -1;
5225 if (!( r=PyRun_String(
5226 "def __init__(self, *args): self.args=args\n\n"
5227 "def __str__(self):\n"
5228 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5229 Py_file_input,
5230 module_dict, t) )) return -1;
5231 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005233 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005234 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005237 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005238
Tim Peterscba30e22003-02-01 06:24:36 +00005239 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005240 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005241 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005242 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 if (!( t=PyDict_New())) return -1;
5245 if (!( r=PyRun_String(
5246 "def __init__(self, *args): self.args=args\n\n"
5247 "def __str__(self):\n"
5248 " a=self.args\n"
5249 " a=a and type(a[0]) or '(what)'\n"
5250 " return 'Cannot pickle %s objects' % a\n"
5251 , Py_file_input,
5252 module_dict, t) )) return -1;
5253 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005255 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005256 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005257 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005259 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005261 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005262 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005263 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005264
Martin v. Löwis658009a2002-09-16 17:26:24 +00005265 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5266 UnpicklingError, NULL)))
5267 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 if (PyDict_SetItemString(module_dict, "PickleError",
5270 PickleError) < 0)
5271 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005273 if (PyDict_SetItemString(module_dict, "PicklingError",
5274 PicklingError) < 0)
5275 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005277 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5278 UnpicklingError) < 0)
5279 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005281 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5282 UnpickleableError) < 0)
5283 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005285 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5286 BadPickleGet) < 0)
5287 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005289 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005291 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005292}
5293
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005294#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5295#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005296#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005297PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005298initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005299{
5300 PyObject *m, *d, *di, *v, *k;
5301 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005302 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005303 PyObject *format_version;
5304 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005306 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005307 Unpicklertype.ob_type = &PyType_Type;
5308 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005310 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005311 * so we're forced to use a temporary dictionary. :(
5312 */
5313 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005314 if (!di) return;
5315 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005317 /* Create the module and add the functions */
5318 m = Py_InitModule4("cPickle", cPickle_methods,
5319 cPickle_module_documentation,
5320 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005322 /* Add some symbolic constants to the module */
5323 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005324 v = PyString_FromString(rev);
5325 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005328 /* Copy data from di. Waaa. */
5329 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5330 if (PyObject_SetItem(d, k, v) < 0) {
5331 Py_DECREF(di);
5332 return;
5333 }
5334 }
5335 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005336
Tim Peters5b7da392003-02-04 00:21:07 +00005337 /* These are purely informational; no code uses them. */
5338 /* File format version we write. */
5339 format_version = PyString_FromString("2.0");
5340 /* Format versions we can read. */
5341 compatible_formats = Py_BuildValue("[sssss]",
5342 "1.0", /* Original protocol 0 */
5343 "1.1", /* Protocol 0 + INST */
5344 "1.2", /* Original protocol 1 */
5345 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005346 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005347 PyDict_SetItemString(d, "format_version", format_version);
5348 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5349 Py_XDECREF(format_version);
5350 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005351}