blob: f5aadd2c50397e1e88a1a91f0e1738f44b134bfe [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
3736
3737static int
Tim Peterscba30e22003-02-01 06:24:36 +00003738load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739{
3740 PyObject *py_str = 0, *value = 0;
3741 int len, l;
3742 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003743
Tim Peters0bc93f52003-02-02 18:29:33 +00003744 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 if (l < 2) return bad_readline();
3746 if (!( len=self->stack->length )) return stackUnderflow();
3747 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3748 value=self->stack->data[len-1];
3749 l=PyDict_SetItem(self->memo, py_str, value);
3750 Py_DECREF(py_str);
3751 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003752}
3753
3754
3755static int
Tim Peterscba30e22003-02-01 06:24:36 +00003756load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757{
3758 PyObject *py_key = 0, *value = 0;
3759 unsigned char key;
3760 char *s;
3761 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003762
Tim Peters0bc93f52003-02-02 18:29:33 +00003763 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3769 value=self->stack->data[len-1];
3770 len=PyDict_SetItem(self->memo, py_key, value);
3771 Py_DECREF(py_key);
3772 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773}
3774
3775
3776static int
Tim Peterscba30e22003-02-01 06:24:36 +00003777load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778{
3779 PyObject *py_key = 0, *value = 0;
3780 long key;
3781 unsigned char c;
3782 char *s;
3783 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Tim Peters0bc93f52003-02-02 18:29:33 +00003785 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003786 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 c = (unsigned char)s[0];
3789 key = (long)c;
3790 c = (unsigned char)s[1];
3791 key |= (long)c << 8;
3792 c = (unsigned char)s[2];
3793 key |= (long)c << 16;
3794 c = (unsigned char)s[3];
3795 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797 if (!( py_key = PyInt_FromLong(key))) return -1;
3798 value=self->stack->data[len-1];
3799 len=PyDict_SetItem(self->memo, py_key, value);
3800 Py_DECREF(py_key);
3801 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003802}
3803
3804
3805static int
Tim Peterscba30e22003-02-01 06:24:36 +00003806do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807{
3808 PyObject *value = 0, *list = 0, *append_method = 0;
3809 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811 len=self->stack->length;
3812 if (!( len >= x && x > 0 )) return stackUnderflow();
3813 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003814 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 if (PyList_Check(list)) {
3819 PyObject *slice;
3820 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822 slice=Pdata_popList(self->stack, x);
3823 list_len = PyList_GET_SIZE(list);
3824 i=PyList_SetSlice(list, list_len, list_len, slice);
3825 Py_DECREF(slice);
3826 return i;
3827 }
3828 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Tim Peterscba30e22003-02-01 06:24:36 +00003830 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 return -1;
3832
3833 for (i = x; i < len; i++) {
3834 PyObject *junk;
3835
3836 value=self->stack->data[i];
3837 junk=0;
3838 ARG_TUP(self, value);
3839 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003840 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 NULL);
3842 FREE_ARG_TUP(self);
3843 }
3844 if (! junk) {
3845 Pdata_clear(self->stack, i+1);
3846 self->stack->length=x;
3847 Py_DECREF(append_method);
3848 return -1;
3849 }
3850 Py_DECREF(junk);
3851 }
3852 self->stack->length=x;
3853 Py_DECREF(append_method);
3854 }
3855
3856 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003857}
3858
3859
3860static int
Tim Peterscba30e22003-02-01 06:24:36 +00003861load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862{
3863 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003864}
3865
3866
3867static int
Tim Peterscba30e22003-02-01 06:24:36 +00003868load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869{
3870 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003871}
3872
3873
3874static int
Tim Peterscba30e22003-02-01 06:24:36 +00003875do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876{
3877 PyObject *value = 0, *key = 0, *dict = 0;
3878 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 if (!( (len=self->stack->length) >= x
3881 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003883 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003885 for (i = x+1; i < len; i += 2) {
3886 key =self->stack->data[i-1];
3887 value=self->stack->data[i ];
3888 if (PyObject_SetItem(dict, key, value) < 0) {
3889 r=-1;
3890 break;
3891 }
3892 }
3893
3894 Pdata_clear(self->stack, x);
3895
3896 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003897}
3898
3899
Tim Peters84e87f32001-03-17 04:50:51 +00003900static int
Tim Peterscba30e22003-02-01 06:24:36 +00003901load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902{
3903 return do_setitems(self, self->stack->length - 2);
3904}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906static int
Tim Peterscba30e22003-02-01 06:24:36 +00003907load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908{
3909 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910}
3911
Tim Peters84e87f32001-03-17 04:50:51 +00003912
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913static int
Tim Peterscba30e22003-02-01 06:24:36 +00003914load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915{
3916 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3917 *junk = 0, *__setstate__ = 0;
3918 int i, r = 0;
3919
3920 if (self->stack->length < 2) return stackUnderflow();
3921 PDATA_POP(self->stack, value);
3922 if (! value) return -1;
3923 inst=self->stack->data[self->stack->length-1];
3924
3925 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3926 ARG_TUP(self, value);
3927 if (self->arg) {
3928 junk = PyObject_Call(__setstate__, self->arg, NULL);
3929 FREE_ARG_TUP(self);
3930 }
3931 Py_DECREF(__setstate__);
3932 if (! junk) return -1;
3933 Py_DECREF(junk);
3934 return 0;
3935 }
3936
3937 PyErr_Clear();
3938 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3939 i = 0;
3940 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3941 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3942 r=-1;
3943 break;
3944 }
3945 }
3946 Py_DECREF(instdict);
3947 }
3948 else r=-1;
3949
3950 Py_XDECREF(value);
3951
3952 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953}
3954
3955
3956static int
Tim Peterscba30e22003-02-01 06:24:36 +00003957load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003958{
3959 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 /* Note that we split the (pickle.py) stack into two stacks, an
3962 object stack and a mark stack. Here we push a mark onto the
3963 mark stack.
3964 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966 if ((self->num_marks + 1) >= self->marks_size) {
3967 s=self->marks_size+20;
3968 if (s <= self->num_marks) s=self->num_marks + 1;
3969 if (self->marks == NULL)
3970 self->marks=(int *)malloc(s * sizeof(int));
3971 else
Tim Peterscba30e22003-02-01 06:24:36 +00003972 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 s * sizeof(int));
3974 if (! self->marks) {
3975 PyErr_NoMemory();
3976 return -1;
3977 }
3978 self->marks_size = s;
3979 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984}
3985
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986static int
Tim Peterscba30e22003-02-01 06:24:36 +00003987load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988{
3989 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991 PDATA_POP(self->stack, arg_tup);
3992 if (! arg_tup) return -1;
3993 PDATA_POP(self->stack, callable);
3994 if (callable) {
3995 ob = Instance_New(callable, arg_tup);
3996 Py_DECREF(callable);
3997 }
3998 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 PDATA_PUSH(self->stack, ob, -1);
4003 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004004}
Tim Peters84e87f32001-03-17 04:50:51 +00004005
Tim Peters4190fb82003-02-02 16:09:05 +00004006/* Just raises an error if we don't know the protocol specified. PROTO
4007 * is the first opcode for protocols >= 2.
4008 */
4009static int
4010load_proto(Unpicklerobject *self)
4011{
4012 int i;
4013 char *protobyte;
4014
4015 i = self->read_func(self, &protobyte, 1);
4016 if (i < 0)
4017 return -1;
4018
4019 i = calc_binint(protobyte, 1);
4020 /* No point checking for < 0, since calc_binint returns an unsigned
4021 * int when chewing on 1 byte.
4022 */
4023 assert(i >= 0);
4024 if (i <= CURRENT_PROTOCOL_NUMBER)
4025 return 0;
4026
4027 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4028 return -1;
4029}
4030
Guido van Rossum60456fd1997-04-09 17:36:32 +00004031static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004032load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004033{
4034 PyObject *err = 0, *val = 0;
4035 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037 self->num_marks = 0;
4038 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004041 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 switch (s[0]) {
4045 case NONE:
4046 if (load_none(self) < 0)
4047 break;
4048 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004050 case BININT:
4051 if (load_binint(self) < 0)
4052 break;
4053 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 case BININT1:
4056 if (load_binint1(self) < 0)
4057 break;
4058 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004060 case BININT2:
4061 if (load_binint2(self) < 0)
4062 break;
4063 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 case INT:
4066 if (load_int(self) < 0)
4067 break;
4068 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 case LONG:
4071 if (load_long(self) < 0)
4072 break;
4073 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004074
Tim Petersee1a53c2003-02-02 02:57:53 +00004075 case LONG1:
4076 if (load_counted_long(self, 1) < 0)
4077 break;
4078 continue;
4079
4080 case LONG4:
4081 if (load_counted_long(self, 4) < 0)
4082 break;
4083 continue;
4084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085 case FLOAT:
4086 if (load_float(self) < 0)
4087 break;
4088 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 case BINFLOAT:
4091 if (load_binfloat(self) < 0)
4092 break;
4093 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 case BINSTRING:
4096 if (load_binstring(self) < 0)
4097 break;
4098 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100 case SHORT_BINSTRING:
4101 if (load_short_binstring(self) < 0)
4102 break;
4103 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 case STRING:
4106 if (load_string(self) < 0)
4107 break;
4108 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004109
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004110#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004111 case UNICODE:
4112 if (load_unicode(self) < 0)
4113 break;
4114 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 case BINUNICODE:
4117 if (load_binunicode(self) < 0)
4118 break;
4119 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004120#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004123 if (load_counted_tuple(self, 0) < 0)
4124 break;
4125 continue;
4126
4127 case TUPLE1:
4128 if (load_counted_tuple(self, 1) < 0)
4129 break;
4130 continue;
4131
4132 case TUPLE2:
4133 if (load_counted_tuple(self, 2) < 0)
4134 break;
4135 continue;
4136
4137 case TUPLE3:
4138 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 break;
4140 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case TUPLE:
4143 if (load_tuple(self) < 0)
4144 break;
4145 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case EMPTY_LIST:
4148 if (load_empty_list(self) < 0)
4149 break;
4150 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case LIST:
4153 if (load_list(self) < 0)
4154 break;
4155 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case EMPTY_DICT:
4158 if (load_empty_dict(self) < 0)
4159 break;
4160 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case DICT:
4163 if (load_dict(self) < 0)
4164 break;
4165 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case OBJ:
4168 if (load_obj(self) < 0)
4169 break;
4170 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case INST:
4173 if (load_inst(self) < 0)
4174 break;
4175 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 case GLOBAL:
4178 if (load_global(self) < 0)
4179 break;
4180 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case APPEND:
4183 if (load_append(self) < 0)
4184 break;
4185 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case APPENDS:
4188 if (load_appends(self) < 0)
4189 break;
4190 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case BUILD:
4193 if (load_build(self) < 0)
4194 break;
4195 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case DUP:
4198 if (load_dup(self) < 0)
4199 break;
4200 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case BINGET:
4203 if (load_binget(self) < 0)
4204 break;
4205 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case LONG_BINGET:
4208 if (load_long_binget(self) < 0)
4209 break;
4210 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case GET:
4213 if (load_get(self) < 0)
4214 break;
4215 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case MARK:
4218 if (load_mark(self) < 0)
4219 break;
4220 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 case BINPUT:
4223 if (load_binput(self) < 0)
4224 break;
4225 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227 case LONG_BINPUT:
4228 if (load_long_binput(self) < 0)
4229 break;
4230 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case PUT:
4233 if (load_put(self) < 0)
4234 break;
4235 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case POP:
4238 if (load_pop(self) < 0)
4239 break;
4240 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case POP_MARK:
4243 if (load_pop_mark(self) < 0)
4244 break;
4245 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case SETITEM:
4248 if (load_setitem(self) < 0)
4249 break;
4250 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252 case SETITEMS:
4253 if (load_setitems(self) < 0)
4254 break;
4255 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 case STOP:
4258 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case PERSID:
4261 if (load_persid(self) < 0)
4262 break;
4263 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 case BINPERSID:
4266 if (load_binpersid(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 REDUCE:
4271 if (load_reduce(self) < 0)
4272 break;
4273 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274
Tim Peters4190fb82003-02-02 16:09:05 +00004275 case PROTO:
4276 if (load_proto(self) < 0)
4277 break;
4278 continue;
4279
Tim Peters3c67d792003-02-02 17:59:11 +00004280 case NEWTRUE:
4281 if (load_bool(self, Py_True) < 0)
4282 break;
4283 continue;
4284
4285 case NEWFALSE:
4286 if (load_bool(self, Py_False) < 0)
4287 break;
4288 continue;
4289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 case '\0':
4291 /* end of file */
4292 PyErr_SetNone(PyExc_EOFError);
4293 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004296 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004297 "invalid load key, '%s'.",
4298 "c", s[0]);
4299 return NULL;
4300 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004302 break;
4303 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004305 if ((err = PyErr_Occurred())) {
4306 if (err == PyExc_EOFError) {
4307 PyErr_SetNone(PyExc_EOFError);
4308 }
4309 return NULL;
4310 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 PDATA_POP(self->stack, val);
4313 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004314}
Tim Peters84e87f32001-03-17 04:50:51 +00004315
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004317/* No-load functions to support noload, which is used to
4318 find persistent references. */
4319
4320static int
Tim Peterscba30e22003-02-01 06:24:36 +00004321noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322{
4323 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 if ((i = marker(self)) < 0) return -1;
4326 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004327}
4328
4329
4330static int
Tim Peterscba30e22003-02-01 06:24:36 +00004331noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332{
4333 int i;
4334 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 if ((i = marker(self)) < 0) return -1;
4337 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004338 if (self->readline_func(self, &s) < 0) return -1;
4339 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 PDATA_APPEND(self->stack, Py_None,-1);
4341 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004342}
4343
4344static int
Tim Peterscba30e22003-02-01 06:24:36 +00004345noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346{
4347 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004348
Tim Peters0bc93f52003-02-02 18:29:33 +00004349 if (self->readline_func(self, &s) < 0) return -1;
4350 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 PDATA_APPEND(self->stack, Py_None,-1);
4352 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004353}
4354
4355static int
Tim Peterscba30e22003-02-01 06:24:36 +00004356noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 if (self->stack->length < 2) return stackUnderflow();
4360 Pdata_clear(self->stack, self->stack->length-2);
4361 PDATA_APPEND(self->stack, Py_None,-1);
4362 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004363}
4364
4365static int
4366noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004367
Guido van Rossum053b8df1998-11-25 16:18:00 +00004368 if (self->stack->length < 1) return stackUnderflow();
4369 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004370 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004371}
4372
4373
4374static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004375noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376{
4377 PyObject *err = 0, *val = 0;
4378 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 self->num_marks = 0;
4381 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004384 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 switch (s[0]) {
4388 case NONE:
4389 if (load_none(self) < 0)
4390 break;
4391 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 case BININT:
4394 if (load_binint(self) < 0)
4395 break;
4396 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398 case BININT1:
4399 if (load_binint1(self) < 0)
4400 break;
4401 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 case BININT2:
4404 if (load_binint2(self) < 0)
4405 break;
4406 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004408 case INT:
4409 if (load_int(self) < 0)
4410 break;
4411 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 case LONG:
4414 if (load_long(self) < 0)
4415 break;
4416 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004417
Tim Peters4190fb82003-02-02 16:09:05 +00004418 case LONG1:
4419 if (load_counted_long(self, 1) < 0)
4420 break;
4421 continue;
4422
4423 case LONG4:
4424 if (load_counted_long(self, 4) < 0)
4425 break;
4426 continue;
4427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 case FLOAT:
4429 if (load_float(self) < 0)
4430 break;
4431 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 case BINFLOAT:
4434 if (load_binfloat(self) < 0)
4435 break;
4436 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 case BINSTRING:
4439 if (load_binstring(self) < 0)
4440 break;
4441 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 case SHORT_BINSTRING:
4444 if (load_short_binstring(self) < 0)
4445 break;
4446 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 case STRING:
4449 if (load_string(self) < 0)
4450 break;
4451 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004452
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004453#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 case UNICODE:
4455 if (load_unicode(self) < 0)
4456 break;
4457 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 case BINUNICODE:
4460 if (load_binunicode(self) < 0)
4461 break;
4462 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004463#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004466 if (load_counted_tuple(self, 0) < 0)
4467 break;
4468 continue;
4469
4470 case TUPLE1:
4471 if (load_counted_tuple(self, 1) < 0)
4472 break;
4473 continue;
4474
4475 case TUPLE2:
4476 if (load_counted_tuple(self, 2) < 0)
4477 break;
4478 continue;
4479
4480 case TUPLE3:
4481 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 break;
4483 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485 case TUPLE:
4486 if (load_tuple(self) < 0)
4487 break;
4488 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 case EMPTY_LIST:
4491 if (load_empty_list(self) < 0)
4492 break;
4493 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 case LIST:
4496 if (load_list(self) < 0)
4497 break;
4498 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 case EMPTY_DICT:
4501 if (load_empty_dict(self) < 0)
4502 break;
4503 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 case DICT:
4506 if (load_dict(self) < 0)
4507 break;
4508 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 case OBJ:
4511 if (noload_obj(self) < 0)
4512 break;
4513 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515 case INST:
4516 if (noload_inst(self) < 0)
4517 break;
4518 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 case GLOBAL:
4521 if (noload_global(self) < 0)
4522 break;
4523 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 case APPEND:
4526 if (load_append(self) < 0)
4527 break;
4528 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 case APPENDS:
4531 if (load_appends(self) < 0)
4532 break;
4533 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535 case BUILD:
4536 if (noload_build(self) < 0)
4537 break;
4538 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 case DUP:
4541 if (load_dup(self) < 0)
4542 break;
4543 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 case BINGET:
4546 if (load_binget(self) < 0)
4547 break;
4548 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 case LONG_BINGET:
4551 if (load_long_binget(self) < 0)
4552 break;
4553 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 case GET:
4556 if (load_get(self) < 0)
4557 break;
4558 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 case MARK:
4561 if (load_mark(self) < 0)
4562 break;
4563 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004565 case BINPUT:
4566 if (load_binput(self) < 0)
4567 break;
4568 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004570 case LONG_BINPUT:
4571 if (load_long_binput(self) < 0)
4572 break;
4573 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 case PUT:
4576 if (load_put(self) < 0)
4577 break;
4578 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 case POP:
4581 if (load_pop(self) < 0)
4582 break;
4583 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 case POP_MARK:
4586 if (load_pop_mark(self) < 0)
4587 break;
4588 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 case SETITEM:
4591 if (load_setitem(self) < 0)
4592 break;
4593 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 case SETITEMS:
4596 if (load_setitems(self) < 0)
4597 break;
4598 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 case STOP:
4601 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 case PERSID:
4604 if (load_persid(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 BINPERSID:
4609 if (load_binpersid(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 REDUCE:
4614 if (noload_reduce(self) < 0)
4615 break;
4616 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004617
Tim Peters4190fb82003-02-02 16:09:05 +00004618 case PROTO:
4619 if (load_proto(self) < 0)
4620 break;
4621 continue;
4622
Tim Peters3c67d792003-02-02 17:59:11 +00004623 case NEWTRUE:
4624 if (load_bool(self, Py_True) < 0)
4625 break;
4626 continue;
4627
4628 case NEWFALSE:
4629 if (load_bool(self, Py_False) < 0)
4630 break;
4631 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004632 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004633 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634 "invalid load key, '%s'.",
4635 "c", s[0]);
4636 return NULL;
4637 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004639 break;
4640 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642 if ((err = PyErr_Occurred())) {
4643 if (err == PyExc_EOFError) {
4644 PyErr_SetNone(PyExc_EOFError);
4645 }
4646 return NULL;
4647 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004649 PDATA_POP(self->stack, val);
4650 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651}
Tim Peters84e87f32001-03-17 04:50:51 +00004652
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653
Guido van Rossum60456fd1997-04-09 17:36:32 +00004654static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004655Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004656{
Tim Peterscba30e22003-02-01 06:24:36 +00004657 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004661}
4662
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004663static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004664Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665{
Tim Peterscba30e22003-02-01 06:24:36 +00004666 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670}
4671
Guido van Rossum60456fd1997-04-09 17:36:32 +00004672
4673static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004674 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004675 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004676 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004677 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004678 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004679 "noload() -- not load a pickle, but go through most of the motions\n"
4680 "\n"
4681 "This function can be used to read past a pickle without instantiating\n"
4682 "any objects or importing any modules. It can also be used to find all\n"
4683 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004684 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004685 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004686 {NULL, NULL} /* sentinel */
4687};
4688
4689
4690static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004691newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692{
4693 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694
Tim Peterscba30e22003-02-01 06:24:36 +00004695 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 self->file = NULL;
4699 self->arg = NULL;
4700 self->stack = (Pdata*)Pdata_New();
4701 self->pers_func = NULL;
4702 self->last_string = NULL;
4703 self->marks = NULL;
4704 self->num_marks = 0;
4705 self->marks_size = 0;
4706 self->buf_size = 0;
4707 self->read = NULL;
4708 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Tim Peterscba30e22003-02-01 06:24:36 +00004711 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 Py_INCREF(f);
4715 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 /* Set read, readline based on type of f */
4718 if (PyFile_Check(f)) {
4719 self->fp = PyFile_AsFile(f);
4720 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004721 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 "I/O operation on closed file");
4723 goto err;
4724 }
4725 self->read_func = read_file;
4726 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004727 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 else if (PycStringIO_InputCheck(f)) {
4729 self->fp = NULL;
4730 self->read_func = read_cStringIO;
4731 self->readline_func = readline_cStringIO;
4732 }
4733 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 self->fp = NULL;
4736 self->read_func = read_other;
4737 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4740 (self->read = PyObject_GetAttr(f, read_str)))) {
4741 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004742 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 "argument must have 'read' and "
4744 "'readline' attributes" );
4745 goto err;
4746 }
4747 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 err:
4752 Py_DECREF((PyObject *)self);
4753 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004754}
4755
4756
4757static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004758get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759{
4760 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004761
Tim Peterscba30e22003-02-01 06:24:36 +00004762 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 return NULL;
4764 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004765}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004766
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004767
Guido van Rossum60456fd1997-04-09 17:36:32 +00004768static void
Tim Peterscba30e22003-02-01 06:24:36 +00004769Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004770{
4771 Py_XDECREF(self->readline);
4772 Py_XDECREF(self->read);
4773 Py_XDECREF(self->file);
4774 Py_XDECREF(self->memo);
4775 Py_XDECREF(self->stack);
4776 Py_XDECREF(self->pers_func);
4777 Py_XDECREF(self->arg);
4778 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780 if (self->marks) {
4781 free(self->marks);
4782 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 if (self->buf_size) {
4785 free(self->buf);
4786 }
Tim Peters84e87f32001-03-17 04:50:51 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004789}
4790
4791
4792static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004793Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794{
4795 if (!strcmp(name, "persistent_load")) {
4796 if (!self->pers_func) {
4797 PyErr_SetString(PyExc_AttributeError, name);
4798 return NULL;
4799 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 Py_INCREF(self->pers_func);
4802 return self->pers_func;
4803 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805 if (!strcmp(name, "find_global")) {
4806 if (!self->find_class) {
4807 PyErr_SetString(PyExc_AttributeError, name);
4808 return NULL;
4809 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 Py_INCREF(self->find_class);
4812 return self->find_class;
4813 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815 if (!strcmp(name, "memo")) {
4816 if (!self->memo) {
4817 PyErr_SetString(PyExc_AttributeError, name);
4818 return NULL;
4819 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004821 Py_INCREF(self->memo);
4822 return self->memo;
4823 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825 if (!strcmp(name, "UnpicklingError")) {
4826 Py_INCREF(UnpicklingError);
4827 return UnpicklingError;
4828 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004830 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004831}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004832
Guido van Rossum60456fd1997-04-09 17:36:32 +00004833
4834static int
Tim Peterscba30e22003-02-01 06:24:36 +00004835Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 if (!strcmp(name, "persistent_load")) {
4839 Py_XDECREF(self->pers_func);
4840 self->pers_func = value;
4841 Py_XINCREF(value);
4842 return 0;
4843 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845 if (!strcmp(name, "find_global")) {
4846 Py_XDECREF(self->find_class);
4847 self->find_class = value;
4848 Py_XINCREF(value);
4849 return 0;
4850 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 if (! value) {
4853 PyErr_SetString(PyExc_TypeError,
4854 "attribute deletion is not supported");
4855 return -1;
4856 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 if (strcmp(name, "memo") == 0) {
4859 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004860 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004861 "memo must be a dictionary");
4862 return -1;
4863 }
4864 Py_XDECREF(self->memo);
4865 self->memo = value;
4866 Py_INCREF(value);
4867 return 0;
4868 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004870 PyErr_SetString(PyExc_AttributeError, name);
4871 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004872}
4873
Tim Peters5bd2a792003-02-01 16:45:06 +00004874/* ---------------------------------------------------------------------------
4875 * Module-level functions.
4876 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004877
Tim Peters5bd2a792003-02-01 16:45:06 +00004878/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004879static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004880cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004881{
4882 PyObject *ob, *file, *res = NULL;
4883 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004884 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004885
Tim Peters5bd2a792003-02-01 16:45:06 +00004886 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004887 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004888
Tim Peters5bd2a792003-02-01 16:45:06 +00004889 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004890 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 if (dump(pickler, ob) < 0)
4893 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004895 Py_INCREF(Py_None);
4896 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 finally:
4899 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004901 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004902}
4903
4904
Tim Peters5bd2a792003-02-01 16:45:06 +00004905/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004906static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004907cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908{
4909 PyObject *ob, *file = 0, *res = NULL;
4910 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004911 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004912
Tim Peters5bd2a792003-02-01 16:45:06 +00004913 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004915
Tim Peterscba30e22003-02-01 06:24:36 +00004916 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004917 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004918
Tim Peters5bd2a792003-02-01 16:45:06 +00004919 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004920 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 if (dump(pickler, ob) < 0)
4923 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004925 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004927 finally:
4928 Py_XDECREF(pickler);
4929 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004931 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004932}
4933
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004934
Tim Peters5bd2a792003-02-01 16:45:06 +00004935/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004936static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004937cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938{
4939 Unpicklerobject *unpickler = 0;
4940 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004941
Tim Peterscba30e22003-02-01 06:24:36 +00004942 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004943 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004944
Tim Peterscba30e22003-02-01 06:24:36 +00004945 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004950 finally:
4951 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004954}
4955
4956
Tim Peters5bd2a792003-02-01 16:45:06 +00004957/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004958static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004959cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004960{
4961 PyObject *ob, *file = 0, *res = NULL;
4962 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004963
Tim Peterscba30e22003-02-01 06:24:36 +00004964 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004966
Tim Peterscba30e22003-02-01 06:24:36 +00004967 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004968 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004969
Tim Peterscba30e22003-02-01 06:24:36 +00004970 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004975 finally:
4976 Py_XDECREF(file);
4977 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004980}
4981
4982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004983PyDoc_STRVAR(Unpicklertype__doc__,
4984"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004985
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004986static PyTypeObject Unpicklertype = {
4987 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004988 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004989 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004990 sizeof(Unpicklerobject), /*tp_basicsize*/
4991 0, /*tp_itemsize*/
4992 /* methods */
4993 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4994 (printfunc)0, /*tp_print*/
4995 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4996 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4997 (cmpfunc)0, /*tp_compare*/
4998 (reprfunc)0, /*tp_repr*/
4999 0, /*tp_as_number*/
5000 0, /*tp_as_sequence*/
5001 0, /*tp_as_mapping*/
5002 (hashfunc)0, /*tp_hash*/
5003 (ternaryfunc)0, /*tp_call*/
5004 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005005
Guido van Rossum60456fd1997-04-09 17:36:32 +00005006 /* Space for future expansion */
5007 0L,0L,0L,0L,
5008 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005009};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005010
Guido van Rossum60456fd1997-04-09 17:36:32 +00005011static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005012 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005013 PyDoc_STR("dump(object, file, proto=0) -- "
5014 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005015 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005016 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005017 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005018
Neal Norwitzb0493252002-03-31 14:44:22 +00005019 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005020 PyDoc_STR("dumps(object, proto=0) -- "
5021 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005022 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005023 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005024 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005025
Neal Norwitzb0493252002-03-31 14:44:22 +00005026 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005027 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005028
Neal Norwitzb0493252002-03-31 14:44:22 +00005029 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005030 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005031
Neal Norwitzb0493252002-03-31 14:44:22 +00005032 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005033 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005034 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005035 "This takes a file-like object for writing a pickle data stream.\n"
5036 "The optional proto argument tells the pickler to use the given\n"
5037 "protocol; supported protocols are 0, 1, 2. The default\n"
5038 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5039 "only protocol that can be written to a file opened in text\n"
5040 "mode and read back successfully. When using a protocol higher\n"
5041 "than 0, make sure the file is opened in binary mode, both when\n"
5042 "pickling and unpickling.)\n"
5043 "\n"
5044 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5045 "more efficient than protocol 1.\n"
5046 "\n"
5047 "Specifying a negative protocol version selects the highest\n"
5048 "protocol version supported. The higher the protocol used, the\n"
5049 "more recent the version of Python needed to read the pickle\n"
5050 "produced.\n"
5051 "\n"
5052 "The file parameter must have a write() method that accepts a single\n"
5053 "string argument. It can thus be an open file object, a StringIO\n"
5054 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005055 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005056
Neal Norwitzb0493252002-03-31 14:44:22 +00005057 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005058 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5059
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005060 { NULL, NULL }
5061};
5062
Guido van Rossum60456fd1997-04-09 17:36:32 +00005063static int
Tim Peterscba30e22003-02-01 06:24:36 +00005064init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005065{
5066 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005067
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005068#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005070 INIT_STR(__class__);
5071 INIT_STR(__getinitargs__);
5072 INIT_STR(__dict__);
5073 INIT_STR(__getstate__);
5074 INIT_STR(__setstate__);
5075 INIT_STR(__name__);
5076 INIT_STR(__main__);
5077 INIT_STR(__reduce__);
5078 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005079 INIT_STR(append);
5080 INIT_STR(read);
5081 INIT_STR(readline);
5082 INIT_STR(copy_reg);
5083 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005084 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005085
Tim Peterscba30e22003-02-01 06:24:36 +00005086 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005088
Tim Peters1f1b2d22003-02-01 02:16:37 +00005089 /* This is special because we want to use a different
5090 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005091 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005092 if (!dispatch_table) return -1;
5093
5094 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005095 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005096 if (!extension_registry) return -1;
5097
5098 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005099 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005100 if (!inverted_registry) return -1;
5101
5102 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005103 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005104 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005106 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005107
Tim Peterscba30e22003-02-01 06:24:36 +00005108 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005109 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005111 /* Ugh */
5112 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5113 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5114 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005116 if (!( t=PyDict_New())) return -1;
5117 if (!( r=PyRun_String(
5118 "def __init__(self, *args): self.args=args\n\n"
5119 "def __str__(self):\n"
5120 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5121 Py_file_input,
5122 module_dict, t) )) return -1;
5123 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005126 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005127 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005130
Tim Peterscba30e22003-02-01 06:24:36 +00005131 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005133 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005134 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005136 if (!( t=PyDict_New())) return -1;
5137 if (!( r=PyRun_String(
5138 "def __init__(self, *args): self.args=args\n\n"
5139 "def __str__(self):\n"
5140 " a=self.args\n"
5141 " a=a and type(a[0]) or '(what)'\n"
5142 " return 'Cannot pickle %s objects' % a\n"
5143 , Py_file_input,
5144 module_dict, t) )) return -1;
5145 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005147 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005148 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005149 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005151 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005154 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005155 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005156
Martin v. Löwis658009a2002-09-16 17:26:24 +00005157 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5158 UnpicklingError, NULL)))
5159 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005161 if (PyDict_SetItemString(module_dict, "PickleError",
5162 PickleError) < 0)
5163 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005165 if (PyDict_SetItemString(module_dict, "PicklingError",
5166 PicklingError) < 0)
5167 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005169 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5170 UnpicklingError) < 0)
5171 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005173 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5174 UnpickleableError) < 0)
5175 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005177 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5178 BadPickleGet) < 0)
5179 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005181 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005183 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005184}
5185
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005186#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5187#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005188#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005189PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005190initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005191{
5192 PyObject *m, *d, *di, *v, *k;
5193 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005194 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 PyObject *format_version;
5196 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005198 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005199 Unpicklertype.ob_type = &PyType_Type;
5200 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005202 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005203 * so we're forced to use a temporary dictionary. :(
5204 */
5205 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005206 if (!di) return;
5207 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005209 /* Create the module and add the functions */
5210 m = Py_InitModule4("cPickle", cPickle_methods,
5211 cPickle_module_documentation,
5212 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 /* Add some symbolic constants to the module */
5215 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005216 v = PyString_FromString(rev);
5217 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005218 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005220 /* Copy data from di. Waaa. */
5221 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5222 if (PyObject_SetItem(d, k, v) < 0) {
5223 Py_DECREF(di);
5224 return;
5225 }
5226 }
5227 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005228
Tim Peters5b7da392003-02-04 00:21:07 +00005229 /* These are purely informational; no code uses them. */
5230 /* File format version we write. */
5231 format_version = PyString_FromString("2.0");
5232 /* Format versions we can read. */
5233 compatible_formats = Py_BuildValue("[sssss]",
5234 "1.0", /* Original protocol 0 */
5235 "1.1", /* Protocol 0 + INST */
5236 "1.2", /* Original protocol 1 */
5237 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005238 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 PyDict_SetItemString(d, "format_version", format_version);
5240 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5241 Py_XDECREF(format_version);
5242 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005243}