blob: 1757ad4134c285e6cc68f62f8c4cef7d7d4b4633 [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,
6"C implementation and optimization of the Python pickle module\n"
7"\n"
8"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n");
9
Guido van Rossum142eeb81997-08-13 03:14:41 +000010#ifndef Py_eval_input
11#include <graminit.h>
12#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000013#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000014
Guido van Rossum2f4caa41997-01-06 22:59:08 +000015#include <errno.h>
16
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000017
Guido van Rossum2f4caa41997-01-06 22:59:08 +000018
Guido van Rossum60456fd1997-04-09 17:36:32 +000019#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000020
Guido van Rossum60456fd1997-04-09 17:36:32 +000021#define WRITE_BUF_SIZE 256
22
Tim Peters797ec242003-02-01 06:22:36 +000023/*
24 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
25 * docs are in pickletools.py.
26 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000027#define MARK '('
28#define STOP '.'
29#define POP '0'
30#define POP_MARK '1'
31#define DUP '2'
32#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000033#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000034#define INT 'I'
35#define BININT 'J'
36#define BININT1 'K'
37#define LONG 'L'
38#define BININT2 'M'
39#define NONE 'N'
40#define PERSID 'P'
41#define BINPERSID 'Q'
42#define REDUCE 'R'
43#define STRING 'S'
44#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000045#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000046#define UNICODE 'V'
47#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000048#define APPEND 'a'
49#define BUILD 'b'
50#define GLOBAL 'c'
51#define DICT 'd'
52#define EMPTY_DICT '}'
53#define APPENDS 'e'
54#define GET 'g'
55#define BINGET 'h'
56#define INST 'i'
57#define LONG_BINGET 'j'
58#define LIST 'l'
59#define EMPTY_LIST ']'
60#define OBJ 'o'
61#define PUT 'p'
62#define BINPUT 'q'
63#define LONG_BINPUT 'r'
64#define SETITEM 's'
65#define TUPLE 't'
66#define EMPTY_TUPLE ')'
67#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000068
69/* Protocol 2. */
70#define PROTO '\x80' /* identify pickle protocol */
71#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
72#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
73#define EXT2 '\x83' /* ditto, but 2-byte index */
74#define EXT4 '\x84' /* ditto, but 4-byte index */
75#define TUPLE1 '\x85' /* build 1-tuple from stack top */
76#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
77#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
78#define NEWTRUE '\x88' /* push True */
79#define NEWFALSE '\x89' /* push False */
80#define LONG1 '\x8a' /* push long from < 256 bytes */
81#define LONG4 '\x8b' /* push really big long */
82
83/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
84 * so that unpicklers written before bools were introduced unpickle them
85 * as ints, but unpicklers after can recognize that bools were intended.
86 * Note that protocol 2 added direct ways to pickle bools.
87 */
Jack Jansen3a967022002-06-26 20:40:42 +000088#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000089#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000090#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000091#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000092
Guido van Rossum60456fd1997-04-09 17:36:32 +000093static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000094
Guido van Rossumc03158b1999-06-09 15:23:31 +000095static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000096static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000097static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000099static PyObject *BadPickleGet;
100
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000101
Guido van Rossum60456fd1997-04-09 17:36:32 +0000102static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000103static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000104
Guido van Rossum60456fd1997-04-09 17:36:32 +0000105static PyObject *__class___str, *__getinitargs___str, *__dict___str,
106 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000107 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000108 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000109 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000110
Guido van Rossum053b8df1998-11-25 16:18:00 +0000111/*************************************************************************
112 Internal Data type for pickle data. */
113
114typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000115 PyObject_HEAD
116 int length, size;
117 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000118} Pdata;
119
Tim Peters84e87f32001-03-17 04:50:51 +0000120static void
Tim Peterscba30e22003-02-01 06:24:36 +0000121Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000122{
123 int i;
124 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000126 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000128 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000130 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000131}
132
133static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000134 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
135 (destructor)Pdata_dealloc,
136 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137};
138
139#define Pdata_Check(O) ((O)->ob_type == &PdataType)
140
141static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000142Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000143{
144 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000146 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
147 self->size=8;
148 self->length=0;
149 self->data=malloc(self->size * sizeof(PyObject*));
150 if (self->data) return (PyObject*)self;
151 Py_DECREF(self);
152 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000153}
154
Tim Peters84e87f32001-03-17 04:50:51 +0000155static int
Tim Peterscba30e22003-02-01 06:24:36 +0000156stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000157{
158 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
159 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000160}
161
162static int
Tim Peterscba30e22003-02-01 06:24:36 +0000163Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000164{
165 int i;
166 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 if (clearto < 0) return stackUnderflow();
169 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000171 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
172 Py_DECREF(*p);
173 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000175 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000176}
177
178
Tim Peters84e87f32001-03-17 04:50:51 +0000179static int
Tim Peterscba30e22003-02-01 06:24:36 +0000180Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000181{
182 if (! self->size) {
183 PyErr_NoMemory();
184 return -1;
185 }
186 self->size *= 2;
187 self->data = realloc(self->data, self->size*sizeof(PyObject*));
188 if (! self->data) {
189 self->size = 0;
190 PyErr_NoMemory();
191 return -1;
192 }
193 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000194}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
196#define PDATA_POP(D,V) { \
197 if ((D)->length) V=D->data[--((D)->length)]; \
198 else { \
199 PyErr_SetString(UnpicklingError, "bad pickle data"); \
200 V=NULL; \
201 } \
202}
203
204
205static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000206Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000207{
208 PyObject *r;
209 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000211 l=self->length-start;
212 if (!( r=PyTuple_New(l))) return NULL;
213 for (i=start, j=0 ; j < l; i++, j++)
214 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000216 self->length=start;
217 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000218}
219
220static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000221Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000222{
223 PyObject *r;
224 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 l=self->length-start;
227 if (!( r=PyList_New(l))) return NULL;
228 for (i=start, j=0 ; j < l; i++, j++)
229 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000231 self->length=start;
232 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000233}
234
Guido van Rossum053b8df1998-11-25 16:18:00 +0000235#define PDATA_APPEND(D,O,ER) { \
236 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
237 Pdata_grow((Pdata*)(D)) < 0) \
238 return ER; \
239 Py_INCREF(O); \
240 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
241}
242
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/*************************************************************************/
253
254#define ARG_TUP(self, o) { \
255 if (self->arg || (self->arg=PyTuple_New(1))) { \
256 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
257 PyTuple_SET_ITEM(self->arg,0,o); \
258 } \
259 else { \
260 Py_DECREF(o); \
261 } \
262}
263
264#define FREE_ARG_TUP(self) { \
265 if (self->arg->ob_refcnt > 1) { \
266 Py_DECREF(self->arg); \
267 self->arg=NULL; \
268 } \
269 }
270
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000271typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000272 PyObject_HEAD
273 FILE *fp;
274 PyObject *write;
275 PyObject *file;
276 PyObject *memo;
277 PyObject *arg;
278 PyObject *pers_func;
279 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000280
281 /* pickle protocol number, >= 0 */
282 int proto;
283
284 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000287 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000288 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000289 int (*write_func)(struct Picklerobject *, char *, int);
290 char *write_buf;
291 int buf_size;
292 PyObject *dispatch_table;
293 int fast_container; /* count nested container dumps */
294 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000295} Picklerobject;
296
Barry Warsaw52acb492001-12-21 20:04:22 +0000297#ifndef PY_CPICKLE_FAST_LIMIT
298#define PY_CPICKLE_FAST_LIMIT 50
299#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000300
Jeremy Hylton938ace62002-07-17 16:30:39 +0000301static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000302
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000303typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000304 PyObject_HEAD
305 FILE *fp;
306 PyObject *file;
307 PyObject *readline;
308 PyObject *read;
309 PyObject *memo;
310 PyObject *arg;
311 Pdata *stack;
312 PyObject *mark;
313 PyObject *pers_func;
314 PyObject *last_string;
315 int *marks;
316 int num_marks;
317 int marks_size;
318 int (*read_func)(struct Unpicklerobject *, char **, int);
319 int (*readline_func)(struct Unpicklerobject *, char **);
320 int buf_size;
321 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000322 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000323} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000324
Jeremy Hylton938ace62002-07-17 16:30:39 +0000325static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000326
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000327/* Forward decls that need the above structs */
328static int save(Picklerobject *, PyObject *, int);
329static int put2(Picklerobject *, PyObject *);
330
Tim Peters84e87f32001-03-17 04:50:51 +0000331int
Tim Peterscba30e22003-02-01 06:24:36 +0000332cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000333{
334 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000336 if ((v = PyObject_GetItem(o,key))) {
337 Py_DECREF(v);
338 return 1;
339 }
Tim Peterscba30e22003-02-01 06:24:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 PyErr_Clear();
342 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000343}
344
Guido van Rossumd385d591997-04-09 17:47:47 +0000345static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000346PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000347cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
348{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000349 va_list va;
350 PyObject *args=0, *retval=0;
351 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000353 if (format) args = Py_VaBuildValue(format, va);
354 va_end(va);
355 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000356 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000357 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000359 if (retval) {
360 if (args) {
361 PyObject *v;
362 v=PyString_Format(retval, args);
363 Py_DECREF(retval);
364 Py_DECREF(args);
365 if (! v) return NULL;
366 retval=v;
367 }
368 }
369 else
370 if (args) retval=args;
371 else {
372 PyErr_SetObject(ErrType,Py_None);
373 return NULL;
374 }
375 PyErr_SetObject(ErrType,retval);
376 Py_DECREF(retval);
377 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000378}
379
Tim Peters84e87f32001-03-17 04:50:51 +0000380static int
Tim Peterscba30e22003-02-01 06:24:36 +0000381write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000382{
383 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000385 if (s == NULL) {
386 return 0;
387 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000390 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000392 if (nbyteswritten != (size_t)n) {
393 PyErr_SetFromErrno(PyExc_IOError);
394 return -1;
395 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000398}
399
Tim Peters84e87f32001-03-17 04:50:51 +0000400static int
Tim Peterscba30e22003-02-01 06:24:36 +0000401write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000402{
403 if (s == NULL) {
404 return 0;
405 }
Tim Peterscba30e22003-02-01 06:24:36 +0000406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000407 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
408 return -1;
409 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000411 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000412}
413
Tim Peters84e87f32001-03-17 04:50:51 +0000414static int
Tim Peterscba30e22003-02-01 06:24:36 +0000415write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000416{
417 if (s == NULL) return 0;
418 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000419}
420
Tim Peters84e87f32001-03-17 04:50:51 +0000421static int
Tim Peterscba30e22003-02-01 06:24:36 +0000422write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423{
424 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000426 if (s == NULL) {
427 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000428 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000430 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000431 return -1;
432 }
433 else {
434 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
435 if (write_other(self, NULL, 0) < 0)
436 return -1;
437 }
Tim Peterscba30e22003-02-01 06:24:36 +0000438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 if (n > WRITE_BUF_SIZE) {
440 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000441 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000442 return -1;
443 }
444 else {
445 memcpy(self->write_buf + self->buf_size, s, n);
446 self->buf_size += n;
447 return n;
448 }
449 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000451 if (self->write) {
452 /* object with write method */
453 ARG_TUP(self, py_str);
454 if (self->arg) {
455 junk = PyObject_Call(self->write, self->arg, NULL);
456 FREE_ARG_TUP(self);
457 }
458 if (junk) Py_DECREF(junk);
459 else return -1;
460 }
461 else
462 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 self->buf_size = 0;
465 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466}
467
468
Tim Peters84e87f32001-03-17 04:50:51 +0000469static int
Tim Peterscba30e22003-02-01 06:24:36 +0000470read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471{
472 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 if (self->buf_size == 0) {
475 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000477 size = ((n < 32) ? 32 : n);
478 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
479 PyErr_NoMemory();
480 return -1;
481 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000483 self->buf_size = size;
484 }
485 else if (n > self->buf_size) {
486 self->buf = (char *)realloc(self->buf, n * sizeof(char));
487 if (!self->buf) {
488 PyErr_NoMemory();
489 return -1;
490 }
Tim Peters84e87f32001-03-17 04:50:51 +0000491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 self->buf_size = n;
493 }
Tim Peters84e87f32001-03-17 04:50:51 +0000494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000495 Py_BEGIN_ALLOW_THREADS
496 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
497 Py_END_ALLOW_THREADS
498 if (nbytesread != (size_t)n) {
499 if (feof(self->fp)) {
500 PyErr_SetNone(PyExc_EOFError);
501 return -1;
502 }
Tim Peterscba30e22003-02-01 06:24:36 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 PyErr_SetFromErrno(PyExc_IOError);
505 return -1;
506 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000508 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000511}
512
513
Tim Peters84e87f32001-03-17 04:50:51 +0000514static int
Tim Peterscba30e22003-02-01 06:24:36 +0000515readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516{
517 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000519 if (self->buf_size == 0) {
520 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
521 PyErr_NoMemory();
522 return -1;
523 }
Tim Peters84e87f32001-03-17 04:50:51 +0000524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 self->buf_size = 40;
526 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528 i = 0;
529 while (1) {
530 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000531 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000532 (self->buf[i] = getc(self->fp)) == '\n') {
533 self->buf[i + 1] = '\0';
534 *s = self->buf;
535 return i + 1;
536 }
537 }
538 self->buf = (char *)realloc(self->buf,
539 (self->buf_size * 2) * sizeof(char));
540 if (!self->buf) {
541 PyErr_NoMemory();
542 return -1;
543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 self->buf_size *= 2;
546 }
Tim Peters84e87f32001-03-17 04:50:51 +0000547}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000548
549
Tim Peters84e87f32001-03-17 04:50:51 +0000550static int
Tim Peterscba30e22003-02-01 06:24:36 +0000551read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000552{
553 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000555 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
556 PyErr_SetNone(PyExc_EOFError);
557 return -1;
558 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563}
564
565
Tim Peters84e87f32001-03-17 04:50:51 +0000566static int
Tim Peterscba30e22003-02-01 06:24:36 +0000567readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568{
569 int n;
570 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000572 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
573 return -1;
574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000578 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579}
580
581
Tim Peters84e87f32001-03-17 04:50:51 +0000582static int
Tim Peterscba30e22003-02-01 06:24:36 +0000583read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000584{
585 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000587 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000589 ARG_TUP(self, bytes);
590 if (self->arg) {
591 str = PyObject_Call(self->read, self->arg, NULL);
592 FREE_ARG_TUP(self);
593 }
594 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 Py_XDECREF(self->last_string);
597 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000599 if (! (*s = PyString_AsString(str))) return -1;
600 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601}
602
603
Tim Peters84e87f32001-03-17 04:50:51 +0000604static int
Tim Peterscba30e22003-02-01 06:24:36 +0000605readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000606{
607 PyObject *str;
608 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
611 return -1;
612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 if ((str_size = PyString_Size(str)) < 0)
615 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 Py_XDECREF(self->last_string);
618 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620 if (! (*s = PyString_AsString(str)))
621 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000624}
625
626
627static char *
Tim Peterscba30e22003-02-01 06:24:36 +0000628pystrndup(char *s, int l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629{
630 char *r;
631 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
632 memcpy(r,s,l);
633 r[l]=0;
634 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635}
636
637
638static int
Tim Peterscba30e22003-02-01 06:24:36 +0000639get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640{
641 PyObject *value, *mv;
642 long c_value;
643 char s[30];
644 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000646 if (!( mv = PyDict_GetItem(self->memo, id))) {
647 PyErr_SetObject(PyExc_KeyError, id);
648 return -1;
649 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650
Tim Peterscba30e22003-02-01 06:24:36 +0000651 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000652 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (!( PyInt_Check(value))) {
655 PyErr_SetString(PicklingError, "no int where int expected in memo");
656 return -1;
657 }
658 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000660 if (!self->bin) {
661 s[0] = GET;
662 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
663 len = strlen(s);
664 }
665 else if (Pdata_Check(self->file)) {
666 if (write_other(self, NULL, 0) < 0) return -1;
667 PDATA_APPEND(self->file, mv, -1);
668 return 0;
669 }
670 else {
671 if (c_value < 256) {
672 s[0] = BINGET;
673 s[1] = (int)(c_value & 0xff);
674 len = 2;
675 }
676 else {
677 s[0] = LONG_BINGET;
678 s[1] = (int)(c_value & 0xff);
679 s[2] = (int)((c_value >> 8) & 0xff);
680 s[3] = (int)((c_value >> 16) & 0xff);
681 s[4] = (int)((c_value >> 24) & 0xff);
682 len = 5;
683 }
684 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000686 if ((*self->write_func)(self, s, len) < 0)
687 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000688
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000689 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000691
Guido van Rossum60456fd1997-04-09 17:36:32 +0000692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693static int
Tim Peterscba30e22003-02-01 06:24:36 +0000694put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000695{
Tim Peterscba30e22003-02-01 06:24:36 +0000696 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000697 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699 return put2(self, ob);
700}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000701
Guido van Rossum053b8df1998-11-25 16:18:00 +0000702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000703static int
Tim Peterscba30e22003-02-01 06:24:36 +0000704put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705{
706 char c_str[30];
707 int p;
708 size_t len;
709 int res = -1;
710 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000712 if (self->fast)
713 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if ((p = PyDict_Size(self->memo)) < 0)
716 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 /* Make sure memo keys are positive! */
Tim Peterscba30e22003-02-01 06:24:36 +0000719 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Tim Peterscba30e22003-02-01 06:24:36 +0000721 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723
Tim Peterscba30e22003-02-01 06:24:36 +0000724 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000725 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000726
Tim Peterscba30e22003-02-01 06:24:36 +0000727 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 PyTuple_SET_ITEM(t, 0, memo_len);
731 Py_INCREF(memo_len);
732 PyTuple_SET_ITEM(t, 1, ob);
733 Py_INCREF(ob);
734
735 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
736 goto finally;
737
738 if (!self->bin) {
739 c_str[0] = PUT;
740 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
741 len = strlen(c_str);
742 }
743 else if (Pdata_Check(self->file)) {
744 if (write_other(self, NULL, 0) < 0) return -1;
745 PDATA_APPEND(self->file, memo_len, -1);
746 res=0; /* Job well done ;) */
747 goto finally;
748 }
749 else {
750 if (p >= 256) {
751 c_str[0] = LONG_BINPUT;
752 c_str[1] = (int)(p & 0xff);
753 c_str[2] = (int)((p >> 8) & 0xff);
754 c_str[3] = (int)((p >> 16) & 0xff);
755 c_str[4] = (int)((p >> 24) & 0xff);
756 len = 5;
757 }
758 else {
759 c_str[0] = BINPUT;
760 c_str[1] = p;
761 len = 2;
762 }
763 }
764
765 if ((*self->write_func)(self, c_str, len) < 0)
766 goto finally;
767
768 res = 0;
769
770 finally:
771 Py_XDECREF(py_ob_id);
772 Py_XDECREF(memo_len);
773 Py_XDECREF(t);
774
775 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000776}
777
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000778#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000779
780static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000781PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000782{
783 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
784 static PyObject *standard_builtins=0;
785 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000787 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000788 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000790 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000792 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000793 return NULL;
794 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000796 if ((globals=PyEval_GetGlobals())) {
797 Py_INCREF(globals);
798 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000799 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000800 goto err;
801 }
802 else {
803 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000805 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000806 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000809 __builtins__=standard_builtins;
810 Py_INCREF(__builtins__);
811 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000812 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 goto err;
814 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 if (PyDict_Check(__builtins__)) {
817 __import__=PyObject_GetItem(__builtins__,__import___str);
818 if (!__import__) goto err;
819 }
820 else {
821 __import__=PyObject_GetAttr(__builtins__,__import___str);
822 if (!__import__) goto err;
823 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825 r=PyObject_CallFunction(__import__,"OOOO",
826 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000827 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000828 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830 Py_DECREF(globals);
831 Py_DECREF(__builtins__);
832 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834 return r;
835 err:
836 Py_XDECREF(globals);
837 Py_XDECREF(__builtins__);
838 Py_XDECREF(__import__);
839 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000840}
841
842static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000843whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844{
845 int i, j;
846 PyObject *module = 0, *modules_dict = 0,
847 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 module = PyObject_GetAttrString(global, "__module__");
850 if (module) return module;
851 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000852
Tim Peterscba30e22003-02-01 06:24:36 +0000853 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000854 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000856 i = 0;
857 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000861 global_name_attr = PyObject_GetAttr(module, global_name);
862 if (!global_name_attr) {
863 PyErr_Clear();
864 continue;
865 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 if (global_name_attr != global) {
868 Py_DECREF(global_name_attr);
869 continue;
870 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000872 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 break;
875 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 /* The following implements the rule in pickle.py added in 1.5
878 that used __main__ if no module is found. I don't actually
879 like this rule. jlf
880 */
881 if (!j) {
882 j=1;
883 name=__main___str;
884 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000886 Py_INCREF(name);
887 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000888}
889
890
Guido van Rossum60456fd1997-04-09 17:36:32 +0000891static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000892fast_save_enter(Picklerobject *self, PyObject *obj)
893{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 /* if fast_container < 0, we're doing an error exit. */
895 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
896 PyObject *key = NULL;
897 if (self->fast_memo == NULL) {
898 self->fast_memo = PyDict_New();
899 if (self->fast_memo == NULL) {
900 self->fast_container = -1;
901 return 0;
902 }
903 }
904 key = PyLong_FromVoidPtr(obj);
905 if (key == NULL)
906 return 0;
907 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000908 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000909 PyErr_Format(PyExc_ValueError,
910 "fast mode: can't pickle cyclic objects including object type %s at %p",
911 obj->ob_type->tp_name, obj);
912 self->fast_container = -1;
913 return 0;
914 }
915 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000916 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 self->fast_container = -1;
918 return 0;
919 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000920 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000921 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000923}
924
Tim Peterscba30e22003-02-01 06:24:36 +0000925int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000926fast_save_leave(Picklerobject *self, PyObject *obj)
927{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
929 PyObject *key = PyLong_FromVoidPtr(obj);
930 if (key == NULL)
931 return 0;
932 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000933 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000934 return 0;
935 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000936 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000937 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000938 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000939}
940
941static int
Tim Peterscba30e22003-02-01 06:24:36 +0000942save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000943{
944 static char none = NONE;
945 if ((*self->write_func)(self, &none, 1) < 0)
946 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000949}
950
Guido van Rossum77f6a652002-04-03 22:41:51 +0000951static int
Tim Peterscba30e22003-02-01 06:24:36 +0000952save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000953{
Guido van Rossume2763392002-04-05 19:30:08 +0000954 static char *buf[2] = {FALSE, TRUE};
955 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000956 long l = PyInt_AS_LONG((PyIntObject *)args);
957
Guido van Rossume2763392002-04-05 19:30:08 +0000958 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959 return -1;
960
961 return 0;
962}
Tim Peters84e87f32001-03-17 04:50:51 +0000963
Guido van Rossum60456fd1997-04-09 17:36:32 +0000964static int
Tim Peterscba30e22003-02-01 06:24:36 +0000965save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000966{
967 char c_str[32];
968 long l = PyInt_AS_LONG((PyIntObject *)args);
969 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000972#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000973 || l > 0x7fffffffL
974 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000975#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000976 ) {
977 /* Text-mode pickle, or long too big to fit in the 4-byte
978 * signed BININT format: store as a string.
979 */
980 c_str[0] = INT;
981 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
982 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
983 return -1;
984 }
985 else {
986 /* Binary pickle and l fits in a signed 4-byte int. */
987 c_str[1] = (int)( l & 0xff);
988 c_str[2] = (int)((l >> 8) & 0xff);
989 c_str[3] = (int)((l >> 16) & 0xff);
990 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000992 if ((c_str[4] == 0) && (c_str[3] == 0)) {
993 if (c_str[2] == 0) {
994 c_str[0] = BININT1;
995 len = 2;
996 }
997 else {
998 c_str[0] = BININT2;
999 len = 3;
1000 }
1001 }
1002 else {
1003 c_str[0] = BININT;
1004 len = 5;
1005 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001007 if ((*self->write_func)(self, c_str, len) < 0)
1008 return -1;
1009 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001012}
1013
1014
1015static int
Tim Peterscba30e22003-02-01 06:24:36 +00001016save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017{
1018 int size, res = -1;
1019 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Tim Peterscba30e22003-02-01 06:24:36 +00001023 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 if ((size = PyString_Size(repr)) < 0)
1027 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 if ((*self->write_func)(self, &l, 1) < 0)
1030 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001032 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001033 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 size) < 0)
1035 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001037 if ((*self->write_func)(self, "\n", 1) < 0)
1038 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001042 finally:
1043 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046}
1047
1048
1049static int
Tim Peterscba30e22003-02-01 06:24:36 +00001050save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001051{
1052 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001054 if (self->bin) {
1055 int s, e;
1056 double f;
1057 long fhi, flo;
1058 char str[9];
1059 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001061 *p = BINFLOAT;
1062 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001064 if (x < 0) {
1065 s = 1;
1066 x = -x;
1067 }
1068 else
1069 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001071 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 /* Normalize f to be in the range [1.0, 2.0) */
1074 if (0.5 <= f && f < 1.0) {
1075 f *= 2.0;
1076 e--;
1077 }
1078 else if (f == 0.0) {
1079 e = 0;
1080 }
1081 else {
1082 PyErr_SetString(PyExc_SystemError,
1083 "frexp() result out of range");
1084 return -1;
1085 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001087 if (e >= 1024) {
1088 /* XXX 1024 itself is reserved for Inf/NaN */
1089 PyErr_SetString(PyExc_OverflowError,
1090 "float too large to pack with d format");
1091 return -1;
1092 }
1093 else if (e < -1022) {
1094 /* Gradual underflow */
1095 f = ldexp(f, 1022 + e);
1096 e = 0;
1097 }
1098 else if (!(e == 0 && f == 0.0)) {
1099 e += 1023;
1100 f -= 1.0; /* Get rid of leading 1 */
1101 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Tim Peterscba30e22003-02-01 06:24:36 +00001103 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001104 flo the low 24 bits (== 52 bits) */
1105 f *= 268435456.0; /* 2**28 */
1106 fhi = (long) floor(f); /* Truncate */
1107 f -= (double)fhi;
1108 f *= 16777216.0; /* 2**24 */
1109 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001111 /* First byte */
1112 *p = (s<<7) | (e>>4);
1113 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 /* Second byte */
1116 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1117 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 /* Third byte */
1120 *p = (unsigned char) ((fhi>>16) & 0xFF);
1121 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 /* Fourth byte */
1124 *p = (unsigned char) ((fhi>>8) & 0xFF);
1125 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 /* Fifth byte */
1128 *p = (unsigned char) (fhi & 0xFF);
1129 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001131 /* Sixth byte */
1132 *p = (unsigned char) ((flo>>16) & 0xFF);
1133 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 /* Seventh byte */
1136 *p = (unsigned char) ((flo>>8) & 0xFF);
1137 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 /* Eighth byte */
1140 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 if ((*self->write_func)(self, str, 9) < 0)
1143 return -1;
1144 }
1145 else {
1146 char c_str[250];
1147 c_str[0] = FLOAT;
1148 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1151 return -1;
1152 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155}
1156
1157
1158static int
Tim Peterscba30e22003-02-01 06:24:36 +00001159save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160{
1161 int size, len;
1162 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 if ((size = PyString_Size(args)) < 0)
1165 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 if (!self->bin) {
1168 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
Tim Peterscba30e22003-02-01 06:24:36 +00001172 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 if ((len = PyString_Size(repr)) < 0)
1176 goto err;
1177 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 if ((*self->write_func)(self, &string, 1) < 0)
1180 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if ((*self->write_func)(self, repr_str, len) < 0)
1183 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 if ((*self->write_func)(self, "\n", 1) < 0)
1186 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 Py_XDECREF(repr);
1189 }
1190 else {
1191 int i;
1192 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 if ((size = PyString_Size(args)) < 0)
1195 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if (size < 256) {
1198 c_str[0] = SHORT_BINSTRING;
1199 c_str[1] = size;
1200 len = 2;
1201 }
1202 else {
1203 c_str[0] = BINSTRING;
1204 for (i = 1; i < 5; i++)
1205 c_str[i] = (int)(size >> ((i - 1) * 8));
1206 len = 5;
1207 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if ((*self->write_func)(self, c_str, len) < 0)
1210 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 if (size > 128 && Pdata_Check(self->file)) {
1213 if (write_other(self, NULL, 0) < 0) return -1;
1214 PDATA_APPEND(self->file, args, -1);
1215 }
1216 else {
1217 if ((*self->write_func)(self,
1218 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1219 return -1;
1220 }
1221 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 if (doput)
1224 if (put(self, args) < 0)
1225 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 err:
1230 Py_XDECREF(repr);
1231 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001232}
1233
1234
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001235#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001236/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1237 backslash and newline characters to \uXXXX escapes. */
1238static PyObject *
1239modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1240{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 PyObject *repr;
1242 char *p;
1243 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 repr = PyString_FromStringAndSize(NULL, 6 * size);
1248 if (repr == NULL)
1249 return NULL;
1250 if (size == 0)
1251 return repr;
1252
1253 p = q = PyString_AS_STRING(repr);
1254 while (size-- > 0) {
1255 Py_UNICODE ch = *s++;
1256 /* Map 16-bit characters to '\uxxxx' */
1257 if (ch >= 256 || ch == '\\' || ch == '\n') {
1258 *p++ = '\\';
1259 *p++ = 'u';
1260 *p++ = hexdigit[(ch >> 12) & 0xf];
1261 *p++ = hexdigit[(ch >> 8) & 0xf];
1262 *p++ = hexdigit[(ch >> 4) & 0xf];
1263 *p++ = hexdigit[ch & 15];
1264 }
1265 /* Copy everything else as-is */
1266 else
1267 *p++ = (char) ch;
1268 }
1269 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001270 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001271 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001272}
1273
1274
Guido van Rossum60456fd1997-04-09 17:36:32 +00001275static int
Tim Peterscba30e22003-02-01 06:24:36 +00001276save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001277{
1278 int size, len;
1279 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if (!PyUnicode_Check(args))
1282 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284 if (!self->bin) {
1285 char *repr_str;
1286 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 repr = modified_EncodeRawUnicodeEscape(
1289 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001290 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001293 if ((len = PyString_Size(repr)) < 0)
1294 goto err;
1295 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if ((*self->write_func)(self, &string, 1) < 0)
1298 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if ((*self->write_func)(self, repr_str, len) < 0)
1301 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if ((*self->write_func)(self, "\n", 1) < 0)
1304 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 Py_XDECREF(repr);
1307 }
1308 else {
1309 int i;
1310 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Tim Peterscba30e22003-02-01 06:24:36 +00001312 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001315 if ((size = PyString_Size(repr)) < 0)
1316 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001318 c_str[0] = BINUNICODE;
1319 for (i = 1; i < 5; i++)
1320 c_str[i] = (int)(size >> ((i - 1) * 8));
1321 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001323 if ((*self->write_func)(self, c_str, len) < 0)
1324 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 if (size > 128 && Pdata_Check(self->file)) {
1327 if (write_other(self, NULL, 0) < 0)
1328 goto err;
1329 PDATA_APPEND(self->file, repr, -1);
1330 }
1331 else {
1332 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1333 size) < 0)
1334 goto err;
1335 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 Py_DECREF(repr);
1338 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 if (doput)
1341 if (put(self, args) < 0)
1342 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001346 err:
1347 Py_XDECREF(repr);
1348 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001349}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001350#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001351
1352
1353static int
Tim Peterscba30e22003-02-01 06:24:36 +00001354save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355{
1356 PyObject *element = 0, *py_tuple_id = 0;
1357 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if ((*self->write_func)(self, &MARKv, 1) < 0)
1362 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 if ((len = PyTuple_Size(args)) < 0)
1365 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001368 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 if (save(self, element, 0) < 0)
1372 goto finally;
1373 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001374
Tim Peterscba30e22003-02-01 06:24:36 +00001375 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001376 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001378 if (len) {
1379 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1380 if (self->bin) {
1381 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1384 goto finally;
1385 }
1386 else {
1387 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 for (i = 0; i <= len; i++) {
1390 if ((*self->write_func)(self, &pop, 1) < 0)
1391 goto finally;
1392 }
1393 }
Tim Peters84e87f32001-03-17 04:50:51 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 if (get(self, py_tuple_id) < 0)
1396 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 res = 0;
1399 goto finally;
1400 }
1401 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 if ((*self->write_func)(self, &tuple, 1) < 0) {
1404 goto finally;
1405 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 if (put(self, args) < 0)
1408 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412 finally:
1413 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001415 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001416}
1417
1418static int
Tim Peterscba30e22003-02-01 06:24:36 +00001419save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420{
1421 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001424}
1425
1426
1427static int
Tim Peterscba30e22003-02-01 06:24:36 +00001428save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429{
1430 PyObject *element = 0;
1431 int s_len, len, i, using_appends, res = -1;
1432 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 if (self->fast && !fast_save_enter(self, args))
1437 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 if (self->bin) {
1440 s[0] = EMPTY_LIST;
1441 s_len = 1;
1442 }
1443 else {
1444 s[0] = MARK;
1445 s[1] = LIST;
1446 s_len = 2;
1447 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001449 if ((len = PyList_Size(args)) < 0)
1450 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if ((*self->write_func)(self, s, s_len) < 0)
1453 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 if (len == 0) {
1456 if (put(self, args) < 0)
1457 goto finally;
1458 }
1459 else {
1460 if (put2(self, args) < 0)
1461 goto finally;
1462 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001464 if ((using_appends = (self->bin && (len > 1))))
1465 if ((*self->write_func)(self, &MARKv, 1) < 0)
1466 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001468 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001469 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if (save(self, element, 0) < 0)
1473 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001475 if (!using_appends) {
1476 if ((*self->write_func)(self, &append, 1) < 0)
1477 goto finally;
1478 }
1479 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001481 if (using_appends) {
1482 if ((*self->write_func)(self, &appends, 1) < 0)
1483 goto finally;
1484 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001486 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 finally:
1489 if (self->fast && !fast_save_leave(self, args))
1490 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001493}
1494
1495
Guido van Rossum60456fd1997-04-09 17:36:32 +00001496static int
Tim Peterscba30e22003-02-01 06:24:36 +00001497save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001498{
1499 PyObject *key = 0, *value = 0;
1500 int i, len, res = -1, using_setitems;
1501 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 if (self->fast && !fast_save_enter(self, args))
1506 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 if (self->bin) {
1509 s[0] = EMPTY_DICT;
1510 len = 1;
1511 }
1512 else {
1513 s[0] = MARK;
1514 s[1] = DICT;
1515 len = 2;
1516 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 if ((*self->write_func)(self, s, len) < 0)
1519 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521 if ((len = PyDict_Size(args)) < 0)
1522 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 if (len == 0) {
1525 if (put(self, args) < 0)
1526 goto finally;
1527 }
1528 else {
1529 if (put2(self, args) < 0)
1530 goto finally;
1531 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1534 if ((*self->write_func)(self, &MARKv, 1) < 0)
1535 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001537 i = 0;
1538 while (PyDict_Next(args, &i, &key, &value)) {
1539 if (save(self, key, 0) < 0)
1540 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if (save(self, value, 0) < 0)
1543 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 if (!using_setitems) {
1546 if ((*self->write_func)(self, &setitem, 1) < 0)
1547 goto finally;
1548 }
1549 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001551 if (using_setitems) {
1552 if ((*self->write_func)(self, &setitems, 1) < 0)
1553 goto finally;
1554 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558 finally:
1559 if (self->fast && !fast_save_leave(self, args))
1560 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001563}
1564
1565
Tim Peters84e87f32001-03-17 04:50:51 +00001566static int
Tim Peterscba30e22003-02-01 06:24:36 +00001567save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568{
1569 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1570 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1571 char *module_str, *name_str;
1572 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001574 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 if (self->fast && !fast_save_enter(self, args))
1577 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 if ((*self->write_func)(self, &MARKv, 1) < 0)
1580 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001581
Tim Peterscba30e22003-02-01 06:24:36 +00001582 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001583 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 if (self->bin) {
1586 if (save(self, class, 0) < 0)
1587 goto finally;
1588 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001590 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1591 PyObject *element = 0;
1592 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001595 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 if ((len = PyObject_Size(class_args)) < 0)
1599 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001602 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605 if (save(self, element, 0) < 0) {
1606 Py_DECREF(element);
1607 goto finally;
1608 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001610 Py_DECREF(element);
1611 }
1612 }
1613 else {
1614 PyErr_Clear();
1615 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if (!self->bin) {
1618 if (!( name = ((PyClassObject *)class)->cl_name )) {
1619 PyErr_SetString(PicklingError, "class has no name");
1620 goto finally;
1621 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001622
Tim Peterscba30e22003-02-01 06:24:36 +00001623 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001625
Tim Peters84e87f32001-03-17 04:50:51 +00001626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001627 if ((module_size = PyString_Size(module)) < 0 ||
1628 (name_size = PyString_Size(name)) < 0)
1629 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 module_str = PyString_AS_STRING((PyStringObject *)module);
1632 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if ((*self->write_func)(self, &inst, 1) < 0)
1635 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if ((*self->write_func)(self, module_str, module_size) < 0)
1638 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if ((*self->write_func)(self, "\n", 1) < 0)
1641 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 if ((*self->write_func)(self, name_str, name_size) < 0)
1644 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 if ((*self->write_func)(self, "\n", 1) < 0)
1647 goto finally;
1648 }
1649 else if ((*self->write_func)(self, &obj, 1) < 0) {
1650 goto finally;
1651 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001653 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1654 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001655 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001656 goto finally;
1657 }
1658 else {
1659 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1662 PyErr_Clear();
1663 res = 0;
1664 goto finally;
1665 }
1666 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if (!PyDict_Check(state)) {
1669 if (put2(self, args) < 0)
1670 goto finally;
1671 }
1672 else {
1673 if (put(self, args) < 0)
1674 goto finally;
1675 }
Tim Peters84e87f32001-03-17 04:50:51 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 if (save(self, state, 0) < 0)
1678 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 if ((*self->write_func)(self, &build, 1) < 0)
1681 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 finally:
1686 if (self->fast && !fast_save_leave(self, args))
1687 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689 Py_XDECREF(module);
1690 Py_XDECREF(class);
1691 Py_XDECREF(state);
1692 Py_XDECREF(getinitargs_func);
1693 Py_XDECREF(getstate_func);
1694 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697}
1698
1699
Guido van Rossum60456fd1997-04-09 17:36:32 +00001700static int
Tim Peterscba30e22003-02-01 06:24:36 +00001701save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001702{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001703 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 char *name_str, *module_str;
1705 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 if (name) {
1710 global_name = name;
1711 Py_INCREF(global_name);
1712 }
1713 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001714 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 goto finally;
1716 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001717
Tim Peterscba30e22003-02-01 06:24:36 +00001718 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001721 if ((module_size = PyString_Size(module)) < 0 ||
1722 (name_size = PyString_Size(global_name)) < 0)
1723 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001725 module_str = PyString_AS_STRING((PyStringObject *)module);
1726 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001727
Guido van Rossum75bfd052002-12-24 18:10:07 +00001728 /* XXX This can be doing a relative import. Clearly it shouldn't,
1729 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 mod = PyImport_ImportModule(module_str);
1731 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 cPickle_ErrFormat(PicklingError,
1733 "Can't pickle %s: it's not found as %s.%s",
1734 "OSS", args, module, global_name);
1735 goto finally;
1736 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001737 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 if (klass == NULL) {
1739 cPickle_ErrFormat(PicklingError,
1740 "Can't pickle %s: it's not found as %s.%s",
1741 "OSS", args, module, global_name);
1742 goto finally;
1743 }
1744 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001745 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 cPickle_ErrFormat(PicklingError,
1747 "Can't pickle %s: it's not the same object as %s.%s",
1748 "OSS", args, module, global_name);
1749 goto finally;
1750 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001751 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if ((*self->write_func)(self, &global, 1) < 0)
1754 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if ((*self->write_func)(self, module_str, module_size) < 0)
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if ((*self->write_func)(self, "\n", 1) < 0)
1760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 if ((*self->write_func)(self, name_str, name_size) < 0)
1763 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 if ((*self->write_func)(self, "\n", 1) < 0)
1766 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001768 if (put(self, args) < 0)
1769 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001771 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 finally:
1774 Py_XDECREF(module);
1775 Py_XDECREF(global_name);
1776 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779}
1780
Guido van Rossum60456fd1997-04-09 17:36:32 +00001781static int
Tim Peterscba30e22003-02-01 06:24:36 +00001782save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783{
1784 PyObject *pid = 0;
1785 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001787 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 Py_INCREF(args);
1790 ARG_TUP(self, args);
1791 if (self->arg) {
1792 pid = PyObject_Call(f, self->arg, NULL);
1793 FREE_ARG_TUP(self);
1794 }
1795 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 if (pid != Py_None) {
1798 if (!self->bin) {
1799 if (!PyString_Check(pid)) {
1800 PyErr_SetString(PicklingError,
1801 "persistent id must be string");
1802 goto finally;
1803 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 if ((*self->write_func)(self, &persid, 1) < 0)
1806 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 if ((size = PyString_Size(pid)) < 0)
1809 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 if ((*self->write_func)(self,
1812 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1813 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 if ((*self->write_func)(self, "\n", 1) < 0)
1816 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 res = 1;
1819 goto finally;
1820 }
1821 else if (save(self, pid, 1) >= 0) {
1822 if ((*self->write_func)(self, &binpersid, 1) < 0)
1823 res = -1;
1824 else
1825 res = 1;
1826 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 goto finally;
1829 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 finally:
1834 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001836 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001837}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001838
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Tim Peters84e87f32001-03-17 04:50:51 +00001840static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001841save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001842 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843{
1844 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if (save(self, callable, 0) < 0)
1847 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 if (save(self, tup, 0) < 0)
1850 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if ((*self->write_func)(self, &reduce, 1) < 0)
1853 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 if (ob != NULL) {
1856 if (state && !PyDict_Check(state)) {
1857 if (put2(self, ob) < 0)
1858 return -1;
1859 }
1860 else {
1861 if (put(self, ob) < 0)
1862 return -1;
1863 }
1864 }
Tim Peters84e87f32001-03-17 04:50:51 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 if (state) {
1867 if (save(self, state, 0) < 0)
1868 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if ((*self->write_func)(self, &build, 1) < 0)
1871 return -1;
1872 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001876
Guido van Rossum60456fd1997-04-09 17:36:32 +00001877static int
Tim Peterscba30e22003-02-01 06:24:36 +00001878save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879{
1880 PyTypeObject *type;
1881 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1882 *callable = 0, *state = 0;
1883 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001884
Martin v. Löwis5a395302002-08-04 08:20:23 +00001885 if (self->nesting++ > Py_GetRecursionLimit()){
1886 PyErr_SetString(PyExc_RuntimeError,
1887 "maximum recursion depth exceeded");
1888 goto finally;
1889 }
1890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 if (!pers_save && self->pers_func) {
1892 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1893 res = tmp;
1894 goto finally;
1895 }
1896 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if (args == Py_None) {
1899 res = save_none(self, args);
1900 goto finally;
1901 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001903 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001906 case 'b':
1907 if (args == Py_False || args == Py_True) {
1908 res = save_bool(self, args);
1909 goto finally;
1910 }
1911 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001912 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 if (type == &PyInt_Type) {
1914 res = save_int(self, args);
1915 goto finally;
1916 }
1917 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001918
Guido van Rossum60456fd1997-04-09 17:36:32 +00001919 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 if (type == &PyLong_Type) {
1921 res = save_long(self, args);
1922 goto finally;
1923 }
1924 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Guido van Rossum60456fd1997-04-09 17:36:32 +00001926 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 if (type == &PyFloat_Type) {
1928 res = save_float(self, args);
1929 goto finally;
1930 }
1931 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Guido van Rossum60456fd1997-04-09 17:36:32 +00001933 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1935 if (self->bin) res = save_empty_tuple(self, args);
1936 else res = save_tuple(self, args);
1937 goto finally;
1938 }
1939 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940
Guido van Rossum60456fd1997-04-09 17:36:32 +00001941 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1943 res = save_string(self, args, 0);
1944 goto finally;
1945 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001946
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001947#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001948 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1950 res = save_unicode(self, args, 0);
1951 goto finally;
1952 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001953#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00001957 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001960 if (PyDict_GetItem(self->memo, py_ob_id)) {
1961 if (get(self, py_ob_id) < 0)
1962 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 res = 0;
1965 goto finally;
1966 }
1967 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001970 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001971 if (type == &PyString_Type) {
1972 res = save_string(self, args, 1);
1973 goto finally;
1974 }
1975 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001976
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001977#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001978 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001979 if (type == &PyUnicode_Type) {
1980 res = save_unicode(self, args, 1);
1981 goto finally;
1982 }
1983 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001984#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001985
Guido van Rossum60456fd1997-04-09 17:36:32 +00001986 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 if (type == &PyTuple_Type) {
1988 res = save_tuple(self, args);
1989 goto finally;
1990 }
1991 if (type == &PyType_Type) {
1992 res = save_global(self, args, NULL);
1993 goto finally;
1994 }
1995 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001996
Guido van Rossum60456fd1997-04-09 17:36:32 +00001997 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 if (type == &PyList_Type) {
1999 res = save_list(self, args);
2000 goto finally;
2001 }
2002 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003
2004 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 if (type == &PyDict_Type) {
2006 res = save_dict(self, args);
2007 goto finally;
2008 }
2009 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002010
2011 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 if (type == &PyInstance_Type) {
2013 res = save_inst(self, args);
2014 goto finally;
2015 }
2016 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002017
2018 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 if (type == &PyClass_Type) {
2020 res = save_global(self, args, NULL);
2021 goto finally;
2022 }
2023 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002024
2025 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 if (type == &PyFunction_Type) {
2027 res = save_global(self, args, NULL);
2028 goto finally;
2029 }
2030 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031
2032 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 if (type == &PyCFunction_Type) {
2034 res = save_global(self, args, NULL);
2035 goto finally;
2036 }
2037 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 if (!pers_save && self->inst_pers_func) {
2040 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2041 res = tmp;
2042 goto finally;
2043 }
2044 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002045
Jeremy Hylton39c61162002-07-16 19:47:43 +00002046 if (PyType_IsSubtype(type, &PyType_Type)) {
2047 res = save_global(self, args, NULL);
2048 goto finally;
2049 }
2050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2052 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 Py_INCREF(args);
2055 ARG_TUP(self, args);
2056 if (self->arg) {
2057 t = PyObject_Call(__reduce__, self->arg, NULL);
2058 FREE_ARG_TUP(self);
2059 }
2060 if (! t) goto finally;
2061 }
2062 else {
2063 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2066 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002067 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 goto finally;
2069 }
2070 else {
2071 PyErr_Clear();
2072 }
2073 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 if (t) {
2076 if (PyString_Check(t)) {
2077 res = save_global(self, args, t);
2078 goto finally;
2079 }
Tim Peters84e87f32001-03-17 04:50:51 +00002080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 if (!PyTuple_Check(t)) {
2082 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2083 "be a tuple", "O", __reduce__);
2084 goto finally;
2085 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 if ((size != 3) && (size != 2)) {
2090 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2091 "contain only two or three elements", "O", __reduce__);
2092 goto finally;
2093 }
Tim Peters84e87f32001-03-17 04:50:51 +00002094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 if (size > 2) {
2100 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002101 if (state == Py_None)
2102 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2106 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2107 "returned by %s must be a tuple", "O", __reduce__);
2108 goto finally;
2109 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 res = save_reduce(self, callable, arg_tup, state, args);
2112 goto finally;
2113 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002118 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 Py_XDECREF(py_ob_id);
2120 Py_XDECREF(__reduce__);
2121 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124}
2125
2126
2127static int
Tim Peterscba30e22003-02-01 06:24:36 +00002128dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129{
2130 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if (save(self, args, 0) < 0)
2133 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 if ((*self->write_func)(self, &stop, 1) < 0)
2136 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 if ((*self->write_func)(self, NULL, 0) < 0)
2139 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002142}
2143
2144static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002145Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146{
Tim Peterscba30e22003-02-01 06:24:36 +00002147 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002148 PyDict_Clear(self->memo);
2149 Py_INCREF(Py_None);
2150 return Py_None;
2151}
2152
2153static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002154Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002155{
2156 int l, i, rsize, ssize, clear=1, lm;
2157 long ik;
2158 PyObject *k, *r;
2159 char *s, *p, *have_get;
2160 Pdata *data;
2161
2162 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002163 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164 return NULL;
2165
2166 /* Check to make sure we are based on a list */
2167 if (! Pdata_Check(self->file)) {
2168 PyErr_SetString(PicklingError,
2169 "Attempt to getvalue() a non-list-based pickler");
2170 return NULL;
2171 }
2172
2173 /* flush write buffer */
2174 if (write_other(self, NULL, 0) < 0) return NULL;
2175
2176 data=(Pdata*)self->file;
2177 l=data->length;
2178
2179 /* set up an array to hold get/put status */
2180 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2181 lm++;
2182 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2183 memset(have_get,0,lm);
2184
2185 /* Scan for gets. */
2186 for (rsize=0, i=l; --i >= 0; ) {
2187 k=data->data[i];
2188
2189 if (PyString_Check(k)) {
2190 rsize += PyString_GET_SIZE(k);
2191 }
2192
2193 else if (PyInt_Check(k)) { /* put */
2194 ik=PyInt_AS_LONG((PyIntObject*)k);
2195 if (ik >= lm || ik==0) {
2196 PyErr_SetString(PicklingError,
2197 "Invalid get data");
2198 return NULL;
2199 }
2200 if (have_get[ik]) { /* with matching get */
2201 if (ik < 256) rsize += 2;
2202 else rsize+=5;
2203 }
2204 }
2205
2206 else if (! (PyTuple_Check(k) &&
2207 PyTuple_GET_SIZE(k) == 2 &&
2208 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2209 ) {
2210 PyErr_SetString(PicklingError,
2211 "Unexpected data in internal list");
2212 return NULL;
2213 }
2214
2215 else { /* put */
2216 ik=PyInt_AS_LONG((PyIntObject*)k);
2217 if (ik >= lm || ik==0) {
2218 PyErr_SetString(PicklingError,
2219 "Invalid get data");
2220 return NULL;
2221 }
2222 have_get[ik]=1;
2223 if (ik < 256) rsize += 2;
2224 else rsize+=5;
2225 }
2226
2227 }
2228
2229 /* Now generate the result */
2230 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2231 s=PyString_AS_STRING((PyStringObject*)r);
2232
2233 for (i=0; i<l; i++) {
2234 k=data->data[i];
2235
2236 if (PyString_Check(k)) {
2237 ssize=PyString_GET_SIZE(k);
2238 if (ssize) {
2239 p=PyString_AS_STRING((PyStringObject*)k);
2240 while (--ssize >= 0) *s++=*p++;
2241 }
2242 }
2243
2244 else if (PyTuple_Check(k)) { /* get */
2245 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2246 if (ik < 256) {
2247 *s++ = BINGET;
2248 *s++ = (int)(ik & 0xff);
2249 }
2250 else {
2251 *s++ = LONG_BINGET;
2252 *s++ = (int)(ik & 0xff);
2253 *s++ = (int)((ik >> 8) & 0xff);
2254 *s++ = (int)((ik >> 16) & 0xff);
2255 *s++ = (int)((ik >> 24) & 0xff);
2256 }
2257 }
2258
2259 else { /* put */
2260 ik=PyInt_AS_LONG((PyIntObject*)k);
2261
2262 if (have_get[ik]) { /* with matching get */
2263 if (ik < 256) {
2264 *s++ = BINPUT;
2265 *s++ = (int)(ik & 0xff);
2266 }
2267 else {
2268 *s++ = LONG_BINPUT;
2269 *s++ = (int)(ik & 0xff);
2270 *s++ = (int)((ik >> 8) & 0xff);
2271 *s++ = (int)((ik >> 16) & 0xff);
2272 *s++ = (int)((ik >> 24) & 0xff);
2273 }
2274 }
2275 }
2276
2277 }
2278
2279 if (clear) {
2280 PyDict_Clear(self->memo);
2281 Pdata_clear(data,0);
2282 }
2283
2284 free(have_get);
2285 return r;
2286 err:
2287 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002288 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002289}
2290
2291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002292Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293{
2294 PyObject *ob;
2295 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002296
Tim Peterscba30e22003-02-01 06:24:36 +00002297 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 if (dump(self, ob) < 0)
2301 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002305 /* XXX Why does dump() return self? */
2306 Py_INCREF(self);
2307 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002308}
2309
2310
Tim Peterscba30e22003-02-01 06:24:36 +00002311static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002312{
Neal Norwitzb0493252002-03-31 14:44:22 +00002313 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002314 PyDoc_STR("dump(object) -- "
2315 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002316 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002317 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002318 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002319 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002320 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002321};
2322
2323
2324static Picklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00002325newPicklerobject(PyObject *file, int bin)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326{
2327 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002328
Tim Peterscba30e22003-02-01 06:24:36 +00002329 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 self->fp = NULL;
2333 self->write = NULL;
2334 self->memo = NULL;
2335 self->arg = NULL;
2336 self->pers_func = NULL;
2337 self->inst_pers_func = NULL;
2338 self->write_buf = NULL;
2339 self->bin = bin;
2340 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002341 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 self->fast_container = 0;
2343 self->fast_memo = NULL;
2344 self->buf_size = 0;
2345 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002347 if (file)
2348 Py_INCREF(file);
2349 else
2350 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002351
Tim Peterscba30e22003-02-01 06:24:36 +00002352 if (!( self->file = file ))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002354
Tim Peterscba30e22003-02-01 06:24:36 +00002355 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002358 if (PyFile_Check(file)) {
2359 self->fp = PyFile_AsFile(file);
2360 if (self->fp == NULL) {
2361 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2362 goto err;
2363 }
2364 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002365 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002366 else if (PycStringIO_OutputCheck(file)) {
2367 self->write_func = write_cStringIO;
2368 }
2369 else if (file == Py_None) {
2370 self->write_func = write_none;
2371 }
2372 else {
2373 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002375 if (! Pdata_Check(file)) {
2376 self->write = PyObject_GetAttr(file, write_str);
2377 if (!self->write) {
2378 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002379 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 "argument must have 'write' "
2381 "attribute");
2382 goto err;
2383 }
2384 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 if (!( self->write_buf =
2387 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2388 PyErr_NoMemory();
2389 goto err;
2390 }
2391 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 if (PyEval_GetRestricted()) {
2394 /* Restricted execution, get private tables */
2395 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2398 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2399 Py_DECREF(m);
2400 if (!( self->dispatch_table )) goto err;
2401 }
2402 else {
2403 self->dispatch_table=dispatch_table;
2404 Py_INCREF(dispatch_table);
2405 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 err:
2410 Py_DECREF((PyObject *)self);
2411 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002412}
2413
2414
2415static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002416get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417{
2418 PyObject *file = NULL;
2419 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2422 PyErr_Clear();
2423 bin = 0;
2424 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2425 return NULL;
2426 }
2427 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002428}
2429
2430
2431static void
Tim Peterscba30e22003-02-01 06:24:36 +00002432Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433{
2434 Py_XDECREF(self->write);
2435 Py_XDECREF(self->memo);
2436 Py_XDECREF(self->fast_memo);
2437 Py_XDECREF(self->arg);
2438 Py_XDECREF(self->file);
2439 Py_XDECREF(self->pers_func);
2440 Py_XDECREF(self->inst_pers_func);
2441 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 if (self->write_buf) {
2444 free(self->write_buf);
2445 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002448}
2449
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002450static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002451Pickler_get_pers_func(Picklerobject *p)
2452{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002453 if (p->pers_func == NULL)
2454 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2455 else
2456 Py_INCREF(p->pers_func);
2457 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002458}
2459
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002460static int
2461Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2462{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463 if (v == NULL) {
2464 PyErr_SetString(PyExc_TypeError,
2465 "attribute deletion is not supported");
2466 return -1;
2467 }
2468 Py_XDECREF(p->pers_func);
2469 Py_INCREF(v);
2470 p->pers_func = v;
2471 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002472}
2473
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002474static int
2475Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2476{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 if (v == NULL) {
2478 PyErr_SetString(PyExc_TypeError,
2479 "attribute deletion is not supported");
2480 return -1;
2481 }
2482 Py_XDECREF(p->inst_pers_func);
2483 Py_INCREF(v);
2484 p->inst_pers_func = v;
2485 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002486}
2487
2488static PyObject *
2489Pickler_get_memo(Picklerobject *p)
2490{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 if (p->memo == NULL)
2492 PyErr_SetString(PyExc_AttributeError, "memo");
2493 else
2494 Py_INCREF(p->memo);
2495 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002496}
2497
2498static int
2499Pickler_set_memo(Picklerobject *p, PyObject *v)
2500{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501 if (v == NULL) {
2502 PyErr_SetString(PyExc_TypeError,
2503 "attribute deletion is not supported");
2504 return -1;
2505 }
2506 if (!PyDict_Check(v)) {
2507 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2508 return -1;
2509 }
2510 Py_XDECREF(p->memo);
2511 Py_INCREF(v);
2512 p->memo = v;
2513 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002514}
2515
2516static PyObject *
2517Pickler_get_error(Picklerobject *p)
2518{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519 /* why is this an attribute on the Pickler? */
2520 Py_INCREF(PicklingError);
2521 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002522}
2523
2524static PyMemberDef Pickler_members[] = {
2525 {"binary", T_INT, offsetof(Picklerobject, bin)},
2526 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002527 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002528};
2529
2530static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002531 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002532 (setter)Pickler_set_pers_func},
2533 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2534 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002535 {"PicklingError", (getter)Pickler_get_error, NULL},
2536 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002537};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002538
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002539PyDoc_STRVAR(Picklertype__doc__,
2540"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002541
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002542static PyTypeObject Picklertype = {
2543 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002544 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002545 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002546 sizeof(Picklerobject), /*tp_basicsize*/
2547 0,
2548 (destructor)Pickler_dealloc, /* tp_dealloc */
2549 0, /* tp_print */
2550 0, /* tp_getattr */
2551 0, /* tp_setattr */
2552 0, /* tp_compare */
2553 0, /* tp_repr */
2554 0, /* tp_as_number */
2555 0, /* tp_as_sequence */
2556 0, /* tp_as_mapping */
2557 0, /* tp_hash */
2558 0, /* tp_call */
2559 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002560 PyObject_GenericGetAttr, /* tp_getattro */
2561 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002562 0, /* tp_as_buffer */
2563 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2564 Picklertype__doc__, /* tp_doc */
2565 0, /* tp_traverse */
2566 0, /* tp_clear */
2567 0, /* tp_richcompare */
2568 0, /* tp_weaklistoffset */
2569 0, /* tp_iter */
2570 0, /* tp_iternext */
2571 Pickler_methods, /* tp_methods */
2572 Pickler_members, /* tp_members */
2573 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002574};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002575
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002576static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002577find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002578{
2579 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002581 if (fc) {
2582 if (fc==Py_None) {
2583 PyErr_SetString(UnpicklingError,
2584 "Global and instance pickles are not supported.");
2585 return NULL;
2586 }
Tim Peterscba30e22003-02-01 06:24:36 +00002587 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588 py_global_name);
2589 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 module = PySys_GetObject("modules");
2592 if (module == NULL)
2593 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002595 module = PyDict_GetItem(module, py_module_name);
2596 if (module == NULL) {
2597 module = PyImport_Import(py_module_name);
2598 if (!module)
2599 return NULL;
2600 global = PyObject_GetAttr(module, py_global_name);
2601 Py_DECREF(module);
2602 }
2603 else
2604 global = PyObject_GetAttr(module, py_global_name);
2605 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606}
2607
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002608static int
Tim Peterscba30e22003-02-01 06:24:36 +00002609marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610{
2611 if (self->num_marks < 1) {
2612 PyErr_SetString(UnpicklingError, "could not find MARK");
2613 return -1;
2614 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002617}
2618
Tim Peters84e87f32001-03-17 04:50:51 +00002619
Guido van Rossum60456fd1997-04-09 17:36:32 +00002620static int
Tim Peterscba30e22003-02-01 06:24:36 +00002621load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002622{
2623 PDATA_APPEND(self->stack, Py_None, -1);
2624 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002625}
2626
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002627static int
Tim Peterscba30e22003-02-01 06:24:36 +00002628bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002629{
2630 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2631 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002632}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002633
2634static int
Tim Peterscba30e22003-02-01 06:24:36 +00002635load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636{
2637 PyObject *py_int = 0;
2638 char *endptr, *s;
2639 int len, res = -1;
2640 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002642 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2643 if (len < 2) return bad_readline();
2644 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002646 errno = 0;
2647 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002649 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2650 /* Hm, maybe we've got something long. Let's try reading
2651 it as a Python long object. */
2652 errno = 0;
2653 py_int = PyLong_FromString(s, NULL, 0);
2654 if (py_int == NULL) {
2655 PyErr_SetString(PyExc_ValueError,
2656 "could not convert string to int");
2657 goto finally;
2658 }
2659 }
2660 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002661 if (len == 3 && (l == 0 || l == 1)) {
2662 if (!( py_int = PyBool_FromLong(l))) goto finally;
2663 }
2664 else {
2665 if (!( py_int = PyInt_FromLong(l))) goto finally;
2666 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002669 free(s);
2670 PDATA_PUSH(self->stack, py_int, -1);
2671 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 finally:
2674 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002677}
2678
2679
Tim Peters84e87f32001-03-17 04:50:51 +00002680static long
Tim Peterscba30e22003-02-01 06:24:36 +00002681calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002682{
2683 unsigned char c;
2684 int i;
2685 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 for (i = 0, l = 0L; i < x; i++) {
2688 c = (unsigned char)s[i];
2689 l |= (long)c << (i * 8);
2690 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002691#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002692 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2693 * is signed, so on a box with longs bigger than 4 bytes we need
2694 * to extend a BININT's sign bit to the full width.
2695 */
2696 if (x == 4 && l & (1L << 31))
2697 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002698#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002700}
2701
2702
2703static int
Tim Peterscba30e22003-02-01 06:24:36 +00002704load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002705{
2706 PyObject *py_int = 0;
2707 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710
Tim Peterscba30e22003-02-01 06:24:36 +00002711 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 PDATA_PUSH(self->stack, py_int, -1);
2715 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716}
2717
2718
2719static int
Tim Peterscba30e22003-02-01 06:24:36 +00002720load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721{
2722 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 if ((*self->read_func)(self, &s, 4) < 0)
2725 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728}
2729
2730
2731static int
Tim Peterscba30e22003-02-01 06:24:36 +00002732load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733{
2734 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 if ((*self->read_func)(self, &s, 1) < 0)
2737 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740}
2741
2742
2743static int
Tim Peterscba30e22003-02-01 06:24:36 +00002744load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745{
2746 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002748 if ((*self->read_func)(self, &s, 2) < 0)
2749 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752}
Tim Peters84e87f32001-03-17 04:50:51 +00002753
Guido van Rossum60456fd1997-04-09 17:36:32 +00002754static int
Tim Peterscba30e22003-02-01 06:24:36 +00002755load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756{
2757 PyObject *l = 0;
2758 char *end, *s;
2759 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2762 if (len < 2) return bad_readline();
2763 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764
Tim Peterscba30e22003-02-01 06:24:36 +00002765 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002768 free(s);
2769 PDATA_PUSH(self->stack, l, -1);
2770 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002772 finally:
2773 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776}
2777
Tim Peters84e87f32001-03-17 04:50:51 +00002778
Guido van Rossum60456fd1997-04-09 17:36:32 +00002779static int
Tim Peterscba30e22003-02-01 06:24:36 +00002780load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781{
2782 PyObject *py_float = 0;
2783 char *endptr, *s;
2784 int len, res = -1;
2785 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2788 if (len < 2) return bad_readline();
2789 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 errno = 0;
2792 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2795 PyErr_SetString(PyExc_ValueError,
2796 "could not convert string to float");
2797 goto finally;
2798 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Tim Peterscba30e22003-02-01 06:24:36 +00002800 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002803 free(s);
2804 PDATA_PUSH(self->stack, py_float, -1);
2805 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002807 finally:
2808 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811}
2812
Guido van Rossum60456fd1997-04-09 17:36:32 +00002813static int
Tim Peterscba30e22003-02-01 06:24:36 +00002814load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815{
2816 PyObject *py_float = 0;
2817 int s, e;
2818 long fhi, flo;
2819 double x;
2820 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 if ((*self->read_func)(self, &p, 8) < 0)
2823 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 /* First byte */
2826 s = (*p>>7) & 1;
2827 e = (*p & 0x7F) << 4;
2828 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002830 /* Second byte */
2831 e |= (*p>>4) & 0xF;
2832 fhi = (*p & 0xF) << 24;
2833 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 /* Third byte */
2836 fhi |= (*p & 0xFF) << 16;
2837 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 /* Fourth byte */
2840 fhi |= (*p & 0xFF) << 8;
2841 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 /* Fifth byte */
2844 fhi |= *p & 0xFF;
2845 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 /* Sixth byte */
2848 flo = (*p & 0xFF) << 16;
2849 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851 /* Seventh byte */
2852 flo |= (*p & 0xFF) << 8;
2853 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 /* Eighth byte */
2856 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2859 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 /* XXX This sadly ignores Inf/NaN */
2862 if (e == 0)
2863 e = -1022;
2864 else {
2865 x += 1.0;
2866 e -= 1023;
2867 }
2868 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 if (s)
2871 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875 PDATA_PUSH(self->stack, py_float, -1);
2876 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002877}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878
2879static int
Tim Peterscba30e22003-02-01 06:24:36 +00002880load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002881{
2882 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002883 int len, res = -1;
2884 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2887 if (len < 2) return bad_readline();
2888 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002890
2891 /* Strip outermost quotes */
2892 while (s[len-1] <= ' ')
2893 len--;
2894 if(s[0]=='"' && s[len-1]=='"'){
2895 s[len-1] = '\0';
2896 p = s + 1 ;
2897 len -= 2;
2898 } else if(s[0]=='\'' && s[len-1]=='\''){
2899 s[len-1] = '\0';
2900 p = s + 1 ;
2901 len -= 2;
2902 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002903 goto insecure;
2904 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002905
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002906 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2907 if (str) {
2908 PDATA_PUSH(self->stack, str, -1);
2909 res = 0;
2910 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002911 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 insecure:
2915 free(s);
2916 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2917 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002918}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919
2920
2921static int
Tim Peterscba30e22003-02-01 06:24:36 +00002922load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923{
2924 PyObject *py_string = 0;
2925 long l;
2926 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932 if ((*self->read_func)(self, &s, l) < 0)
2933 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002934
Tim Peterscba30e22003-02-01 06:24:36 +00002935 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 PDATA_PUSH(self->stack, py_string, -1);
2939 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940}
2941
2942
2943static int
Tim Peterscba30e22003-02-01 06:24:36 +00002944load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945{
2946 PyObject *py_string = 0;
2947 unsigned char l;
2948 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 if ((*self->read_func)(self, &s, 1) < 0)
2951 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002955 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 PDATA_PUSH(self->stack, py_string, -1);
2960 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002961}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
2963
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002964#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965static int
Tim Peterscba30e22003-02-01 06:24:36 +00002966load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967{
2968 PyObject *str = 0;
2969 int len, res = -1;
2970 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2973 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002974
Tim Peterscba30e22003-02-01 06:24:36 +00002975 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 PDATA_PUSH(self->stack, str, -1);
2979 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 finally:
2982 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002983}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002984#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002985
2986
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002987#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002988static int
Tim Peterscba30e22003-02-01 06:24:36 +00002989load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990{
2991 PyObject *unicode;
2992 long l;
2993 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 if ((*self->read_func)(self, &s, l) < 0)
3000 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003001
Tim Peterscba30e22003-02-01 06:24:36 +00003002 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003005 PDATA_PUSH(self->stack, unicode, -1);
3006 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003007}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003008#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003009
3010
3011static int
Tim Peterscba30e22003-02-01 06:24:36 +00003012load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013{
3014 PyObject *tup;
3015 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003017 if ((i = marker(self)) < 0) return -1;
3018 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3019 PDATA_PUSH(self->stack, tup, -1);
3020 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003021}
3022
3023static int
Tim Peterscba30e22003-02-01 06:24:36 +00003024load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025{
3026 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028 if (!( tup=PyTuple_New(0))) return -1;
3029 PDATA_PUSH(self->stack, tup, -1);
3030 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003031}
3032
3033static int
Tim Peterscba30e22003-02-01 06:24:36 +00003034load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003035{
3036 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003038 if (!( list=PyList_New(0))) return -1;
3039 PDATA_PUSH(self->stack, list, -1);
3040 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041}
3042
3043static int
Tim Peterscba30e22003-02-01 06:24:36 +00003044load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045{
3046 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 if (!( dict=PyDict_New())) return -1;
3049 PDATA_PUSH(self->stack, dict, -1);
3050 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051}
3052
3053
3054static int
Tim Peterscba30e22003-02-01 06:24:36 +00003055load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056{
3057 PyObject *list = 0;
3058 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if ((i = marker(self)) < 0) return -1;
3061 if (!( list=Pdata_popList(self->stack, i))) return -1;
3062 PDATA_PUSH(self->stack, list, -1);
3063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064}
3065
3066static int
Tim Peterscba30e22003-02-01 06:24:36 +00003067load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068{
3069 PyObject *dict, *key, *value;
3070 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 if ((i = marker(self)) < 0) return -1;
3073 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 for (k = i+1; k < j; k += 2) {
3078 key =self->stack->data[k-1];
3079 value=self->stack->data[k ];
3080 if (PyDict_SetItem(dict, key, value) < 0) {
3081 Py_DECREF(dict);
3082 return -1;
3083 }
3084 }
3085 Pdata_clear(self->stack, i);
3086 PDATA_PUSH(self->stack, dict, -1);
3087 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088}
3089
3090static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003091Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003093 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 if (PyClass_Check(cls)) {
3096 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003098 if ((l=PyObject_Size(args)) < 0) goto err;
3099 if (!( l )) {
3100 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003101
Tim Peterscba30e22003-02-01 06:24:36 +00003102 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 __getinitargs___str);
3104 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003105 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 so bypass usual construction */
3107 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003110 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 goto err;
3112 return inst;
3113 }
3114 Py_DECREF(__getinitargs__);
3115 }
Tim Peters84e87f32001-03-17 04:50:51 +00003116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117 if ((r=PyInstance_New(cls, args, NULL))) return r;
3118 else goto err;
3119 }
Tim Peters84e87f32001-03-17 04:50:51 +00003120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 if (args==Py_None) {
3122 /* Special case, call cls.__basicnew__() */
3123 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3126 if (!basicnew) return NULL;
3127 r=PyObject_CallObject(basicnew, NULL);
3128 Py_DECREF(basicnew);
3129 if (r) return r;
3130 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 err:
3135 {
3136 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 PyErr_Fetch(&tp, &v, &tb);
3139 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3140 Py_XDECREF(v);
3141 v=r;
3142 }
3143 PyErr_Restore(tp,v,tb);
3144 }
3145 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003146}
Tim Peters84e87f32001-03-17 04:50:51 +00003147
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148
3149static int
Tim Peterscba30e22003-02-01 06:24:36 +00003150load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151{
3152 PyObject *class, *tup, *obj=0;
3153 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 if ((i = marker(self)) < 0) return -1;
3156 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3157 PDATA_POP(self->stack, class);
3158 if (class) {
3159 obj = Instance_New(class, tup);
3160 Py_DECREF(class);
3161 }
3162 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 if (! obj) return -1;
3165 PDATA_PUSH(self->stack, obj, -1);
3166 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167}
3168
3169
3170static int
Tim Peterscba30e22003-02-01 06:24:36 +00003171load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172{
3173 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3174 int i, len;
3175 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3180 if (len < 2) return bad_readline();
3181 module_name = PyString_FromStringAndSize(s, len - 1);
3182 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003184 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3185 if (len < 2) return bad_readline();
3186 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003187 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 self->find_class);
3189 Py_DECREF(class_name);
3190 }
3191 }
3192 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if ((tup=Pdata_popTuple(self->stack, i))) {
3197 obj = Instance_New(class, tup);
3198 Py_DECREF(tup);
3199 }
3200 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 PDATA_PUSH(self->stack, obj, -1);
3205 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206}
3207
3208
3209static int
Tim Peterscba30e22003-02-01 06:24:36 +00003210load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211{
3212 PyObject *class = 0, *module_name = 0, *class_name = 0;
3213 int len;
3214 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3217 if (len < 2) return bad_readline();
3218 module_name = PyString_FromStringAndSize(s, len - 1);
3219 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003222 if (len < 2) {
3223 Py_DECREF(module_name);
3224 return bad_readline();
3225 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003227 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 self->find_class);
3229 Py_DECREF(class_name);
3230 }
3231 }
3232 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003234 if (! class) return -1;
3235 PDATA_PUSH(self->stack, class, -1);
3236 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003237}
3238
3239
3240static int
Tim Peterscba30e22003-02-01 06:24:36 +00003241load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242{
3243 PyObject *pid = 0;
3244 int len;
3245 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003247 if (self->pers_func) {
3248 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3249 if (len < 2) return bad_readline();
3250
3251 pid = PyString_FromStringAndSize(s, len - 1);
3252 if (!pid) return -1;
3253
3254 if (PyList_Check(self->pers_func)) {
3255 if (PyList_Append(self->pers_func, pid) < 0) {
3256 Py_DECREF(pid);
3257 return -1;
3258 }
3259 }
3260 else {
3261 ARG_TUP(self, pid);
3262 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003263 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264 NULL);
3265 FREE_ARG_TUP(self);
3266 }
3267 }
3268
3269 if (! pid) return -1;
3270
3271 PDATA_PUSH(self->stack, pid, -1);
3272 return 0;
3273 }
3274 else {
3275 PyErr_SetString(UnpicklingError,
3276 "A load persistent id instruction was encountered,\n"
3277 "but no persistent_load function was specified.");
3278 return -1;
3279 }
3280}
3281
3282static int
Tim Peterscba30e22003-02-01 06:24:36 +00003283load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284{
3285 PyObject *pid = 0;
3286
3287 if (self->pers_func) {
3288 PDATA_POP(self->stack, pid);
3289 if (! pid) return -1;
3290
3291 if (PyList_Check(self->pers_func)) {
3292 if (PyList_Append(self->pers_func, pid) < 0) {
3293 Py_DECREF(pid);
3294 return -1;
3295 }
3296 }
3297 else {
3298 ARG_TUP(self, pid);
3299 if (self->arg) {
3300 pid = PyObject_Call(self->pers_func, self->arg,
3301 NULL);
3302 FREE_ARG_TUP(self);
3303 }
3304 if (! pid) return -1;
3305 }
3306
3307 PDATA_PUSH(self->stack, pid, -1);
3308 return 0;
3309 }
3310 else {
3311 PyErr_SetString(UnpicklingError,
3312 "A load persistent id instruction was encountered,\n"
3313 "but no persistent_load function was specified.");
3314 return -1;
3315 }
3316}
3317
3318
3319static int
Tim Peterscba30e22003-02-01 06:24:36 +00003320load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003321{
3322 int len;
3323
3324 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3325
3326 /* Note that we split the (pickle.py) stack into two stacks,
3327 an object stack and a mark stack. We have to be clever and
3328 pop the right one. We do this by looking at the top of the
3329 mark stack.
3330 */
3331
3332 if ((self->num_marks > 0) &&
3333 (self->marks[self->num_marks - 1] == len))
3334 self->num_marks--;
3335 else {
3336 len--;
3337 Py_DECREF(self->stack->data[len]);
3338 self->stack->length=len;
3339 }
3340
3341 return 0;
3342}
3343
3344
3345static int
Tim Peterscba30e22003-02-01 06:24:36 +00003346load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003347{
3348 int i;
3349
3350 if ((i = marker(self)) < 0)
3351 return -1;
3352
3353 Pdata_clear(self->stack, i);
3354
3355 return 0;
3356}
3357
3358
3359static int
Tim Peterscba30e22003-02-01 06:24:36 +00003360load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003361{
3362 PyObject *last;
3363 int len;
3364
3365 if ((len = self->stack->length) <= 0) return stackUnderflow();
3366 last=self->stack->data[len-1];
3367 Py_INCREF(last);
3368 PDATA_PUSH(self->stack, last, -1);
3369 return 0;
3370}
3371
3372
3373static int
Tim Peterscba30e22003-02-01 06:24:36 +00003374load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375{
3376 PyObject *py_str = 0, *value = 0;
3377 int len;
3378 char *s;
3379 int rc;
3380
3381 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003382 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 value = PyDict_GetItem(self->memo, py_str);
3387 if (! value) {
3388 PyErr_SetObject(BadPickleGet, py_str);
3389 rc = -1;
3390 } else {
3391 PDATA_APPEND(self->stack, value, -1);
3392 rc = 0;
3393 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003395 Py_DECREF(py_str);
3396 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003397}
3398
3399
3400static int
Tim Peterscba30e22003-02-01 06:24:36 +00003401load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402{
3403 PyObject *py_key = 0, *value = 0;
3404 unsigned char key;
3405 char *s;
3406 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 key = (unsigned char)s[0];
3411 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 value = PyDict_GetItem(self->memo, py_key);
3414 if (! value) {
3415 PyErr_SetObject(BadPickleGet, py_key);
3416 rc = -1;
3417 } else {
3418 PDATA_APPEND(self->stack, value, -1);
3419 rc = 0;
3420 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003422 Py_DECREF(py_key);
3423 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003424}
3425
3426
3427static int
Tim Peterscba30e22003-02-01 06:24:36 +00003428load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429{
3430 PyObject *py_key = 0, *value = 0;
3431 unsigned char c;
3432 char *s;
3433 long key;
3434 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438 c = (unsigned char)s[0];
3439 key = (long)c;
3440 c = (unsigned char)s[1];
3441 key |= (long)c << 8;
3442 c = (unsigned char)s[2];
3443 key |= (long)c << 16;
3444 c = (unsigned char)s[3];
3445 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3448
3449 value = PyDict_GetItem(self->memo, py_key);
3450 if (! value) {
3451 PyErr_SetObject(BadPickleGet, py_key);
3452 rc = -1;
3453 } else {
3454 PDATA_APPEND(self->stack, value, -1);
3455 rc = 0;
3456 }
3457
3458 Py_DECREF(py_key);
3459 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460}
3461
3462
3463static int
Tim Peterscba30e22003-02-01 06:24:36 +00003464load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465{
3466 PyObject *py_str = 0, *value = 0;
3467 int len, l;
3468 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3471 if (l < 2) return bad_readline();
3472 if (!( len=self->stack->length )) return stackUnderflow();
3473 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3474 value=self->stack->data[len-1];
3475 l=PyDict_SetItem(self->memo, py_str, value);
3476 Py_DECREF(py_str);
3477 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003478}
3479
3480
3481static int
Tim Peterscba30e22003-02-01 06:24:36 +00003482load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483{
3484 PyObject *py_key = 0, *value = 0;
3485 unsigned char key;
3486 char *s;
3487 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3490 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3495 value=self->stack->data[len-1];
3496 len=PyDict_SetItem(self->memo, py_key, value);
3497 Py_DECREF(py_key);
3498 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499}
3500
3501
3502static int
Tim Peterscba30e22003-02-01 06:24:36 +00003503load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504{
3505 PyObject *py_key = 0, *value = 0;
3506 long key;
3507 unsigned char c;
3508 char *s;
3509 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3512 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003514 c = (unsigned char)s[0];
3515 key = (long)c;
3516 c = (unsigned char)s[1];
3517 key |= (long)c << 8;
3518 c = (unsigned char)s[2];
3519 key |= (long)c << 16;
3520 c = (unsigned char)s[3];
3521 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 if (!( py_key = PyInt_FromLong(key))) return -1;
3524 value=self->stack->data[len-1];
3525 len=PyDict_SetItem(self->memo, py_key, value);
3526 Py_DECREF(py_key);
3527 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003528}
3529
3530
3531static int
Tim Peterscba30e22003-02-01 06:24:36 +00003532do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533{
3534 PyObject *value = 0, *list = 0, *append_method = 0;
3535 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003537 len=self->stack->length;
3538 if (!( len >= x && x > 0 )) return stackUnderflow();
3539 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003540 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 if (PyList_Check(list)) {
3545 PyObject *slice;
3546 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548 slice=Pdata_popList(self->stack, x);
3549 list_len = PyList_GET_SIZE(list);
3550 i=PyList_SetSlice(list, list_len, list_len, slice);
3551 Py_DECREF(slice);
3552 return i;
3553 }
3554 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003555
Tim Peterscba30e22003-02-01 06:24:36 +00003556 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003557 return -1;
3558
3559 for (i = x; i < len; i++) {
3560 PyObject *junk;
3561
3562 value=self->stack->data[i];
3563 junk=0;
3564 ARG_TUP(self, value);
3565 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003566 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003567 NULL);
3568 FREE_ARG_TUP(self);
3569 }
3570 if (! junk) {
3571 Pdata_clear(self->stack, i+1);
3572 self->stack->length=x;
3573 Py_DECREF(append_method);
3574 return -1;
3575 }
3576 Py_DECREF(junk);
3577 }
3578 self->stack->length=x;
3579 Py_DECREF(append_method);
3580 }
3581
3582 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003583}
3584
3585
3586static int
Tim Peterscba30e22003-02-01 06:24:36 +00003587load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588{
3589 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590}
3591
3592
3593static int
Tim Peterscba30e22003-02-01 06:24:36 +00003594load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595{
3596 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003597}
3598
3599
3600static int
Tim Peterscba30e22003-02-01 06:24:36 +00003601do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602{
3603 PyObject *value = 0, *key = 0, *dict = 0;
3604 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606 if (!( (len=self->stack->length) >= x
3607 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003611 for (i = x+1; i < len; i += 2) {
3612 key =self->stack->data[i-1];
3613 value=self->stack->data[i ];
3614 if (PyObject_SetItem(dict, key, value) < 0) {
3615 r=-1;
3616 break;
3617 }
3618 }
3619
3620 Pdata_clear(self->stack, x);
3621
3622 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003623}
3624
3625
Tim Peters84e87f32001-03-17 04:50:51 +00003626static int
Tim Peterscba30e22003-02-01 06:24:36 +00003627load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628{
3629 return do_setitems(self, self->stack->length - 2);
3630}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632static int
Tim Peterscba30e22003-02-01 06:24:36 +00003633load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634{
3635 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003636}
3637
Tim Peters84e87f32001-03-17 04:50:51 +00003638
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639static int
Tim Peterscba30e22003-02-01 06:24:36 +00003640load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003641{
3642 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3643 *junk = 0, *__setstate__ = 0;
3644 int i, r = 0;
3645
3646 if (self->stack->length < 2) return stackUnderflow();
3647 PDATA_POP(self->stack, value);
3648 if (! value) return -1;
3649 inst=self->stack->data[self->stack->length-1];
3650
3651 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3652 ARG_TUP(self, value);
3653 if (self->arg) {
3654 junk = PyObject_Call(__setstate__, self->arg, NULL);
3655 FREE_ARG_TUP(self);
3656 }
3657 Py_DECREF(__setstate__);
3658 if (! junk) return -1;
3659 Py_DECREF(junk);
3660 return 0;
3661 }
3662
3663 PyErr_Clear();
3664 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3665 i = 0;
3666 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3667 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3668 r=-1;
3669 break;
3670 }
3671 }
3672 Py_DECREF(instdict);
3673 }
3674 else r=-1;
3675
3676 Py_XDECREF(value);
3677
3678 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003679}
3680
3681
3682static int
Tim Peterscba30e22003-02-01 06:24:36 +00003683load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684{
3685 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 /* Note that we split the (pickle.py) stack into two stacks, an
3688 object stack and a mark stack. Here we push a mark onto the
3689 mark stack.
3690 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003692 if ((self->num_marks + 1) >= self->marks_size) {
3693 s=self->marks_size+20;
3694 if (s <= self->num_marks) s=self->num_marks + 1;
3695 if (self->marks == NULL)
3696 self->marks=(int *)malloc(s * sizeof(int));
3697 else
Tim Peterscba30e22003-02-01 06:24:36 +00003698 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699 s * sizeof(int));
3700 if (! self->marks) {
3701 PyErr_NoMemory();
3702 return -1;
3703 }
3704 self->marks_size = s;
3705 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710}
3711
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712static int
Tim Peterscba30e22003-02-01 06:24:36 +00003713load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714{
3715 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717 PDATA_POP(self->stack, arg_tup);
3718 if (! arg_tup) return -1;
3719 PDATA_POP(self->stack, callable);
3720 if (callable) {
3721 ob = Instance_New(callable, arg_tup);
3722 Py_DECREF(callable);
3723 }
3724 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 PDATA_PUSH(self->stack, ob, -1);
3729 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730}
Tim Peters84e87f32001-03-17 04:50:51 +00003731
Guido van Rossum60456fd1997-04-09 17:36:32 +00003732static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003733load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734{
3735 PyObject *err = 0, *val = 0;
3736 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003738 self->num_marks = 0;
3739 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003741 while (1) {
3742 if ((*self->read_func)(self, &s, 1) < 0)
3743 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 switch (s[0]) {
3746 case NONE:
3747 if (load_none(self) < 0)
3748 break;
3749 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003751 case BININT:
3752 if (load_binint(self) < 0)
3753 break;
3754 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 case BININT1:
3757 if (load_binint1(self) < 0)
3758 break;
3759 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003761 case BININT2:
3762 if (load_binint2(self) < 0)
3763 break;
3764 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766 case INT:
3767 if (load_int(self) < 0)
3768 break;
3769 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003771 case LONG:
3772 if (load_long(self) < 0)
3773 break;
3774 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003776 case FLOAT:
3777 if (load_float(self) < 0)
3778 break;
3779 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 case BINFLOAT:
3782 if (load_binfloat(self) < 0)
3783 break;
3784 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003786 case BINSTRING:
3787 if (load_binstring(self) < 0)
3788 break;
3789 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003791 case SHORT_BINSTRING:
3792 if (load_short_binstring(self) < 0)
3793 break;
3794 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003796 case STRING:
3797 if (load_string(self) < 0)
3798 break;
3799 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003800
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003801#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 case UNICODE:
3803 if (load_unicode(self) < 0)
3804 break;
3805 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807 case BINUNICODE:
3808 if (load_binunicode(self) < 0)
3809 break;
3810 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003811#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003813 case EMPTY_TUPLE:
3814 if (load_empty_tuple(self) < 0)
3815 break;
3816 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 case TUPLE:
3819 if (load_tuple(self) < 0)
3820 break;
3821 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003823 case EMPTY_LIST:
3824 if (load_empty_list(self) < 0)
3825 break;
3826 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003828 case LIST:
3829 if (load_list(self) < 0)
3830 break;
3831 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003833 case EMPTY_DICT:
3834 if (load_empty_dict(self) < 0)
3835 break;
3836 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003838 case DICT:
3839 if (load_dict(self) < 0)
3840 break;
3841 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003843 case OBJ:
3844 if (load_obj(self) < 0)
3845 break;
3846 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003848 case INST:
3849 if (load_inst(self) < 0)
3850 break;
3851 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003853 case GLOBAL:
3854 if (load_global(self) < 0)
3855 break;
3856 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003858 case APPEND:
3859 if (load_append(self) < 0)
3860 break;
3861 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003863 case APPENDS:
3864 if (load_appends(self) < 0)
3865 break;
3866 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868 case BUILD:
3869 if (load_build(self) < 0)
3870 break;
3871 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003873 case DUP:
3874 if (load_dup(self) < 0)
3875 break;
3876 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003878 case BINGET:
3879 if (load_binget(self) < 0)
3880 break;
3881 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003883 case LONG_BINGET:
3884 if (load_long_binget(self) < 0)
3885 break;
3886 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003888 case GET:
3889 if (load_get(self) < 0)
3890 break;
3891 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003893 case MARK:
3894 if (load_mark(self) < 0)
3895 break;
3896 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003898 case BINPUT:
3899 if (load_binput(self) < 0)
3900 break;
3901 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003903 case LONG_BINPUT:
3904 if (load_long_binput(self) < 0)
3905 break;
3906 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908 case PUT:
3909 if (load_put(self) < 0)
3910 break;
3911 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003913 case POP:
3914 if (load_pop(self) < 0)
3915 break;
3916 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003918 case POP_MARK:
3919 if (load_pop_mark(self) < 0)
3920 break;
3921 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003923 case SETITEM:
3924 if (load_setitem(self) < 0)
3925 break;
3926 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928 case SETITEMS:
3929 if (load_setitems(self) < 0)
3930 break;
3931 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003933 case STOP:
3934 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936 case PERSID:
3937 if (load_persid(self) < 0)
3938 break;
3939 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003941 case BINPERSID:
3942 if (load_binpersid(self) < 0)
3943 break;
3944 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946 case REDUCE:
3947 if (load_reduce(self) < 0)
3948 break;
3949 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 case '\0':
3952 /* end of file */
3953 PyErr_SetNone(PyExc_EOFError);
3954 break;
Tim Peterscba30e22003-02-01 06:24:36 +00003955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956 default:
Tim Peterscba30e22003-02-01 06:24:36 +00003957 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003958 "invalid load key, '%s'.",
3959 "c", s[0]);
3960 return NULL;
3961 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 break;
3964 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966 if ((err = PyErr_Occurred())) {
3967 if (err == PyExc_EOFError) {
3968 PyErr_SetNone(PyExc_EOFError);
3969 }
3970 return NULL;
3971 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 PDATA_POP(self->stack, val);
3974 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975}
Tim Peters84e87f32001-03-17 04:50:51 +00003976
Guido van Rossum60456fd1997-04-09 17:36:32 +00003977
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003978/* No-load functions to support noload, which is used to
3979 find persistent references. */
3980
3981static int
Tim Peterscba30e22003-02-01 06:24:36 +00003982noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983{
3984 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003986 if ((i = marker(self)) < 0) return -1;
3987 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003988}
3989
3990
3991static int
Tim Peterscba30e22003-02-01 06:24:36 +00003992noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993{
3994 int i;
3995 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003997 if ((i = marker(self)) < 0) return -1;
3998 Pdata_clear(self->stack, i);
3999 if ((*self->readline_func)(self, &s) < 0) return -1;
4000 if ((*self->readline_func)(self, &s) < 0) return -1;
4001 PDATA_APPEND(self->stack, Py_None,-1);
4002 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004003}
4004
4005static int
Tim Peterscba30e22003-02-01 06:24:36 +00004006noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007{
4008 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010 if ((*self->readline_func)(self, &s) < 0) return -1;
4011 if ((*self->readline_func)(self, &s) < 0) return -1;
4012 PDATA_APPEND(self->stack, Py_None,-1);
4013 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004014}
4015
4016static int
Tim Peterscba30e22003-02-01 06:24:36 +00004017noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004020 if (self->stack->length < 2) return stackUnderflow();
4021 Pdata_clear(self->stack, self->stack->length-2);
4022 PDATA_APPEND(self->stack, Py_None,-1);
4023 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004024}
4025
4026static int
4027noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004028
Guido van Rossum053b8df1998-11-25 16:18:00 +00004029 if (self->stack->length < 1) return stackUnderflow();
4030 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004031 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004032}
4033
4034
4035static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004036noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037{
4038 PyObject *err = 0, *val = 0;
4039 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041 self->num_marks = 0;
4042 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 while (1) {
4045 if ((*self->read_func)(self, &s, 1) < 0)
4046 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048 switch (s[0]) {
4049 case NONE:
4050 if (load_none(self) < 0)
4051 break;
4052 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004054 case BININT:
4055 if (load_binint(self) < 0)
4056 break;
4057 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 case BININT1:
4060 if (load_binint1(self) < 0)
4061 break;
4062 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004064 case BININT2:
4065 if (load_binint2(self) < 0)
4066 break;
4067 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 case INT:
4070 if (load_int(self) < 0)
4071 break;
4072 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074 case LONG:
4075 if (load_long(self) < 0)
4076 break;
4077 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004079 case FLOAT:
4080 if (load_float(self) < 0)
4081 break;
4082 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 case BINFLOAT:
4085 if (load_binfloat(self) < 0)
4086 break;
4087 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089 case BINSTRING:
4090 if (load_binstring(self) < 0)
4091 break;
4092 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094 case SHORT_BINSTRING:
4095 if (load_short_binstring(self) < 0)
4096 break;
4097 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 case STRING:
4100 if (load_string(self) < 0)
4101 break;
4102 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004103
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004104#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 case UNICODE:
4106 if (load_unicode(self) < 0)
4107 break;
4108 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case BINUNICODE:
4111 if (load_binunicode(self) < 0)
4112 break;
4113 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004114#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 case EMPTY_TUPLE:
4117 if (load_empty_tuple(self) < 0)
4118 break;
4119 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 case TUPLE:
4122 if (load_tuple(self) < 0)
4123 break;
4124 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126 case EMPTY_LIST:
4127 if (load_empty_list(self) < 0)
4128 break;
4129 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 case LIST:
4132 if (load_list(self) < 0)
4133 break;
4134 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 case EMPTY_DICT:
4137 if (load_empty_dict(self) < 0)
4138 break;
4139 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 case DICT:
4142 if (load_dict(self) < 0)
4143 break;
4144 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004146 case OBJ:
4147 if (noload_obj(self) < 0)
4148 break;
4149 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004151 case INST:
4152 if (noload_inst(self) < 0)
4153 break;
4154 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004156 case GLOBAL:
4157 if (noload_global(self) < 0)
4158 break;
4159 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004161 case APPEND:
4162 if (load_append(self) < 0)
4163 break;
4164 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004166 case APPENDS:
4167 if (load_appends(self) < 0)
4168 break;
4169 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004171 case BUILD:
4172 if (noload_build(self) < 0)
4173 break;
4174 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004176 case DUP:
4177 if (load_dup(self) < 0)
4178 break;
4179 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004181 case BINGET:
4182 if (load_binget(self) < 0)
4183 break;
4184 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004186 case LONG_BINGET:
4187 if (load_long_binget(self) < 0)
4188 break;
4189 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004191 case GET:
4192 if (load_get(self) < 0)
4193 break;
4194 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 case MARK:
4197 if (load_mark(self) < 0)
4198 break;
4199 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004201 case BINPUT:
4202 if (load_binput(self) < 0)
4203 break;
4204 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 case LONG_BINPUT:
4207 if (load_long_binput(self) < 0)
4208 break;
4209 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211 case PUT:
4212 if (load_put(self) < 0)
4213 break;
4214 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 case POP:
4217 if (load_pop(self) < 0)
4218 break;
4219 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004221 case POP_MARK:
4222 if (load_pop_mark(self) < 0)
4223 break;
4224 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 case SETITEM:
4227 if (load_setitem(self) < 0)
4228 break;
4229 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 case SETITEMS:
4232 if (load_setitems(self) < 0)
4233 break;
4234 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236 case STOP:
4237 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 case PERSID:
4240 if (load_persid(self) < 0)
4241 break;
4242 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244 case BINPERSID:
4245 if (load_binpersid(self) < 0)
4246 break;
4247 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004249 case REDUCE:
4250 if (noload_reduce(self) < 0)
4251 break;
4252 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004255 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004256 "invalid load key, '%s'.",
4257 "c", s[0]);
4258 return NULL;
4259 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004261 break;
4262 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264 if ((err = PyErr_Occurred())) {
4265 if (err == PyExc_EOFError) {
4266 PyErr_SetNone(PyExc_EOFError);
4267 }
4268 return NULL;
4269 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004271 PDATA_POP(self->stack, val);
4272 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004273}
Tim Peters84e87f32001-03-17 04:50:51 +00004274
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004275
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004277Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278{
Tim Peterscba30e22003-02-01 06:24:36 +00004279 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004283}
4284
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004285static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004286Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287{
Tim Peterscba30e22003-02-01 06:24:36 +00004288 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004292}
4293
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294
4295static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004296 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004297 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004298 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004299 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004300 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004301 "noload() -- not load a pickle, but go through most of the motions\n"
4302 "\n"
4303 "This function can be used to read past a pickle without instantiating\n"
4304 "any objects or importing any modules. It can also be used to find all\n"
4305 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004306 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004307 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308 {NULL, NULL} /* sentinel */
4309};
4310
4311
4312static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004313newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314{
4315 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Tim Peterscba30e22003-02-01 06:24:36 +00004317 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320 self->file = NULL;
4321 self->arg = NULL;
4322 self->stack = (Pdata*)Pdata_New();
4323 self->pers_func = NULL;
4324 self->last_string = NULL;
4325 self->marks = NULL;
4326 self->num_marks = 0;
4327 self->marks_size = 0;
4328 self->buf_size = 0;
4329 self->read = NULL;
4330 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004332
Tim Peterscba30e22003-02-01 06:24:36 +00004333 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 Py_INCREF(f);
4337 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004339 /* Set read, readline based on type of f */
4340 if (PyFile_Check(f)) {
4341 self->fp = PyFile_AsFile(f);
4342 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004343 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004344 "I/O operation on closed file");
4345 goto err;
4346 }
4347 self->read_func = read_file;
4348 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004349 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 else if (PycStringIO_InputCheck(f)) {
4351 self->fp = NULL;
4352 self->read_func = read_cStringIO;
4353 self->readline_func = readline_cStringIO;
4354 }
4355 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 self->fp = NULL;
4358 self->read_func = read_other;
4359 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4362 (self->read = PyObject_GetAttr(f, read_str)))) {
4363 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004364 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004365 "argument must have 'read' and "
4366 "'readline' attributes" );
4367 goto err;
4368 }
4369 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 err:
4374 Py_DECREF((PyObject *)self);
4375 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004376}
4377
4378
4379static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004380get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381{
4382 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004383
Tim Peterscba30e22003-02-01 06:24:36 +00004384 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 return NULL;
4386 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004387}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004388
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004389
Guido van Rossum60456fd1997-04-09 17:36:32 +00004390static void
Tim Peterscba30e22003-02-01 06:24:36 +00004391Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392{
4393 Py_XDECREF(self->readline);
4394 Py_XDECREF(self->read);
4395 Py_XDECREF(self->file);
4396 Py_XDECREF(self->memo);
4397 Py_XDECREF(self->stack);
4398 Py_XDECREF(self->pers_func);
4399 Py_XDECREF(self->arg);
4400 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 if (self->marks) {
4403 free(self->marks);
4404 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 if (self->buf_size) {
4407 free(self->buf);
4408 }
Tim Peters84e87f32001-03-17 04:50:51 +00004409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004411}
4412
4413
4414static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004415Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416{
4417 if (!strcmp(name, "persistent_load")) {
4418 if (!self->pers_func) {
4419 PyErr_SetString(PyExc_AttributeError, name);
4420 return NULL;
4421 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 Py_INCREF(self->pers_func);
4424 return self->pers_func;
4425 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 if (!strcmp(name, "find_global")) {
4428 if (!self->find_class) {
4429 PyErr_SetString(PyExc_AttributeError, name);
4430 return NULL;
4431 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 Py_INCREF(self->find_class);
4434 return self->find_class;
4435 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 if (!strcmp(name, "memo")) {
4438 if (!self->memo) {
4439 PyErr_SetString(PyExc_AttributeError, name);
4440 return NULL;
4441 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 Py_INCREF(self->memo);
4444 return self->memo;
4445 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 if (!strcmp(name, "UnpicklingError")) {
4448 Py_INCREF(UnpicklingError);
4449 return UnpicklingError;
4450 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004453}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004454
Guido van Rossum60456fd1997-04-09 17:36:32 +00004455
4456static int
Tim Peterscba30e22003-02-01 06:24:36 +00004457Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 if (!strcmp(name, "persistent_load")) {
4461 Py_XDECREF(self->pers_func);
4462 self->pers_func = value;
4463 Py_XINCREF(value);
4464 return 0;
4465 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 if (!strcmp(name, "find_global")) {
4468 Py_XDECREF(self->find_class);
4469 self->find_class = value;
4470 Py_XINCREF(value);
4471 return 0;
4472 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 if (! value) {
4475 PyErr_SetString(PyExc_TypeError,
4476 "attribute deletion is not supported");
4477 return -1;
4478 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480 if (strcmp(name, "memo") == 0) {
4481 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004482 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004483 "memo must be a dictionary");
4484 return -1;
4485 }
4486 Py_XDECREF(self->memo);
4487 self->memo = value;
4488 Py_INCREF(value);
4489 return 0;
4490 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 PyErr_SetString(PyExc_AttributeError, name);
4493 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494}
4495
4496
4497static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004498cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499{
4500 PyObject *ob, *file, *res = NULL;
4501 Picklerobject *pickler = 0;
4502 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503
Tim Peterscba30e22003-02-01 06:24:36 +00004504 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506
Tim Peterscba30e22003-02-01 06:24:36 +00004507 if (!( pickler = newPicklerobject(file, bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004508 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 if (dump(pickler, ob) < 0)
4511 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 Py_INCREF(Py_None);
4514 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516 finally:
4517 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004520}
4521
4522
4523static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004524cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525{
4526 PyObject *ob, *file = 0, *res = NULL;
4527 Picklerobject *pickler = 0;
4528 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Tim Peterscba30e22003-02-01 06:24:36 +00004530 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Tim Peterscba30e22003-02-01 06:24:36 +00004533 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004535
Tim Peterscba30e22003-02-01 06:24:36 +00004536 if (!( pickler = newPicklerobject(file, bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 if (dump(pickler, ob) < 0)
4540 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 finally:
4545 Py_XDECREF(pickler);
4546 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004549}
4550
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004551
4552static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004553cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554{
4555 Unpicklerobject *unpickler = 0;
4556 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004557
Tim Peterscba30e22003-02-01 06:24:36 +00004558 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004560
Tim Peterscba30e22003-02-01 06:24:36 +00004561 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 finally:
4567 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004570}
4571
4572
4573static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004574cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575{
4576 PyObject *ob, *file = 0, *res = NULL;
4577 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004578
Tim Peterscba30e22003-02-01 06:24:36 +00004579 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581
Tim Peterscba30e22003-02-01 06:24:36 +00004582 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004584
Tim Peterscba30e22003-02-01 06:24:36 +00004585 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 finally:
4591 Py_XDECREF(file);
4592 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004594 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004595}
4596
4597
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004598PyDoc_STRVAR(Unpicklertype__doc__,
4599"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004600
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004601static PyTypeObject Unpicklertype = {
4602 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004603 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004604 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004605 sizeof(Unpicklerobject), /*tp_basicsize*/
4606 0, /*tp_itemsize*/
4607 /* methods */
4608 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4609 (printfunc)0, /*tp_print*/
4610 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4611 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4612 (cmpfunc)0, /*tp_compare*/
4613 (reprfunc)0, /*tp_repr*/
4614 0, /*tp_as_number*/
4615 0, /*tp_as_sequence*/
4616 0, /*tp_as_mapping*/
4617 (hashfunc)0, /*tp_hash*/
4618 (ternaryfunc)0, /*tp_call*/
4619 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004620
Guido van Rossum60456fd1997-04-09 17:36:32 +00004621 /* Space for future expansion */
4622 0L,0L,0L,0L,
4623 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004624};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004625
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004627 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004628 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004629 "Write an object in pickle format to the given file\n"
4630 "\n"
4631 "If the optional argument, binary, is provided and is true, then the\n"
4632 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004633 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004634 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004635 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004636 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004637 "Return a string containing an object in pickle format\n"
4638 "\n"
4639 "If the optional argument, binary, is provided and is true, then the\n"
4640 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004641 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004643 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004644 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004645 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004646 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004647 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004648 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004649 "\n"
4650 "If the optional argument, binary, is provided and is true, then\n"
4651 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004652 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004654 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004655 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004656 { NULL, NULL }
4657};
4658
Guido van Rossum60456fd1997-04-09 17:36:32 +00004659static int
Tim Peterscba30e22003-02-01 06:24:36 +00004660init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661{
4662 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004663
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004664#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 INIT_STR(__class__);
4667 INIT_STR(__getinitargs__);
4668 INIT_STR(__dict__);
4669 INIT_STR(__getstate__);
4670 INIT_STR(__setstate__);
4671 INIT_STR(__name__);
4672 INIT_STR(__main__);
4673 INIT_STR(__reduce__);
4674 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675 INIT_STR(append);
4676 INIT_STR(read);
4677 INIT_STR(readline);
4678 INIT_STR(copy_reg);
4679 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004681
Tim Peterscba30e22003-02-01 06:24:36 +00004682 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004684
Tim Peters1f1b2d22003-02-01 02:16:37 +00004685 /* This is special because we want to use a different
4686 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004688 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004693 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694
Tim Peterscba30e22003-02-01 06:24:36 +00004695 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 /* Ugh */
4699 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4700 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4701 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 if (!( t=PyDict_New())) return -1;
4704 if (!( r=PyRun_String(
4705 "def __init__(self, *args): self.args=args\n\n"
4706 "def __str__(self):\n"
4707 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4708 Py_file_input,
4709 module_dict, t) )) return -1;
4710 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004713 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004717
Tim Peterscba30e22003-02-01 06:24:36 +00004718 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004720 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 if (!( t=PyDict_New())) return -1;
4724 if (!( r=PyRun_String(
4725 "def __init__(self, *args): self.args=args\n\n"
4726 "def __str__(self):\n"
4727 " a=self.args\n"
4728 " a=a and type(a[0]) or '(what)'\n"
4729 " return 'Cannot pickle %s objects' % a\n"
4730 , Py_file_input,
4731 module_dict, t) )) return -1;
4732 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004735 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004741 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004743
Martin v. Löwis658009a2002-09-16 17:26:24 +00004744 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4745 UnpicklingError, NULL)))
4746 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004748 if (PyDict_SetItemString(module_dict, "PickleError",
4749 PickleError) < 0)
4750 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 if (PyDict_SetItemString(module_dict, "PicklingError",
4753 PicklingError) < 0)
4754 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4757 UnpicklingError) < 0)
4758 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4761 UnpickleableError) < 0)
4762 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4765 BadPickleGet) < 0)
4766 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004770 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004771}
4772
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004773#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4774#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004775#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004776PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00004777initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778{
4779 PyObject *m, *d, *di, *v, *k;
4780 int i;
4781 char *rev="1.71";
4782 PyObject *format_version;
4783 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 Unpicklertype.ob_type = &PyType_Type;
4787 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 /* Initialize some pieces. We need to do this before module creation,
4790 so we're forced to use a temporary dictionary. :(
4791 */
4792 di=PyDict_New();
4793 if (!di) return;
4794 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 /* Create the module and add the functions */
4797 m = Py_InitModule4("cPickle", cPickle_methods,
4798 cPickle_module_documentation,
4799 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 /* Add some symbolic constants to the module */
4802 d = PyModule_GetDict(m);
4803 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4804 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 /* Copy data from di. Waaa. */
4807 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4808 if (PyObject_SetItem(d, k, v) < 0) {
4809 Py_DECREF(di);
4810 return;
4811 }
4812 }
4813 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815 format_version = PyString_FromString("1.3");
4816 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 PyDict_SetItemString(d, "format_version", format_version);
4819 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4820 Py_XDECREF(format_version);
4821 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004822}