blob: 9cfcaea6e23f4889477b4c8a30b00fd61e0f22df [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum2f4caa41997-01-06 22:59:08 +000013#include <errno.h>
14
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000015
Guido van Rossum2f4caa41997-01-06 22:59:08 +000016
Guido van Rossum60456fd1997-04-09 17:36:32 +000017#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000018
Guido van Rossum60456fd1997-04-09 17:36:32 +000019#define WRITE_BUF_SIZE 256
20
Tim Peters797ec242003-02-01 06:22:36 +000021/*
22 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
23 * docs are in pickletools.py.
24 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000025#define MARK '('
26#define STOP '.'
27#define POP '0'
28#define POP_MARK '1'
29#define DUP '2'
30#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000032#define INT 'I'
33#define BININT 'J'
34#define BININT1 'K'
35#define LONG 'L'
36#define BININT2 'M'
37#define NONE 'N'
38#define PERSID 'P'
39#define BINPERSID 'Q'
40#define REDUCE 'R'
41#define STRING 'S'
42#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000043#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000044#define UNICODE 'V'
45#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000046#define APPEND 'a'
47#define BUILD 'b'
48#define GLOBAL 'c'
49#define DICT 'd'
50#define EMPTY_DICT '}'
51#define APPENDS 'e'
52#define GET 'g'
53#define BINGET 'h'
54#define INST 'i'
55#define LONG_BINGET 'j'
56#define LIST 'l'
57#define EMPTY_LIST ']'
58#define OBJ 'o'
59#define PUT 'p'
60#define BINPUT 'q'
61#define LONG_BINPUT 'r'
62#define SETITEM 's'
63#define TUPLE 't'
64#define EMPTY_TUPLE ')'
65#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000066
67/* Protocol 2. */
68#define PROTO '\x80' /* identify pickle protocol */
69#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
70#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
71#define EXT2 '\x83' /* ditto, but 2-byte index */
72#define EXT4 '\x84' /* ditto, but 4-byte index */
73#define TUPLE1 '\x85' /* build 1-tuple from stack top */
74#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
75#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
76#define NEWTRUE '\x88' /* push True */
77#define NEWFALSE '\x89' /* push False */
78#define LONG1 '\x8a' /* push long from < 256 bytes */
79#define LONG4 '\x8b' /* push really big long */
80
81/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
82 * so that unpicklers written before bools were introduced unpickle them
83 * as ints, but unpicklers after can recognize that bools were intended.
84 * Note that protocol 2 added direct ways to pickle bools.
85 */
Jack Jansen3a967022002-06-26 20:40:42 +000086#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000087#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000088#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000089#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000090
Guido van Rossum60456fd1997-04-09 17:36:32 +000091static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000092
Guido van Rossumc03158b1999-06-09 15:23:31 +000093static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000094static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000095static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000096static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000097static PyObject *BadPickleGet;
98
Guido van Rossum2f4caa41997-01-06 22:59:08 +000099
Guido van Rossum60456fd1997-04-09 17:36:32 +0000100static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000101static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102
Guido van Rossum60456fd1997-04-09 17:36:32 +0000103static PyObject *__class___str, *__getinitargs___str, *__dict___str,
104 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000105 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000106 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000107 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000108
Guido van Rossum053b8df1998-11-25 16:18:00 +0000109/*************************************************************************
110 Internal Data type for pickle data. */
111
112typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000113 PyObject_HEAD
114 int length, size;
115 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000116} Pdata;
117
Tim Peters84e87f32001-03-17 04:50:51 +0000118static void
Tim Peterscba30e22003-02-01 06:24:36 +0000119Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000120{
121 int i;
122 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000124 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000126 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000128 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129}
130
131static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000132 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
133 (destructor)Pdata_dealloc,
134 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000135};
136
137#define Pdata_Check(O) ((O)->ob_type == &PdataType)
138
139static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000144 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
145 self->size=8;
146 self->length=0;
147 self->data=malloc(self->size * sizeof(PyObject*));
148 if (self->data) return (PyObject*)self;
149 Py_DECREF(self);
150 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
Tim Peters84e87f32001-03-17 04:50:51 +0000153static int
Tim Peterscba30e22003-02-01 06:24:36 +0000154stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155{
156 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
157 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000158}
159
160static int
Tim Peterscba30e22003-02-01 06:24:36 +0000161Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000162{
163 int i;
164 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000166 if (clearto < 0) return stackUnderflow();
167 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000169 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
170 Py_DECREF(*p);
171 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174}
175
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 if (! self->size) {
181 PyErr_NoMemory();
182 return -1;
183 }
184 self->size *= 2;
185 self->data = realloc(self->data, self->size*sizeof(PyObject*));
186 if (! self->data) {
187 self->size = 0;
188 PyErr_NoMemory();
189 return -1;
190 }
191 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000192}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000193
194#define PDATA_POP(D,V) { \
195 if ((D)->length) V=D->data[--((D)->length)]; \
196 else { \
197 PyErr_SetString(UnpicklingError, "bad pickle data"); \
198 V=NULL; \
199 } \
200}
201
202
203static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000204Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000205{
206 PyObject *r;
207 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000209 l=self->length-start;
210 if (!( r=PyTuple_New(l))) return NULL;
211 for (i=start, j=0 ; j < l; i++, j++)
212 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000214 self->length=start;
215 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000216}
217
218static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000219Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000220{
221 PyObject *r;
222 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000224 l=self->length-start;
225 if (!( r=PyList_New(l))) return NULL;
226 for (i=start, j=0 ; j < l; i++, j++)
227 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000229 self->length=start;
230 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000231}
232
Guido van Rossum053b8df1998-11-25 16:18:00 +0000233#define PDATA_APPEND(D,O,ER) { \
234 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
235 Pdata_grow((Pdata*)(D)) < 0) \
236 return ER; \
237 Py_INCREF(O); \
238 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
239}
240
241#define PDATA_PUSH(D,O,ER) { \
242 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
243 Pdata_grow((Pdata*)(D)) < 0) { \
244 Py_DECREF(O); \
245 return ER; \
246 } \
247 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
248}
249
250/*************************************************************************/
251
252#define ARG_TUP(self, o) { \
253 if (self->arg || (self->arg=PyTuple_New(1))) { \
254 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
255 PyTuple_SET_ITEM(self->arg,0,o); \
256 } \
257 else { \
258 Py_DECREF(o); \
259 } \
260}
261
262#define FREE_ARG_TUP(self) { \
263 if (self->arg->ob_refcnt > 1) { \
264 Py_DECREF(self->arg); \
265 self->arg=NULL; \
266 } \
267 }
268
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000269typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000270 PyObject_HEAD
271 FILE *fp;
272 PyObject *write;
273 PyObject *file;
274 PyObject *memo;
275 PyObject *arg;
276 PyObject *pers_func;
277 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000278
279 /* pickle protocol number, >= 0 */
280 int proto;
281
282 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000283 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000286 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000287 int (*write_func)(struct Picklerobject *, char *, int);
288 char *write_buf;
289 int buf_size;
290 PyObject *dispatch_table;
291 int fast_container; /* count nested container dumps */
292 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000293} Picklerobject;
294
Barry Warsaw52acb492001-12-21 20:04:22 +0000295#ifndef PY_CPICKLE_FAST_LIMIT
296#define PY_CPICKLE_FAST_LIMIT 50
297#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000298
Jeremy Hylton938ace62002-07-17 16:30:39 +0000299static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000300
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000301typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 PyObject_HEAD
303 FILE *fp;
304 PyObject *file;
305 PyObject *readline;
306 PyObject *read;
307 PyObject *memo;
308 PyObject *arg;
309 Pdata *stack;
310 PyObject *mark;
311 PyObject *pers_func;
312 PyObject *last_string;
313 int *marks;
314 int num_marks;
315 int marks_size;
316 int (*read_func)(struct Unpicklerobject *, char **, int);
317 int (*readline_func)(struct Unpicklerobject *, char **);
318 int buf_size;
319 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000320 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000321} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000322
Jeremy Hylton938ace62002-07-17 16:30:39 +0000323static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000324
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000325/* Forward decls that need the above structs */
326static int save(Picklerobject *, PyObject *, int);
327static int put2(Picklerobject *, PyObject *);
328
Tim Peters84e87f32001-03-17 04:50:51 +0000329int
Tim Peterscba30e22003-02-01 06:24:36 +0000330cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000331{
332 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000334 if ((v = PyObject_GetItem(o,key))) {
335 Py_DECREF(v);
336 return 1;
337 }
Tim Peterscba30e22003-02-01 06:24:36 +0000338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 PyErr_Clear();
340 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000341}
342
Guido van Rossumd385d591997-04-09 17:47:47 +0000343static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000344PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000345cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
346{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000347 va_list va;
348 PyObject *args=0, *retval=0;
349 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000351 if (format) args = Py_VaBuildValue(format, va);
352 va_end(va);
353 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000354 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000355 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000357 if (retval) {
358 if (args) {
359 PyObject *v;
360 v=PyString_Format(retval, args);
361 Py_DECREF(retval);
362 Py_DECREF(args);
363 if (! v) return NULL;
364 retval=v;
365 }
366 }
367 else
368 if (args) retval=args;
369 else {
370 PyErr_SetObject(ErrType,Py_None);
371 return NULL;
372 }
373 PyErr_SetObject(ErrType,retval);
374 Py_DECREF(retval);
375 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000376}
377
Tim Peters84e87f32001-03-17 04:50:51 +0000378static int
Tim Peterscba30e22003-02-01 06:24:36 +0000379write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000380{
381 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000383 if (s == NULL) {
384 return 0;
385 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000388 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000390 if (nbyteswritten != (size_t)n) {
391 PyErr_SetFromErrno(PyExc_IOError);
392 return -1;
393 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000395 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000396}
397
Tim Peters84e87f32001-03-17 04:50:51 +0000398static int
Tim Peterscba30e22003-02-01 06:24:36 +0000399write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000400{
401 if (s == NULL) {
402 return 0;
403 }
Tim Peterscba30e22003-02-01 06:24:36 +0000404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000405 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
406 return -1;
407 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000409 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000410}
411
Tim Peters84e87f32001-03-17 04:50:51 +0000412static int
Tim Peterscba30e22003-02-01 06:24:36 +0000413write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000414{
415 if (s == NULL) return 0;
416 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000417}
418
Tim Peters84e87f32001-03-17 04:50:51 +0000419static int
Tim Peterscba30e22003-02-01 06:24:36 +0000420write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000421{
422 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000424 if (s == NULL) {
425 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000426 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000428 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429 return -1;
430 }
431 else {
432 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
433 if (write_other(self, NULL, 0) < 0)
434 return -1;
435 }
Tim Peterscba30e22003-02-01 06:24:36 +0000436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000437 if (n > WRITE_BUF_SIZE) {
438 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000439 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000440 return -1;
441 }
442 else {
443 memcpy(self->write_buf + self->buf_size, s, n);
444 self->buf_size += n;
445 return n;
446 }
447 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000449 if (self->write) {
450 /* object with write method */
451 ARG_TUP(self, py_str);
452 if (self->arg) {
453 junk = PyObject_Call(self->write, self->arg, NULL);
454 FREE_ARG_TUP(self);
455 }
456 if (junk) Py_DECREF(junk);
457 else return -1;
458 }
459 else
460 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462 self->buf_size = 0;
463 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464}
465
466
Tim Peters84e87f32001-03-17 04:50:51 +0000467static int
Tim Peterscba30e22003-02-01 06:24:36 +0000468read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469{
470 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000472 if (self->buf_size == 0) {
473 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000475 size = ((n < 32) ? 32 : n);
476 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
477 PyErr_NoMemory();
478 return -1;
479 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 self->buf_size = size;
482 }
483 else if (n > self->buf_size) {
484 self->buf = (char *)realloc(self->buf, n * sizeof(char));
485 if (!self->buf) {
486 PyErr_NoMemory();
487 return -1;
488 }
Tim Peters84e87f32001-03-17 04:50:51 +0000489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000490 self->buf_size = n;
491 }
Tim Peters84e87f32001-03-17 04:50:51 +0000492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000493 Py_BEGIN_ALLOW_THREADS
494 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
495 Py_END_ALLOW_THREADS
496 if (nbytesread != (size_t)n) {
497 if (feof(self->fp)) {
498 PyErr_SetNone(PyExc_EOFError);
499 return -1;
500 }
Tim Peterscba30e22003-02-01 06:24:36 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 PyErr_SetFromErrno(PyExc_IOError);
503 return -1;
504 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000508 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000509}
510
511
Tim Peters84e87f32001-03-17 04:50:51 +0000512static int
Tim Peterscba30e22003-02-01 06:24:36 +0000513readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514{
515 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 if (self->buf_size == 0) {
518 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
519 PyErr_NoMemory();
520 return -1;
521 }
Tim Peters84e87f32001-03-17 04:50:51 +0000522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 self->buf_size = 40;
524 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 i = 0;
527 while (1) {
528 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000529 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530 (self->buf[i] = getc(self->fp)) == '\n') {
531 self->buf[i + 1] = '\0';
532 *s = self->buf;
533 return i + 1;
534 }
535 }
536 self->buf = (char *)realloc(self->buf,
537 (self->buf_size * 2) * sizeof(char));
538 if (!self->buf) {
539 PyErr_NoMemory();
540 return -1;
541 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 self->buf_size *= 2;
544 }
Tim Peters84e87f32001-03-17 04:50:51 +0000545}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000546
547
Tim Peters84e87f32001-03-17 04:50:51 +0000548static int
Tim Peterscba30e22003-02-01 06:24:36 +0000549read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550{
551 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
554 PyErr_SetNone(PyExc_EOFError);
555 return -1;
556 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561}
562
563
Tim Peters84e87f32001-03-17 04:50:51 +0000564static int
Tim Peterscba30e22003-02-01 06:24:36 +0000565readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566{
567 int n;
568 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
571 return -1;
572 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577}
578
579
Tim Peters84e87f32001-03-17 04:50:51 +0000580static int
Tim Peterscba30e22003-02-01 06:24:36 +0000581read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582{
583 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000587 ARG_TUP(self, bytes);
588 if (self->arg) {
589 str = PyObject_Call(self->read, self->arg, NULL);
590 FREE_ARG_TUP(self);
591 }
592 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 Py_XDECREF(self->last_string);
595 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000597 if (! (*s = PyString_AsString(str))) return -1;
598 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000599}
600
601
Tim Peters84e87f32001-03-17 04:50:51 +0000602static int
Tim Peterscba30e22003-02-01 06:24:36 +0000603readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604{
605 PyObject *str;
606 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
609 return -1;
610 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 if ((str_size = PyString_Size(str)) < 0)
613 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000615 Py_XDECREF(self->last_string);
616 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618 if (! (*s = PyString_AsString(str)))
619 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000621 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000622}
623
624
625static char *
Tim Peterscba30e22003-02-01 06:24:36 +0000626pystrndup(char *s, int l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627{
628 char *r;
629 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
630 memcpy(r,s,l);
631 r[l]=0;
632 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633}
634
635
636static int
Tim Peterscba30e22003-02-01 06:24:36 +0000637get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000638{
639 PyObject *value, *mv;
640 long c_value;
641 char s[30];
642 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 if (!( mv = PyDict_GetItem(self->memo, id))) {
645 PyErr_SetObject(PyExc_KeyError, id);
646 return -1;
647 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000648
Tim Peterscba30e22003-02-01 06:24:36 +0000649 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000652 if (!( PyInt_Check(value))) {
653 PyErr_SetString(PicklingError, "no int where int expected in memo");
654 return -1;
655 }
656 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658 if (!self->bin) {
659 s[0] = GET;
660 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
661 len = strlen(s);
662 }
663 else if (Pdata_Check(self->file)) {
664 if (write_other(self, NULL, 0) < 0) return -1;
665 PDATA_APPEND(self->file, mv, -1);
666 return 0;
667 }
668 else {
669 if (c_value < 256) {
670 s[0] = BINGET;
671 s[1] = (int)(c_value & 0xff);
672 len = 2;
673 }
674 else {
675 s[0] = LONG_BINGET;
676 s[1] = (int)(c_value & 0xff);
677 s[2] = (int)((c_value >> 8) & 0xff);
678 s[3] = (int)((c_value >> 16) & 0xff);
679 s[4] = (int)((c_value >> 24) & 0xff);
680 len = 5;
681 }
682 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684 if ((*self->write_func)(self, s, len) < 0)
685 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000686
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000687 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000688}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000689
Guido van Rossum60456fd1997-04-09 17:36:32 +0000690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691static int
Tim Peterscba30e22003-02-01 06:24:36 +0000692put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693{
Tim Peterscba30e22003-02-01 06:24:36 +0000694 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000695 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000697 return put2(self, ob);
698}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000699
Guido van Rossum053b8df1998-11-25 16:18:00 +0000700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000701static int
Tim Peterscba30e22003-02-01 06:24:36 +0000702put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000703{
704 char c_str[30];
705 int p;
706 size_t len;
707 int res = -1;
708 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 if (self->fast)
711 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if ((p = PyDict_Size(self->memo)) < 0)
714 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 /* Make sure memo keys are positive! */
Tim Peterscba30e22003-02-01 06:24:36 +0000717 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000718
Tim Peterscba30e22003-02-01 06:24:36 +0000719 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000720 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721
Tim Peterscba30e22003-02-01 06:24:36 +0000722 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000723 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000724
Tim Peterscba30e22003-02-01 06:24:36 +0000725 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000726 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728 PyTuple_SET_ITEM(t, 0, memo_len);
729 Py_INCREF(memo_len);
730 PyTuple_SET_ITEM(t, 1, ob);
731 Py_INCREF(ob);
732
733 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
734 goto finally;
735
736 if (!self->bin) {
737 c_str[0] = PUT;
738 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
739 len = strlen(c_str);
740 }
741 else if (Pdata_Check(self->file)) {
742 if (write_other(self, NULL, 0) < 0) return -1;
743 PDATA_APPEND(self->file, memo_len, -1);
744 res=0; /* Job well done ;) */
745 goto finally;
746 }
747 else {
748 if (p >= 256) {
749 c_str[0] = LONG_BINPUT;
750 c_str[1] = (int)(p & 0xff);
751 c_str[2] = (int)((p >> 8) & 0xff);
752 c_str[3] = (int)((p >> 16) & 0xff);
753 c_str[4] = (int)((p >> 24) & 0xff);
754 len = 5;
755 }
756 else {
757 c_str[0] = BINPUT;
758 c_str[1] = p;
759 len = 2;
760 }
761 }
762
763 if ((*self->write_func)(self, c_str, len) < 0)
764 goto finally;
765
766 res = 0;
767
768 finally:
769 Py_XDECREF(py_ob_id);
770 Py_XDECREF(memo_len);
771 Py_XDECREF(t);
772
773 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000774}
775
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000776#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000777
778static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000779PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000780{
781 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
782 static PyObject *standard_builtins=0;
783 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000786 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000787 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000788 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000790 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 return NULL;
792 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 if ((globals=PyEval_GetGlobals())) {
795 Py_INCREF(globals);
796 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000797 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000798 goto err;
799 }
800 else {
801 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000804 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000805 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 __builtins__=standard_builtins;
808 Py_INCREF(__builtins__);
809 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000810 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000811 goto err;
812 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000814 if (PyDict_Check(__builtins__)) {
815 __import__=PyObject_GetItem(__builtins__,__import___str);
816 if (!__import__) goto err;
817 }
818 else {
819 __import__=PyObject_GetAttr(__builtins__,__import___str);
820 if (!__import__) goto err;
821 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000823 r=PyObject_CallFunction(__import__,"OOOO",
824 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000825 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000826 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000828 Py_DECREF(globals);
829 Py_DECREF(__builtins__);
830 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832 return r;
833 err:
834 Py_XDECREF(globals);
835 Py_XDECREF(__builtins__);
836 Py_XDECREF(__import__);
837 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000838}
839
840static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000841whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842{
843 int i, j;
844 PyObject *module = 0, *modules_dict = 0,
845 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 module = PyObject_GetAttrString(global, "__module__");
848 if (module) return module;
849 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000850
Tim Peterscba30e22003-02-01 06:24:36 +0000851 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000854 i = 0;
855 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 global_name_attr = PyObject_GetAttr(module, global_name);
860 if (!global_name_attr) {
861 PyErr_Clear();
862 continue;
863 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 if (global_name_attr != global) {
866 Py_DECREF(global_name_attr);
867 continue;
868 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000870 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000872 break;
873 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 /* The following implements the rule in pickle.py added in 1.5
876 that used __main__ if no module is found. I don't actually
877 like this rule. jlf
878 */
879 if (!j) {
880 j=1;
881 name=__main___str;
882 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 Py_INCREF(name);
885 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000886}
887
888
Guido van Rossum60456fd1997-04-09 17:36:32 +0000889static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000890fast_save_enter(Picklerobject *self, PyObject *obj)
891{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000892 /* if fast_container < 0, we're doing an error exit. */
893 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
894 PyObject *key = NULL;
895 if (self->fast_memo == NULL) {
896 self->fast_memo = PyDict_New();
897 if (self->fast_memo == NULL) {
898 self->fast_container = -1;
899 return 0;
900 }
901 }
902 key = PyLong_FromVoidPtr(obj);
903 if (key == NULL)
904 return 0;
905 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000906 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000907 PyErr_Format(PyExc_ValueError,
908 "fast mode: can't pickle cyclic objects including object type %s at %p",
909 obj->ob_type->tp_name, obj);
910 self->fast_container = -1;
911 return 0;
912 }
913 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000914 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 self->fast_container = -1;
916 return 0;
917 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000918 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000919 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000921}
922
Tim Peterscba30e22003-02-01 06:24:36 +0000923int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000924fast_save_leave(Picklerobject *self, PyObject *obj)
925{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000926 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
927 PyObject *key = PyLong_FromVoidPtr(obj);
928 if (key == NULL)
929 return 0;
930 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000931 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return 0;
933 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000934 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000935 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000937}
938
939static int
Tim Peterscba30e22003-02-01 06:24:36 +0000940save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941{
942 static char none = NONE;
943 if ((*self->write_func)(self, &none, 1) < 0)
944 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000947}
948
Guido van Rossum77f6a652002-04-03 22:41:51 +0000949static int
Tim Peterscba30e22003-02-01 06:24:36 +0000950save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000951{
Guido van Rossume2763392002-04-05 19:30:08 +0000952 static char *buf[2] = {FALSE, TRUE};
953 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000954 long l = PyInt_AS_LONG((PyIntObject *)args);
955
Guido van Rossume2763392002-04-05 19:30:08 +0000956 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000957 return -1;
958
959 return 0;
960}
Tim Peters84e87f32001-03-17 04:50:51 +0000961
Guido van Rossum60456fd1997-04-09 17:36:32 +0000962static int
Tim Peterscba30e22003-02-01 06:24:36 +0000963save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000964{
965 char c_str[32];
966 long l = PyInt_AS_LONG((PyIntObject *)args);
967 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000969 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000970#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 || l > 0x7fffffffL
972 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000973#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000974 ) {
975 /* Text-mode pickle, or long too big to fit in the 4-byte
976 * signed BININT format: store as a string.
977 */
978 c_str[0] = INT;
979 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
980 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
981 return -1;
982 }
983 else {
984 /* Binary pickle and l fits in a signed 4-byte int. */
985 c_str[1] = (int)( l & 0xff);
986 c_str[2] = (int)((l >> 8) & 0xff);
987 c_str[3] = (int)((l >> 16) & 0xff);
988 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000990 if ((c_str[4] == 0) && (c_str[3] == 0)) {
991 if (c_str[2] == 0) {
992 c_str[0] = BININT1;
993 len = 2;
994 }
995 else {
996 c_str[0] = BININT2;
997 len = 3;
998 }
999 }
1000 else {
1001 c_str[0] = BININT;
1002 len = 5;
1003 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 if ((*self->write_func)(self, c_str, len) < 0)
1006 return -1;
1007 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010}
1011
1012
1013static int
Tim Peterscba30e22003-02-01 06:24:36 +00001014save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015{
1016 int size, res = -1;
1017 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020
Tim Peterscba30e22003-02-01 06:24:36 +00001021 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001022 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 if ((size = PyString_Size(repr)) < 0)
1025 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001027 if ((*self->write_func)(self, &l, 1) < 0)
1028 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001031 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001032 size) < 0)
1033 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 if ((*self->write_func)(self, "\n", 1) < 0)
1036 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001038 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040 finally:
1041 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001043 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044}
1045
1046
1047static int
Tim Peterscba30e22003-02-01 06:24:36 +00001048save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001049{
1050 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001052 if (self->bin) {
1053 int s, e;
1054 double f;
1055 long fhi, flo;
1056 char str[9];
1057 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001059 *p = BINFLOAT;
1060 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001062 if (x < 0) {
1063 s = 1;
1064 x = -x;
1065 }
1066 else
1067 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001071 /* Normalize f to be in the range [1.0, 2.0) */
1072 if (0.5 <= f && f < 1.0) {
1073 f *= 2.0;
1074 e--;
1075 }
1076 else if (f == 0.0) {
1077 e = 0;
1078 }
1079 else {
1080 PyErr_SetString(PyExc_SystemError,
1081 "frexp() result out of range");
1082 return -1;
1083 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001085 if (e >= 1024) {
1086 /* XXX 1024 itself is reserved for Inf/NaN */
1087 PyErr_SetString(PyExc_OverflowError,
1088 "float too large to pack with d format");
1089 return -1;
1090 }
1091 else if (e < -1022) {
1092 /* Gradual underflow */
1093 f = ldexp(f, 1022 + e);
1094 e = 0;
1095 }
1096 else if (!(e == 0 && f == 0.0)) {
1097 e += 1023;
1098 f -= 1.0; /* Get rid of leading 1 */
1099 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001100
Tim Peterscba30e22003-02-01 06:24:36 +00001101 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001102 flo the low 24 bits (== 52 bits) */
1103 f *= 268435456.0; /* 2**28 */
1104 fhi = (long) floor(f); /* Truncate */
1105 f -= (double)fhi;
1106 f *= 16777216.0; /* 2**24 */
1107 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 /* First byte */
1110 *p = (s<<7) | (e>>4);
1111 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001113 /* Second byte */
1114 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1115 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 /* Third byte */
1118 *p = (unsigned char) ((fhi>>16) & 0xFF);
1119 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 /* Fourth byte */
1122 *p = (unsigned char) ((fhi>>8) & 0xFF);
1123 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 /* Fifth byte */
1126 *p = (unsigned char) (fhi & 0xFF);
1127 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 /* Sixth byte */
1130 *p = (unsigned char) ((flo>>16) & 0xFF);
1131 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001133 /* Seventh byte */
1134 *p = (unsigned char) ((flo>>8) & 0xFF);
1135 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 /* Eighth byte */
1138 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 if ((*self->write_func)(self, str, 9) < 0)
1141 return -1;
1142 }
1143 else {
1144 char c_str[250];
1145 c_str[0] = FLOAT;
1146 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1149 return -1;
1150 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153}
1154
1155
1156static int
Tim Peterscba30e22003-02-01 06:24:36 +00001157save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158{
1159 int size, len;
1160 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001162 if ((size = PyString_Size(args)) < 0)
1163 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 if (!self->bin) {
1166 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Tim Peterscba30e22003-02-01 06:24:36 +00001170 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if ((len = PyString_Size(repr)) < 0)
1174 goto err;
1175 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001177 if ((*self->write_func)(self, &string, 1) < 0)
1178 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 if ((*self->write_func)(self, repr_str, len) < 0)
1181 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001183 if ((*self->write_func)(self, "\n", 1) < 0)
1184 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001186 Py_XDECREF(repr);
1187 }
1188 else {
1189 int i;
1190 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 if ((size = PyString_Size(args)) < 0)
1193 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 if (size < 256) {
1196 c_str[0] = SHORT_BINSTRING;
1197 c_str[1] = size;
1198 len = 2;
1199 }
1200 else {
1201 c_str[0] = BINSTRING;
1202 for (i = 1; i < 5; i++)
1203 c_str[i] = (int)(size >> ((i - 1) * 8));
1204 len = 5;
1205 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 if ((*self->write_func)(self, c_str, len) < 0)
1208 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 if (size > 128 && Pdata_Check(self->file)) {
1211 if (write_other(self, NULL, 0) < 0) return -1;
1212 PDATA_APPEND(self->file, args, -1);
1213 }
1214 else {
1215 if ((*self->write_func)(self,
1216 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1217 return -1;
1218 }
1219 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 if (doput)
1222 if (put(self, args) < 0)
1223 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 err:
1228 Py_XDECREF(repr);
1229 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230}
1231
1232
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001233#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001234/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1235 backslash and newline characters to \uXXXX escapes. */
1236static PyObject *
1237modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1238{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 PyObject *repr;
1240 char *p;
1241 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 repr = PyString_FromStringAndSize(NULL, 6 * size);
1246 if (repr == NULL)
1247 return NULL;
1248 if (size == 0)
1249 return repr;
1250
1251 p = q = PyString_AS_STRING(repr);
1252 while (size-- > 0) {
1253 Py_UNICODE ch = *s++;
1254 /* Map 16-bit characters to '\uxxxx' */
1255 if (ch >= 256 || ch == '\\' || ch == '\n') {
1256 *p++ = '\\';
1257 *p++ = 'u';
1258 *p++ = hexdigit[(ch >> 12) & 0xf];
1259 *p++ = hexdigit[(ch >> 8) & 0xf];
1260 *p++ = hexdigit[(ch >> 4) & 0xf];
1261 *p++ = hexdigit[ch & 15];
1262 }
1263 /* Copy everything else as-is */
1264 else
1265 *p++ = (char) ch;
1266 }
1267 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001268 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001269 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001270}
1271
1272
Guido van Rossum60456fd1997-04-09 17:36:32 +00001273static int
Tim Peterscba30e22003-02-01 06:24:36 +00001274save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275{
1276 int size, len;
1277 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 if (!PyUnicode_Check(args))
1280 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282 if (!self->bin) {
1283 char *repr_str;
1284 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001286 repr = modified_EncodeRawUnicodeEscape(
1287 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001288 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001289 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((len = PyString_Size(repr)) < 0)
1292 goto err;
1293 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001295 if ((*self->write_func)(self, &string, 1) < 0)
1296 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 if ((*self->write_func)(self, repr_str, len) < 0)
1299 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 if ((*self->write_func)(self, "\n", 1) < 0)
1302 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 Py_XDECREF(repr);
1305 }
1306 else {
1307 int i;
1308 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001309
Tim Peterscba30e22003-02-01 06:24:36 +00001310 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 if ((size = PyString_Size(repr)) < 0)
1314 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 c_str[0] = BINUNICODE;
1317 for (i = 1; i < 5; i++)
1318 c_str[i] = (int)(size >> ((i - 1) * 8));
1319 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 if ((*self->write_func)(self, c_str, len) < 0)
1322 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 if (size > 128 && Pdata_Check(self->file)) {
1325 if (write_other(self, NULL, 0) < 0)
1326 goto err;
1327 PDATA_APPEND(self->file, repr, -1);
1328 }
1329 else {
1330 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1331 size) < 0)
1332 goto err;
1333 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 Py_DECREF(repr);
1336 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 if (doput)
1339 if (put(self, args) < 0)
1340 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 err:
1345 Py_XDECREF(repr);
1346 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001347}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001348#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001349
1350
1351static int
Tim Peterscba30e22003-02-01 06:24:36 +00001352save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353{
1354 PyObject *element = 0, *py_tuple_id = 0;
1355 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 if ((*self->write_func)(self, &MARKv, 1) < 0)
1360 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 if ((len = PyTuple_Size(args)) < 0)
1363 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001366 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 if (save(self, element, 0) < 0)
1370 goto finally;
1371 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001372
Tim Peterscba30e22003-02-01 06:24:36 +00001373 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001376 if (len) {
1377 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1378 if (self->bin) {
1379 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1382 goto finally;
1383 }
1384 else {
1385 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001387 for (i = 0; i <= len; i++) {
1388 if ((*self->write_func)(self, &pop, 1) < 0)
1389 goto finally;
1390 }
1391 }
Tim Peters84e87f32001-03-17 04:50:51 +00001392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 if (get(self, py_tuple_id) < 0)
1394 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 res = 0;
1397 goto finally;
1398 }
1399 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 if ((*self->write_func)(self, &tuple, 1) < 0) {
1402 goto finally;
1403 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405 if (put(self, args) < 0)
1406 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 finally:
1411 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001414}
1415
1416static int
Tim Peterscba30e22003-02-01 06:24:36 +00001417save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418{
1419 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001422}
1423
1424
1425static int
Tim Peterscba30e22003-02-01 06:24:36 +00001426save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427{
1428 PyObject *element = 0;
1429 int s_len, len, i, using_appends, res = -1;
1430 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001432 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 if (self->fast && !fast_save_enter(self, args))
1435 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 if (self->bin) {
1438 s[0] = EMPTY_LIST;
1439 s_len = 1;
1440 }
1441 else {
1442 s[0] = MARK;
1443 s[1] = LIST;
1444 s_len = 2;
1445 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 if ((len = PyList_Size(args)) < 0)
1448 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 if ((*self->write_func)(self, s, s_len) < 0)
1451 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 if (len == 0) {
1454 if (put(self, args) < 0)
1455 goto finally;
1456 }
1457 else {
1458 if (put2(self, args) < 0)
1459 goto finally;
1460 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 if ((using_appends = (self->bin && (len > 1))))
1463 if ((*self->write_func)(self, &MARKv, 1) < 0)
1464 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001467 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001468 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 if (save(self, element, 0) < 0)
1471 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 if (!using_appends) {
1474 if ((*self->write_func)(self, &append, 1) < 0)
1475 goto finally;
1476 }
1477 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 if (using_appends) {
1480 if ((*self->write_func)(self, &appends, 1) < 0)
1481 goto finally;
1482 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001484 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001486 finally:
1487 if (self->fast && !fast_save_leave(self, args))
1488 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001491}
1492
1493
Guido van Rossum60456fd1997-04-09 17:36:32 +00001494static int
Tim Peterscba30e22003-02-01 06:24:36 +00001495save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496{
1497 PyObject *key = 0, *value = 0;
1498 int i, len, res = -1, using_setitems;
1499 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 if (self->fast && !fast_save_enter(self, args))
1504 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 if (self->bin) {
1507 s[0] = EMPTY_DICT;
1508 len = 1;
1509 }
1510 else {
1511 s[0] = MARK;
1512 s[1] = DICT;
1513 len = 2;
1514 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001516 if ((*self->write_func)(self, s, len) < 0)
1517 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519 if ((len = PyDict_Size(args)) < 0)
1520 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522 if (len == 0) {
1523 if (put(self, args) < 0)
1524 goto finally;
1525 }
1526 else {
1527 if (put2(self, args) < 0)
1528 goto finally;
1529 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001531 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1532 if ((*self->write_func)(self, &MARKv, 1) < 0)
1533 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001535 i = 0;
1536 while (PyDict_Next(args, &i, &key, &value)) {
1537 if (save(self, key, 0) < 0)
1538 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001540 if (save(self, value, 0) < 0)
1541 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001543 if (!using_setitems) {
1544 if ((*self->write_func)(self, &setitem, 1) < 0)
1545 goto finally;
1546 }
1547 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001549 if (using_setitems) {
1550 if ((*self->write_func)(self, &setitems, 1) < 0)
1551 goto finally;
1552 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001554 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 finally:
1557 if (self->fast && !fast_save_leave(self, args))
1558 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001560 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561}
1562
1563
Tim Peters84e87f32001-03-17 04:50:51 +00001564static int
Tim Peterscba30e22003-02-01 06:24:36 +00001565save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001566{
1567 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1568 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1569 char *module_str, *name_str;
1570 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001572 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001574 if (self->fast && !fast_save_enter(self, args))
1575 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001577 if ((*self->write_func)(self, &MARKv, 1) < 0)
1578 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001579
Tim Peterscba30e22003-02-01 06:24:36 +00001580 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001583 if (self->bin) {
1584 if (save(self, class, 0) < 0)
1585 goto finally;
1586 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001588 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1589 PyObject *element = 0;
1590 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001593 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 if ((len = PyObject_Size(class_args)) < 0)
1597 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001600 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 if (save(self, element, 0) < 0) {
1604 Py_DECREF(element);
1605 goto finally;
1606 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 Py_DECREF(element);
1609 }
1610 }
1611 else {
1612 PyErr_Clear();
1613 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001615 if (!self->bin) {
1616 if (!( name = ((PyClassObject *)class)->cl_name )) {
1617 PyErr_SetString(PicklingError, "class has no name");
1618 goto finally;
1619 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001620
Tim Peterscba30e22003-02-01 06:24:36 +00001621 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001623
Tim Peters84e87f32001-03-17 04:50:51 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if ((module_size = PyString_Size(module)) < 0 ||
1626 (name_size = PyString_Size(name)) < 0)
1627 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 module_str = PyString_AS_STRING((PyStringObject *)module);
1630 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 if ((*self->write_func)(self, &inst, 1) < 0)
1633 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001635 if ((*self->write_func)(self, module_str, module_size) < 0)
1636 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001638 if ((*self->write_func)(self, "\n", 1) < 0)
1639 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 if ((*self->write_func)(self, name_str, name_size) < 0)
1642 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 if ((*self->write_func)(self, "\n", 1) < 0)
1645 goto finally;
1646 }
1647 else if ((*self->write_func)(self, &obj, 1) < 0) {
1648 goto finally;
1649 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1652 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001653 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 goto finally;
1655 }
1656 else {
1657 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001659 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1660 PyErr_Clear();
1661 res = 0;
1662 goto finally;
1663 }
1664 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001666 if (!PyDict_Check(state)) {
1667 if (put2(self, args) < 0)
1668 goto finally;
1669 }
1670 else {
1671 if (put(self, args) < 0)
1672 goto finally;
1673 }
Tim Peters84e87f32001-03-17 04:50:51 +00001674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 if (save(self, state, 0) < 0)
1676 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 if ((*self->write_func)(self, &build, 1) < 0)
1679 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001681 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 finally:
1684 if (self->fast && !fast_save_leave(self, args))
1685 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 Py_XDECREF(module);
1688 Py_XDECREF(class);
1689 Py_XDECREF(state);
1690 Py_XDECREF(getinitargs_func);
1691 Py_XDECREF(getstate_func);
1692 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001695}
1696
1697
Guido van Rossum60456fd1997-04-09 17:36:32 +00001698static int
Tim Peterscba30e22003-02-01 06:24:36 +00001699save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001701 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001702 char *name_str, *module_str;
1703 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001705 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 if (name) {
1708 global_name = name;
1709 Py_INCREF(global_name);
1710 }
1711 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001712 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 goto finally;
1714 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001715
Tim Peterscba30e22003-02-01 06:24:36 +00001716 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001717 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 if ((module_size = PyString_Size(module)) < 0 ||
1720 (name_size = PyString_Size(global_name)) < 0)
1721 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001723 module_str = PyString_AS_STRING((PyStringObject *)module);
1724 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001725
Guido van Rossum75bfd052002-12-24 18:10:07 +00001726 /* XXX This can be doing a relative import. Clearly it shouldn't,
1727 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001728 mod = PyImport_ImportModule(module_str);
1729 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 cPickle_ErrFormat(PicklingError,
1731 "Can't pickle %s: it's not found as %s.%s",
1732 "OSS", args, module, global_name);
1733 goto finally;
1734 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001735 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 if (klass == NULL) {
1737 cPickle_ErrFormat(PicklingError,
1738 "Can't pickle %s: it's not found as %s.%s",
1739 "OSS", args, module, global_name);
1740 goto finally;
1741 }
1742 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001743 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 cPickle_ErrFormat(PicklingError,
1745 "Can't pickle %s: it's not the same object as %s.%s",
1746 "OSS", args, module, global_name);
1747 goto finally;
1748 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001749 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751 if ((*self->write_func)(self, &global, 1) < 0)
1752 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754 if ((*self->write_func)(self, module_str, module_size) < 0)
1755 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 if ((*self->write_func)(self, "\n", 1) < 0)
1758 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001760 if ((*self->write_func)(self, name_str, name_size) < 0)
1761 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 if ((*self->write_func)(self, "\n", 1) < 0)
1764 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 if (put(self, args) < 0)
1767 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001769 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001771 finally:
1772 Py_XDECREF(module);
1773 Py_XDECREF(global_name);
1774 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777}
1778
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779static int
Tim Peterscba30e22003-02-01 06:24:36 +00001780save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781{
1782 PyObject *pid = 0;
1783 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001787 Py_INCREF(args);
1788 ARG_TUP(self, args);
1789 if (self->arg) {
1790 pid = PyObject_Call(f, self->arg, NULL);
1791 FREE_ARG_TUP(self);
1792 }
1793 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 if (pid != Py_None) {
1796 if (!self->bin) {
1797 if (!PyString_Check(pid)) {
1798 PyErr_SetString(PicklingError,
1799 "persistent id must be string");
1800 goto finally;
1801 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 if ((*self->write_func)(self, &persid, 1) < 0)
1804 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 if ((size = PyString_Size(pid)) < 0)
1807 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 if ((*self->write_func)(self,
1810 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1811 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 if ((*self->write_func)(self, "\n", 1) < 0)
1814 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 res = 1;
1817 goto finally;
1818 }
1819 else if (save(self, pid, 1) >= 0) {
1820 if ((*self->write_func)(self, &binpersid, 1) < 0)
1821 res = -1;
1822 else
1823 res = 1;
1824 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
1827 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 finally:
1832 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001835}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001836
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001837
Tim Peters84e87f32001-03-17 04:50:51 +00001838static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001839save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001840 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001841{
1842 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001844 if (save(self, callable, 0) < 0)
1845 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001847 if (save(self, tup, 0) < 0)
1848 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 if ((*self->write_func)(self, &reduce, 1) < 0)
1851 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853 if (ob != NULL) {
1854 if (state && !PyDict_Check(state)) {
1855 if (put2(self, ob) < 0)
1856 return -1;
1857 }
1858 else {
1859 if (put(self, ob) < 0)
1860 return -1;
1861 }
1862 }
Tim Peters84e87f32001-03-17 04:50:51 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 if (state) {
1865 if (save(self, state, 0) < 0)
1866 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 if ((*self->write_func)(self, &build, 1) < 0)
1869 return -1;
1870 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001872 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001873}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001874
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875static int
Tim Peterscba30e22003-02-01 06:24:36 +00001876save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877{
1878 PyTypeObject *type;
1879 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1880 *callable = 0, *state = 0;
1881 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001882
Martin v. Löwis5a395302002-08-04 08:20:23 +00001883 if (self->nesting++ > Py_GetRecursionLimit()){
1884 PyErr_SetString(PyExc_RuntimeError,
1885 "maximum recursion depth exceeded");
1886 goto finally;
1887 }
1888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 if (!pers_save && self->pers_func) {
1890 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1891 res = tmp;
1892 goto finally;
1893 }
1894 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001896 if (args == Py_None) {
1897 res = save_none(self, args);
1898 goto finally;
1899 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001903 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001904 case 'b':
1905 if (args == Py_False || args == Py_True) {
1906 res = save_bool(self, args);
1907 goto finally;
1908 }
1909 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001910 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001911 if (type == &PyInt_Type) {
1912 res = save_int(self, args);
1913 goto finally;
1914 }
1915 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001916
Guido van Rossum60456fd1997-04-09 17:36:32 +00001917 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001918 if (type == &PyLong_Type) {
1919 res = save_long(self, args);
1920 goto finally;
1921 }
1922 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Guido van Rossum60456fd1997-04-09 17:36:32 +00001924 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 if (type == &PyFloat_Type) {
1926 res = save_float(self, args);
1927 goto finally;
1928 }
1929 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001930
Guido van Rossum60456fd1997-04-09 17:36:32 +00001931 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1933 if (self->bin) res = save_empty_tuple(self, args);
1934 else res = save_tuple(self, args);
1935 goto finally;
1936 }
1937 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Guido van Rossum60456fd1997-04-09 17:36:32 +00001939 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1941 res = save_string(self, args, 0);
1942 goto finally;
1943 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001944
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001945#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001946 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1948 res = save_unicode(self, args, 0);
1949 goto finally;
1950 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001951#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00001955 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if (PyDict_GetItem(self->memo, py_ob_id)) {
1959 if (get(self, py_ob_id) < 0)
1960 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 res = 0;
1963 goto finally;
1964 }
1965 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001968 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 if (type == &PyString_Type) {
1970 res = save_string(self, args, 1);
1971 goto finally;
1972 }
1973 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001974
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001975#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001976 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001977 if (type == &PyUnicode_Type) {
1978 res = save_unicode(self, args, 1);
1979 goto finally;
1980 }
1981 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001982#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001983
Guido van Rossum60456fd1997-04-09 17:36:32 +00001984 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 if (type == &PyTuple_Type) {
1986 res = save_tuple(self, args);
1987 goto finally;
1988 }
1989 if (type == &PyType_Type) {
1990 res = save_global(self, args, NULL);
1991 goto finally;
1992 }
1993 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001994
Guido van Rossum60456fd1997-04-09 17:36:32 +00001995 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 if (type == &PyList_Type) {
1997 res = save_list(self, args);
1998 goto finally;
1999 }
2000 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002001
2002 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002003 if (type == &PyDict_Type) {
2004 res = save_dict(self, args);
2005 goto finally;
2006 }
2007 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002008
2009 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002010 if (type == &PyInstance_Type) {
2011 res = save_inst(self, args);
2012 goto finally;
2013 }
2014 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015
2016 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 if (type == &PyClass_Type) {
2018 res = save_global(self, args, NULL);
2019 goto finally;
2020 }
2021 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002022
2023 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 if (type == &PyFunction_Type) {
2025 res = save_global(self, args, NULL);
2026 goto finally;
2027 }
2028 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002029
2030 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 if (type == &PyCFunction_Type) {
2032 res = save_global(self, args, NULL);
2033 goto finally;
2034 }
2035 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002037 if (!pers_save && self->inst_pers_func) {
2038 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2039 res = tmp;
2040 goto finally;
2041 }
2042 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
Jeremy Hylton39c61162002-07-16 19:47:43 +00002044 if (PyType_IsSubtype(type, &PyType_Type)) {
2045 res = save_global(self, args, NULL);
2046 goto finally;
2047 }
2048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002049 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2050 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002052 Py_INCREF(args);
2053 ARG_TUP(self, args);
2054 if (self->arg) {
2055 t = PyObject_Call(__reduce__, self->arg, NULL);
2056 FREE_ARG_TUP(self);
2057 }
2058 if (! t) goto finally;
2059 }
2060 else {
2061 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2064 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002065 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 goto finally;
2067 }
2068 else {
2069 PyErr_Clear();
2070 }
2071 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002073 if (t) {
2074 if (PyString_Check(t)) {
2075 res = save_global(self, args, t);
2076 goto finally;
2077 }
Tim Peters84e87f32001-03-17 04:50:51 +00002078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002079 if (!PyTuple_Check(t)) {
2080 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2081 "be a tuple", "O", __reduce__);
2082 goto finally;
2083 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if ((size != 3) && (size != 2)) {
2088 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2089 "contain only two or three elements", "O", __reduce__);
2090 goto finally;
2091 }
Tim Peters84e87f32001-03-17 04:50:51 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 if (size > 2) {
2098 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002099 if (state == Py_None)
2100 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2104 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2105 "returned by %s must be a tuple", "O", __reduce__);
2106 goto finally;
2107 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 res = save_reduce(self, callable, arg_tup, state, args);
2110 goto finally;
2111 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002113 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002116 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 Py_XDECREF(py_ob_id);
2118 Py_XDECREF(__reduce__);
2119 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002122}
2123
2124
2125static int
Tim Peterscba30e22003-02-01 06:24:36 +00002126dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127{
2128 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130 if (save(self, args, 0) < 0)
2131 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133 if ((*self->write_func)(self, &stop, 1) < 0)
2134 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002136 if ((*self->write_func)(self, NULL, 0) < 0)
2137 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002140}
2141
2142static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002143Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144{
Tim Peterscba30e22003-02-01 06:24:36 +00002145 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 PyDict_Clear(self->memo);
2147 Py_INCREF(Py_None);
2148 return Py_None;
2149}
2150
2151static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002152Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002153{
2154 int l, i, rsize, ssize, clear=1, lm;
2155 long ik;
2156 PyObject *k, *r;
2157 char *s, *p, *have_get;
2158 Pdata *data;
2159
2160 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002161 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 return NULL;
2163
2164 /* Check to make sure we are based on a list */
2165 if (! Pdata_Check(self->file)) {
2166 PyErr_SetString(PicklingError,
2167 "Attempt to getvalue() a non-list-based pickler");
2168 return NULL;
2169 }
2170
2171 /* flush write buffer */
2172 if (write_other(self, NULL, 0) < 0) return NULL;
2173
2174 data=(Pdata*)self->file;
2175 l=data->length;
2176
2177 /* set up an array to hold get/put status */
2178 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2179 lm++;
2180 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2181 memset(have_get,0,lm);
2182
2183 /* Scan for gets. */
2184 for (rsize=0, i=l; --i >= 0; ) {
2185 k=data->data[i];
2186
2187 if (PyString_Check(k)) {
2188 rsize += PyString_GET_SIZE(k);
2189 }
2190
2191 else if (PyInt_Check(k)) { /* put */
2192 ik=PyInt_AS_LONG((PyIntObject*)k);
2193 if (ik >= lm || ik==0) {
2194 PyErr_SetString(PicklingError,
2195 "Invalid get data");
2196 return NULL;
2197 }
2198 if (have_get[ik]) { /* with matching get */
2199 if (ik < 256) rsize += 2;
2200 else rsize+=5;
2201 }
2202 }
2203
2204 else if (! (PyTuple_Check(k) &&
2205 PyTuple_GET_SIZE(k) == 2 &&
2206 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2207 ) {
2208 PyErr_SetString(PicklingError,
2209 "Unexpected data in internal list");
2210 return NULL;
2211 }
2212
2213 else { /* put */
2214 ik=PyInt_AS_LONG((PyIntObject*)k);
2215 if (ik >= lm || ik==0) {
2216 PyErr_SetString(PicklingError,
2217 "Invalid get data");
2218 return NULL;
2219 }
2220 have_get[ik]=1;
2221 if (ik < 256) rsize += 2;
2222 else rsize+=5;
2223 }
2224
2225 }
2226
2227 /* Now generate the result */
2228 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2229 s=PyString_AS_STRING((PyStringObject*)r);
2230
2231 for (i=0; i<l; i++) {
2232 k=data->data[i];
2233
2234 if (PyString_Check(k)) {
2235 ssize=PyString_GET_SIZE(k);
2236 if (ssize) {
2237 p=PyString_AS_STRING((PyStringObject*)k);
2238 while (--ssize >= 0) *s++=*p++;
2239 }
2240 }
2241
2242 else if (PyTuple_Check(k)) { /* get */
2243 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2244 if (ik < 256) {
2245 *s++ = BINGET;
2246 *s++ = (int)(ik & 0xff);
2247 }
2248 else {
2249 *s++ = LONG_BINGET;
2250 *s++ = (int)(ik & 0xff);
2251 *s++ = (int)((ik >> 8) & 0xff);
2252 *s++ = (int)((ik >> 16) & 0xff);
2253 *s++ = (int)((ik >> 24) & 0xff);
2254 }
2255 }
2256
2257 else { /* put */
2258 ik=PyInt_AS_LONG((PyIntObject*)k);
2259
2260 if (have_get[ik]) { /* with matching get */
2261 if (ik < 256) {
2262 *s++ = BINPUT;
2263 *s++ = (int)(ik & 0xff);
2264 }
2265 else {
2266 *s++ = LONG_BINPUT;
2267 *s++ = (int)(ik & 0xff);
2268 *s++ = (int)((ik >> 8) & 0xff);
2269 *s++ = (int)((ik >> 16) & 0xff);
2270 *s++ = (int)((ik >> 24) & 0xff);
2271 }
2272 }
2273 }
2274
2275 }
2276
2277 if (clear) {
2278 PyDict_Clear(self->memo);
2279 Pdata_clear(data,0);
2280 }
2281
2282 free(have_get);
2283 return r;
2284 err:
2285 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002286 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002287}
2288
2289static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002290Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291{
2292 PyObject *ob;
2293 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002294
Tim Peterscba30e22003-02-01 06:24:36 +00002295 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 if (dump(self, ob) < 0)
2299 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 /* XXX Why does dump() return self? */
2304 Py_INCREF(self);
2305 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002306}
2307
2308
Tim Peterscba30e22003-02-01 06:24:36 +00002309static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002310{
Neal Norwitzb0493252002-03-31 14:44:22 +00002311 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002312 PyDoc_STR("dump(object) -- "
2313 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002314 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002315 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002316 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002317 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002318 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002319};
2320
2321
2322static Picklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00002323newPicklerobject(PyObject *file, int bin)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324{
2325 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002326
Tim Peterscba30e22003-02-01 06:24:36 +00002327 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 self->fp = NULL;
2331 self->write = NULL;
2332 self->memo = NULL;
2333 self->arg = NULL;
2334 self->pers_func = NULL;
2335 self->inst_pers_func = NULL;
2336 self->write_buf = NULL;
2337 self->bin = bin;
2338 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002339 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 self->fast_container = 0;
2341 self->fast_memo = NULL;
2342 self->buf_size = 0;
2343 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002345 if (file)
2346 Py_INCREF(file);
2347 else
2348 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002349
Tim Peterscba30e22003-02-01 06:24:36 +00002350 if (!( self->file = file ))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002351 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002352
Tim Peterscba30e22003-02-01 06:24:36 +00002353 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002354 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 if (PyFile_Check(file)) {
2357 self->fp = PyFile_AsFile(file);
2358 if (self->fp == NULL) {
2359 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2360 goto err;
2361 }
2362 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002363 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 else if (PycStringIO_OutputCheck(file)) {
2365 self->write_func = write_cStringIO;
2366 }
2367 else if (file == Py_None) {
2368 self->write_func = write_none;
2369 }
2370 else {
2371 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373 if (! Pdata_Check(file)) {
2374 self->write = PyObject_GetAttr(file, write_str);
2375 if (!self->write) {
2376 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002377 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378 "argument must have 'write' "
2379 "attribute");
2380 goto err;
2381 }
2382 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 if (!( self->write_buf =
2385 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2386 PyErr_NoMemory();
2387 goto err;
2388 }
2389 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 if (PyEval_GetRestricted()) {
2392 /* Restricted execution, get private tables */
2393 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2396 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2397 Py_DECREF(m);
2398 if (!( self->dispatch_table )) goto err;
2399 }
2400 else {
2401 self->dispatch_table=dispatch_table;
2402 Py_INCREF(dispatch_table);
2403 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 err:
2408 Py_DECREF((PyObject *)self);
2409 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002410}
2411
2412
2413static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002414get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415{
2416 PyObject *file = NULL;
2417 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2420 PyErr_Clear();
2421 bin = 0;
2422 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2423 return NULL;
2424 }
2425 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002426}
2427
2428
2429static void
Tim Peterscba30e22003-02-01 06:24:36 +00002430Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431{
2432 Py_XDECREF(self->write);
2433 Py_XDECREF(self->memo);
2434 Py_XDECREF(self->fast_memo);
2435 Py_XDECREF(self->arg);
2436 Py_XDECREF(self->file);
2437 Py_XDECREF(self->pers_func);
2438 Py_XDECREF(self->inst_pers_func);
2439 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 if (self->write_buf) {
2442 free(self->write_buf);
2443 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002445 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002446}
2447
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002448static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002449Pickler_get_pers_func(Picklerobject *p)
2450{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451 if (p->pers_func == NULL)
2452 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2453 else
2454 Py_INCREF(p->pers_func);
2455 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002456}
2457
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002458static int
2459Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2460{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 if (v == NULL) {
2462 PyErr_SetString(PyExc_TypeError,
2463 "attribute deletion is not supported");
2464 return -1;
2465 }
2466 Py_XDECREF(p->pers_func);
2467 Py_INCREF(v);
2468 p->pers_func = v;
2469 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002470}
2471
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002472static int
2473Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2474{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 if (v == NULL) {
2476 PyErr_SetString(PyExc_TypeError,
2477 "attribute deletion is not supported");
2478 return -1;
2479 }
2480 Py_XDECREF(p->inst_pers_func);
2481 Py_INCREF(v);
2482 p->inst_pers_func = v;
2483 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002484}
2485
2486static PyObject *
2487Pickler_get_memo(Picklerobject *p)
2488{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489 if (p->memo == NULL)
2490 PyErr_SetString(PyExc_AttributeError, "memo");
2491 else
2492 Py_INCREF(p->memo);
2493 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002494}
2495
2496static int
2497Pickler_set_memo(Picklerobject *p, PyObject *v)
2498{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 if (v == NULL) {
2500 PyErr_SetString(PyExc_TypeError,
2501 "attribute deletion is not supported");
2502 return -1;
2503 }
2504 if (!PyDict_Check(v)) {
2505 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2506 return -1;
2507 }
2508 Py_XDECREF(p->memo);
2509 Py_INCREF(v);
2510 p->memo = v;
2511 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002512}
2513
2514static PyObject *
2515Pickler_get_error(Picklerobject *p)
2516{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002517 /* why is this an attribute on the Pickler? */
2518 Py_INCREF(PicklingError);
2519 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002520}
2521
2522static PyMemberDef Pickler_members[] = {
2523 {"binary", T_INT, offsetof(Picklerobject, bin)},
2524 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002525 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002526};
2527
2528static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002529 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002530 (setter)Pickler_set_pers_func},
2531 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2532 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002533 {"PicklingError", (getter)Pickler_get_error, NULL},
2534 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002535};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002536
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002537PyDoc_STRVAR(Picklertype__doc__,
2538"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002539
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002540static PyTypeObject Picklertype = {
2541 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002542 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002543 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002544 sizeof(Picklerobject), /*tp_basicsize*/
2545 0,
2546 (destructor)Pickler_dealloc, /* tp_dealloc */
2547 0, /* tp_print */
2548 0, /* tp_getattr */
2549 0, /* tp_setattr */
2550 0, /* tp_compare */
2551 0, /* tp_repr */
2552 0, /* tp_as_number */
2553 0, /* tp_as_sequence */
2554 0, /* tp_as_mapping */
2555 0, /* tp_hash */
2556 0, /* tp_call */
2557 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002558 PyObject_GenericGetAttr, /* tp_getattro */
2559 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002560 0, /* tp_as_buffer */
2561 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2562 Picklertype__doc__, /* tp_doc */
2563 0, /* tp_traverse */
2564 0, /* tp_clear */
2565 0, /* tp_richcompare */
2566 0, /* tp_weaklistoffset */
2567 0, /* tp_iter */
2568 0, /* tp_iternext */
2569 Pickler_methods, /* tp_methods */
2570 Pickler_members, /* tp_members */
2571 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002572};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002573
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002574static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002575find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002576{
2577 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 if (fc) {
2580 if (fc==Py_None) {
2581 PyErr_SetString(UnpicklingError,
2582 "Global and instance pickles are not supported.");
2583 return NULL;
2584 }
Tim Peterscba30e22003-02-01 06:24:36 +00002585 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002586 py_global_name);
2587 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589 module = PySys_GetObject("modules");
2590 if (module == NULL)
2591 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 module = PyDict_GetItem(module, py_module_name);
2594 if (module == NULL) {
2595 module = PyImport_Import(py_module_name);
2596 if (!module)
2597 return NULL;
2598 global = PyObject_GetAttr(module, py_global_name);
2599 Py_DECREF(module);
2600 }
2601 else
2602 global = PyObject_GetAttr(module, py_global_name);
2603 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002604}
2605
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606static int
Tim Peterscba30e22003-02-01 06:24:36 +00002607marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608{
2609 if (self->num_marks < 1) {
2610 PyErr_SetString(UnpicklingError, "could not find MARK");
2611 return -1;
2612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002615}
2616
Tim Peters84e87f32001-03-17 04:50:51 +00002617
Guido van Rossum60456fd1997-04-09 17:36:32 +00002618static int
Tim Peterscba30e22003-02-01 06:24:36 +00002619load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620{
2621 PDATA_APPEND(self->stack, Py_None, -1);
2622 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002623}
2624
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002625static int
Tim Peterscba30e22003-02-01 06:24:36 +00002626bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627{
2628 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2629 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002630}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631
2632static int
Tim Peterscba30e22003-02-01 06:24:36 +00002633load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634{
2635 PyObject *py_int = 0;
2636 char *endptr, *s;
2637 int len, res = -1;
2638 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2641 if (len < 2) return bad_readline();
2642 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 errno = 0;
2645 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2648 /* Hm, maybe we've got something long. Let's try reading
2649 it as a Python long object. */
2650 errno = 0;
2651 py_int = PyLong_FromString(s, NULL, 0);
2652 if (py_int == NULL) {
2653 PyErr_SetString(PyExc_ValueError,
2654 "could not convert string to int");
2655 goto finally;
2656 }
2657 }
2658 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002659 if (len == 3 && (l == 0 || l == 1)) {
2660 if (!( py_int = PyBool_FromLong(l))) goto finally;
2661 }
2662 else {
2663 if (!( py_int = PyInt_FromLong(l))) goto finally;
2664 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 free(s);
2668 PDATA_PUSH(self->stack, py_int, -1);
2669 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 finally:
2672 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675}
2676
2677
Tim Peters84e87f32001-03-17 04:50:51 +00002678static long
Tim Peterscba30e22003-02-01 06:24:36 +00002679calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680{
2681 unsigned char c;
2682 int i;
2683 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 for (i = 0, l = 0L; i < x; i++) {
2686 c = (unsigned char)s[i];
2687 l |= (long)c << (i * 8);
2688 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002689#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2691 * is signed, so on a box with longs bigger than 4 bytes we need
2692 * to extend a BININT's sign bit to the full width.
2693 */
2694 if (x == 4 && l & (1L << 31))
2695 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002696#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698}
2699
2700
2701static int
Tim Peterscba30e22003-02-01 06:24:36 +00002702load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703{
2704 PyObject *py_int = 0;
2705 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002708
Tim Peterscba30e22003-02-01 06:24:36 +00002709 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 PDATA_PUSH(self->stack, py_int, -1);
2713 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714}
2715
2716
2717static int
Tim Peterscba30e22003-02-01 06:24:36 +00002718load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002719{
2720 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 if ((*self->read_func)(self, &s, 4) < 0)
2723 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726}
2727
2728
2729static int
Tim Peterscba30e22003-02-01 06:24:36 +00002730load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731{
2732 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 if ((*self->read_func)(self, &s, 1) < 0)
2735 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738}
2739
2740
2741static int
Tim Peterscba30e22003-02-01 06:24:36 +00002742load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743{
2744 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002746 if ((*self->read_func)(self, &s, 2) < 0)
2747 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750}
Tim Peters84e87f32001-03-17 04:50:51 +00002751
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752static int
Tim Peterscba30e22003-02-01 06:24:36 +00002753load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754{
2755 PyObject *l = 0;
2756 char *end, *s;
2757 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2760 if (len < 2) return bad_readline();
2761 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762
Tim Peterscba30e22003-02-01 06:24:36 +00002763 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002764 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 free(s);
2767 PDATA_PUSH(self->stack, l, -1);
2768 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002770 finally:
2771 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774}
2775
Tim Peters84e87f32001-03-17 04:50:51 +00002776
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777static int
Tim Peterscba30e22003-02-01 06:24:36 +00002778load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779{
2780 PyObject *py_float = 0;
2781 char *endptr, *s;
2782 int len, res = -1;
2783 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2786 if (len < 2) return bad_readline();
2787 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 errno = 0;
2790 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2793 PyErr_SetString(PyExc_ValueError,
2794 "could not convert string to float");
2795 goto finally;
2796 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797
Tim Peterscba30e22003-02-01 06:24:36 +00002798 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 free(s);
2802 PDATA_PUSH(self->stack, py_float, -1);
2803 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 finally:
2806 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809}
2810
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811static int
Tim Peterscba30e22003-02-01 06:24:36 +00002812load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002813{
2814 PyObject *py_float = 0;
2815 int s, e;
2816 long fhi, flo;
2817 double x;
2818 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820 if ((*self->read_func)(self, &p, 8) < 0)
2821 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 /* First byte */
2824 s = (*p>>7) & 1;
2825 e = (*p & 0x7F) << 4;
2826 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 /* Second byte */
2829 e |= (*p>>4) & 0xF;
2830 fhi = (*p & 0xF) << 24;
2831 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 /* Third byte */
2834 fhi |= (*p & 0xFF) << 16;
2835 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 /* Fourth byte */
2838 fhi |= (*p & 0xFF) << 8;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Fifth byte */
2842 fhi |= *p & 0xFF;
2843 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 /* Sixth byte */
2846 flo = (*p & 0xFF) << 16;
2847 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 /* Seventh byte */
2850 flo |= (*p & 0xFF) << 8;
2851 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 /* Eighth byte */
2854 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2857 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 /* XXX This sadly ignores Inf/NaN */
2860 if (e == 0)
2861 e = -1022;
2862 else {
2863 x += 1.0;
2864 e -= 1023;
2865 }
2866 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 if (s)
2869 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002871 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 PDATA_PUSH(self->stack, py_float, -1);
2874 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002875}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002876
2877static int
Tim Peterscba30e22003-02-01 06:24:36 +00002878load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879{
2880 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002881 int len, res = -1;
2882 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2885 if (len < 2) return bad_readline();
2886 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002888
2889 /* Strip outermost quotes */
2890 while (s[len-1] <= ' ')
2891 len--;
2892 if(s[0]=='"' && s[len-1]=='"'){
2893 s[len-1] = '\0';
2894 p = s + 1 ;
2895 len -= 2;
2896 } else if(s[0]=='\'' && s[len-1]=='\''){
2897 s[len-1] = '\0';
2898 p = s + 1 ;
2899 len -= 2;
2900 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 goto insecure;
2902 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002903
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002904 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
2905 if (str) {
2906 PDATA_PUSH(self->stack, str, -1);
2907 res = 0;
2908 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002909 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002910 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912 insecure:
2913 free(s);
2914 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2915 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002916}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
2918
2919static int
Tim Peterscba30e22003-02-01 06:24:36 +00002920load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002921{
2922 PyObject *py_string = 0;
2923 long l;
2924 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930 if ((*self->read_func)(self, &s, l) < 0)
2931 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002932
Tim Peterscba30e22003-02-01 06:24:36 +00002933 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 PDATA_PUSH(self->stack, py_string, -1);
2937 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938}
2939
2940
2941static int
Tim Peterscba30e22003-02-01 06:24:36 +00002942load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943{
2944 PyObject *py_string = 0;
2945 unsigned char l;
2946 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948 if ((*self->read_func)(self, &s, 1) < 0)
2949 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002955 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 PDATA_PUSH(self->stack, py_string, -1);
2958 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002959}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960
2961
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002962#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963static int
Tim Peterscba30e22003-02-01 06:24:36 +00002964load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965{
2966 PyObject *str = 0;
2967 int len, res = -1;
2968 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2971 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002972
Tim Peterscba30e22003-02-01 06:24:36 +00002973 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 PDATA_PUSH(self->stack, str, -1);
2977 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 finally:
2980 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002981}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002982#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002983
2984
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002985#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002986static int
Tim Peterscba30e22003-02-01 06:24:36 +00002987load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988{
2989 PyObject *unicode;
2990 long l;
2991 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 if ((*self->read_func)(self, &s, l) < 0)
2998 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002999
Tim Peterscba30e22003-02-01 06:24:36 +00003000 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 PDATA_PUSH(self->stack, unicode, -1);
3004 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003005}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003006#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003007
3008
3009static int
Tim Peterscba30e22003-02-01 06:24:36 +00003010load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011{
3012 PyObject *tup;
3013 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 if ((i = marker(self)) < 0) return -1;
3016 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3017 PDATA_PUSH(self->stack, tup, -1);
3018 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003019}
3020
3021static int
Tim Peterscba30e22003-02-01 06:24:36 +00003022load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023{
3024 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 if (!( tup=PyTuple_New(0))) return -1;
3027 PDATA_PUSH(self->stack, tup, -1);
3028 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003029}
3030
3031static int
Tim Peterscba30e22003-02-01 06:24:36 +00003032load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033{
3034 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003036 if (!( list=PyList_New(0))) return -1;
3037 PDATA_PUSH(self->stack, list, -1);
3038 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003039}
3040
3041static int
Tim Peterscba30e22003-02-01 06:24:36 +00003042load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043{
3044 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if (!( dict=PyDict_New())) return -1;
3047 PDATA_PUSH(self->stack, dict, -1);
3048 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049}
3050
3051
3052static int
Tim Peterscba30e22003-02-01 06:24:36 +00003053load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054{
3055 PyObject *list = 0;
3056 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if ((i = marker(self)) < 0) return -1;
3059 if (!( list=Pdata_popList(self->stack, i))) return -1;
3060 PDATA_PUSH(self->stack, list, -1);
3061 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062}
3063
3064static int
Tim Peterscba30e22003-02-01 06:24:36 +00003065load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066{
3067 PyObject *dict, *key, *value;
3068 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003070 if ((i = marker(self)) < 0) return -1;
3071 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 for (k = i+1; k < j; k += 2) {
3076 key =self->stack->data[k-1];
3077 value=self->stack->data[k ];
3078 if (PyDict_SetItem(dict, key, value) < 0) {
3079 Py_DECREF(dict);
3080 return -1;
3081 }
3082 }
3083 Pdata_clear(self->stack, i);
3084 PDATA_PUSH(self->stack, dict, -1);
3085 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086}
3087
3088static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003089Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003090{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003091 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093 if (PyClass_Check(cls)) {
3094 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 if ((l=PyObject_Size(args)) < 0) goto err;
3097 if (!( l )) {
3098 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003099
Tim Peterscba30e22003-02-01 06:24:36 +00003100 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 __getinitargs___str);
3102 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003103 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 so bypass usual construction */
3105 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003108 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 goto err;
3110 return inst;
3111 }
3112 Py_DECREF(__getinitargs__);
3113 }
Tim Peters84e87f32001-03-17 04:50:51 +00003114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 if ((r=PyInstance_New(cls, args, NULL))) return r;
3116 else goto err;
3117 }
Tim Peters84e87f32001-03-17 04:50:51 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 if (args==Py_None) {
3120 /* Special case, call cls.__basicnew__() */
3121 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3124 if (!basicnew) return NULL;
3125 r=PyObject_CallObject(basicnew, NULL);
3126 Py_DECREF(basicnew);
3127 if (r) return r;
3128 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003130 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 err:
3133 {
3134 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 PyErr_Fetch(&tp, &v, &tb);
3137 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3138 Py_XDECREF(v);
3139 v=r;
3140 }
3141 PyErr_Restore(tp,v,tb);
3142 }
3143 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003144}
Tim Peters84e87f32001-03-17 04:50:51 +00003145
Guido van Rossum60456fd1997-04-09 17:36:32 +00003146
3147static int
Tim Peterscba30e22003-02-01 06:24:36 +00003148load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149{
3150 PyObject *class, *tup, *obj=0;
3151 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 if ((i = marker(self)) < 0) return -1;
3154 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3155 PDATA_POP(self->stack, class);
3156 if (class) {
3157 obj = Instance_New(class, tup);
3158 Py_DECREF(class);
3159 }
3160 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003162 if (! obj) return -1;
3163 PDATA_PUSH(self->stack, obj, -1);
3164 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165}
3166
3167
3168static int
Tim Peterscba30e22003-02-01 06:24:36 +00003169load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170{
3171 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3172 int i, len;
3173 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3178 if (len < 2) return bad_readline();
3179 module_name = PyString_FromStringAndSize(s, len - 1);
3180 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003182 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3183 if (len < 2) return bad_readline();
3184 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003185 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 self->find_class);
3187 Py_DECREF(class_name);
3188 }
3189 }
3190 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003192 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if ((tup=Pdata_popTuple(self->stack, i))) {
3195 obj = Instance_New(class, tup);
3196 Py_DECREF(tup);
3197 }
3198 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 PDATA_PUSH(self->stack, obj, -1);
3203 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204}
3205
3206
3207static int
Tim Peterscba30e22003-02-01 06:24:36 +00003208load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209{
3210 PyObject *class = 0, *module_name = 0, *class_name = 0;
3211 int len;
3212 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3215 if (len < 2) return bad_readline();
3216 module_name = PyString_FromStringAndSize(s, len - 1);
3217 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003220 if (len < 2) {
3221 Py_DECREF(module_name);
3222 return bad_readline();
3223 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003225 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 self->find_class);
3227 Py_DECREF(class_name);
3228 }
3229 }
3230 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 if (! class) return -1;
3233 PDATA_PUSH(self->stack, class, -1);
3234 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235}
3236
3237
3238static int
Tim Peterscba30e22003-02-01 06:24:36 +00003239load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240{
3241 PyObject *pid = 0;
3242 int len;
3243 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if (self->pers_func) {
3246 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3247 if (len < 2) return bad_readline();
3248
3249 pid = PyString_FromStringAndSize(s, len - 1);
3250 if (!pid) return -1;
3251
3252 if (PyList_Check(self->pers_func)) {
3253 if (PyList_Append(self->pers_func, pid) < 0) {
3254 Py_DECREF(pid);
3255 return -1;
3256 }
3257 }
3258 else {
3259 ARG_TUP(self, pid);
3260 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003261 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262 NULL);
3263 FREE_ARG_TUP(self);
3264 }
3265 }
3266
3267 if (! pid) return -1;
3268
3269 PDATA_PUSH(self->stack, pid, -1);
3270 return 0;
3271 }
3272 else {
3273 PyErr_SetString(UnpicklingError,
3274 "A load persistent id instruction was encountered,\n"
3275 "but no persistent_load function was specified.");
3276 return -1;
3277 }
3278}
3279
3280static int
Tim Peterscba30e22003-02-01 06:24:36 +00003281load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282{
3283 PyObject *pid = 0;
3284
3285 if (self->pers_func) {
3286 PDATA_POP(self->stack, pid);
3287 if (! pid) return -1;
3288
3289 if (PyList_Check(self->pers_func)) {
3290 if (PyList_Append(self->pers_func, pid) < 0) {
3291 Py_DECREF(pid);
3292 return -1;
3293 }
3294 }
3295 else {
3296 ARG_TUP(self, pid);
3297 if (self->arg) {
3298 pid = PyObject_Call(self->pers_func, self->arg,
3299 NULL);
3300 FREE_ARG_TUP(self);
3301 }
3302 if (! pid) return -1;
3303 }
3304
3305 PDATA_PUSH(self->stack, pid, -1);
3306 return 0;
3307 }
3308 else {
3309 PyErr_SetString(UnpicklingError,
3310 "A load persistent id instruction was encountered,\n"
3311 "but no persistent_load function was specified.");
3312 return -1;
3313 }
3314}
3315
3316
3317static int
Tim Peterscba30e22003-02-01 06:24:36 +00003318load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319{
3320 int len;
3321
3322 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3323
3324 /* Note that we split the (pickle.py) stack into two stacks,
3325 an object stack and a mark stack. We have to be clever and
3326 pop the right one. We do this by looking at the top of the
3327 mark stack.
3328 */
3329
3330 if ((self->num_marks > 0) &&
3331 (self->marks[self->num_marks - 1] == len))
3332 self->num_marks--;
3333 else {
3334 len--;
3335 Py_DECREF(self->stack->data[len]);
3336 self->stack->length=len;
3337 }
3338
3339 return 0;
3340}
3341
3342
3343static int
Tim Peterscba30e22003-02-01 06:24:36 +00003344load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345{
3346 int i;
3347
3348 if ((i = marker(self)) < 0)
3349 return -1;
3350
3351 Pdata_clear(self->stack, i);
3352
3353 return 0;
3354}
3355
3356
3357static int
Tim Peterscba30e22003-02-01 06:24:36 +00003358load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003359{
3360 PyObject *last;
3361 int len;
3362
3363 if ((len = self->stack->length) <= 0) return stackUnderflow();
3364 last=self->stack->data[len-1];
3365 Py_INCREF(last);
3366 PDATA_PUSH(self->stack, last, -1);
3367 return 0;
3368}
3369
3370
3371static int
Tim Peterscba30e22003-02-01 06:24:36 +00003372load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003373{
3374 PyObject *py_str = 0, *value = 0;
3375 int len;
3376 char *s;
3377 int rc;
3378
3379 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003380 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 value = PyDict_GetItem(self->memo, py_str);
3385 if (! value) {
3386 PyErr_SetObject(BadPickleGet, py_str);
3387 rc = -1;
3388 } else {
3389 PDATA_APPEND(self->stack, value, -1);
3390 rc = 0;
3391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 Py_DECREF(py_str);
3394 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395}
3396
3397
3398static int
Tim Peterscba30e22003-02-01 06:24:36 +00003399load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400{
3401 PyObject *py_key = 0, *value = 0;
3402 unsigned char key;
3403 char *s;
3404 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 key = (unsigned char)s[0];
3409 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 value = PyDict_GetItem(self->memo, py_key);
3412 if (! value) {
3413 PyErr_SetObject(BadPickleGet, py_key);
3414 rc = -1;
3415 } else {
3416 PDATA_APPEND(self->stack, value, -1);
3417 rc = 0;
3418 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 Py_DECREF(py_key);
3421 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422}
3423
3424
3425static int
Tim Peterscba30e22003-02-01 06:24:36 +00003426load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427{
3428 PyObject *py_key = 0, *value = 0;
3429 unsigned char c;
3430 char *s;
3431 long key;
3432 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 c = (unsigned char)s[0];
3437 key = (long)c;
3438 c = (unsigned char)s[1];
3439 key |= (long)c << 8;
3440 c = (unsigned char)s[2];
3441 key |= (long)c << 16;
3442 c = (unsigned char)s[3];
3443 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3446
3447 value = PyDict_GetItem(self->memo, py_key);
3448 if (! value) {
3449 PyErr_SetObject(BadPickleGet, py_key);
3450 rc = -1;
3451 } else {
3452 PDATA_APPEND(self->stack, value, -1);
3453 rc = 0;
3454 }
3455
3456 Py_DECREF(py_key);
3457 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003458}
3459
3460
3461static int
Tim Peterscba30e22003-02-01 06:24:36 +00003462load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003463{
3464 PyObject *py_str = 0, *value = 0;
3465 int len, l;
3466 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3469 if (l < 2) return bad_readline();
3470 if (!( len=self->stack->length )) return stackUnderflow();
3471 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3472 value=self->stack->data[len-1];
3473 l=PyDict_SetItem(self->memo, py_str, value);
3474 Py_DECREF(py_str);
3475 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476}
3477
3478
3479static int
Tim Peterscba30e22003-02-01 06:24:36 +00003480load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481{
3482 PyObject *py_key = 0, *value = 0;
3483 unsigned char key;
3484 char *s;
3485 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3488 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3493 value=self->stack->data[len-1];
3494 len=PyDict_SetItem(self->memo, py_key, value);
3495 Py_DECREF(py_key);
3496 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003497}
3498
3499
3500static int
Tim Peterscba30e22003-02-01 06:24:36 +00003501load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502{
3503 PyObject *py_key = 0, *value = 0;
3504 long key;
3505 unsigned char c;
3506 char *s;
3507 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3510 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 c = (unsigned char)s[0];
3513 key = (long)c;
3514 c = (unsigned char)s[1];
3515 key |= (long)c << 8;
3516 c = (unsigned char)s[2];
3517 key |= (long)c << 16;
3518 c = (unsigned char)s[3];
3519 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 if (!( py_key = PyInt_FromLong(key))) return -1;
3522 value=self->stack->data[len-1];
3523 len=PyDict_SetItem(self->memo, py_key, value);
3524 Py_DECREF(py_key);
3525 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003526}
3527
3528
3529static int
Tim Peterscba30e22003-02-01 06:24:36 +00003530do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531{
3532 PyObject *value = 0, *list = 0, *append_method = 0;
3533 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 len=self->stack->length;
3536 if (!( len >= x && x > 0 )) return stackUnderflow();
3537 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003538 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 if (PyList_Check(list)) {
3543 PyObject *slice;
3544 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 slice=Pdata_popList(self->stack, x);
3547 list_len = PyList_GET_SIZE(list);
3548 i=PyList_SetSlice(list, list_len, list_len, slice);
3549 Py_DECREF(slice);
3550 return i;
3551 }
3552 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553
Tim Peterscba30e22003-02-01 06:24:36 +00003554 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 return -1;
3556
3557 for (i = x; i < len; i++) {
3558 PyObject *junk;
3559
3560 value=self->stack->data[i];
3561 junk=0;
3562 ARG_TUP(self, value);
3563 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003564 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003565 NULL);
3566 FREE_ARG_TUP(self);
3567 }
3568 if (! junk) {
3569 Pdata_clear(self->stack, i+1);
3570 self->stack->length=x;
3571 Py_DECREF(append_method);
3572 return -1;
3573 }
3574 Py_DECREF(junk);
3575 }
3576 self->stack->length=x;
3577 Py_DECREF(append_method);
3578 }
3579
3580 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581}
3582
3583
3584static int
Tim Peterscba30e22003-02-01 06:24:36 +00003585load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586{
3587 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003588}
3589
3590
3591static int
Tim Peterscba30e22003-02-01 06:24:36 +00003592load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003593{
3594 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003595}
3596
3597
3598static int
Tim Peterscba30e22003-02-01 06:24:36 +00003599do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003600{
3601 PyObject *value = 0, *key = 0, *dict = 0;
3602 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 if (!( (len=self->stack->length) >= x
3605 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 for (i = x+1; i < len; i += 2) {
3610 key =self->stack->data[i-1];
3611 value=self->stack->data[i ];
3612 if (PyObject_SetItem(dict, key, value) < 0) {
3613 r=-1;
3614 break;
3615 }
3616 }
3617
3618 Pdata_clear(self->stack, x);
3619
3620 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621}
3622
3623
Tim Peters84e87f32001-03-17 04:50:51 +00003624static int
Tim Peterscba30e22003-02-01 06:24:36 +00003625load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003626{
3627 return do_setitems(self, self->stack->length - 2);
3628}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630static int
Tim Peterscba30e22003-02-01 06:24:36 +00003631load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632{
3633 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634}
3635
Tim Peters84e87f32001-03-17 04:50:51 +00003636
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637static int
Tim Peterscba30e22003-02-01 06:24:36 +00003638load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639{
3640 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3641 *junk = 0, *__setstate__ = 0;
3642 int i, r = 0;
3643
3644 if (self->stack->length < 2) return stackUnderflow();
3645 PDATA_POP(self->stack, value);
3646 if (! value) return -1;
3647 inst=self->stack->data[self->stack->length-1];
3648
3649 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3650 ARG_TUP(self, value);
3651 if (self->arg) {
3652 junk = PyObject_Call(__setstate__, self->arg, NULL);
3653 FREE_ARG_TUP(self);
3654 }
3655 Py_DECREF(__setstate__);
3656 if (! junk) return -1;
3657 Py_DECREF(junk);
3658 return 0;
3659 }
3660
3661 PyErr_Clear();
3662 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3663 i = 0;
3664 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3665 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3666 r=-1;
3667 break;
3668 }
3669 }
3670 Py_DECREF(instdict);
3671 }
3672 else r=-1;
3673
3674 Py_XDECREF(value);
3675
3676 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677}
3678
3679
3680static int
Tim Peterscba30e22003-02-01 06:24:36 +00003681load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682{
3683 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 /* Note that we split the (pickle.py) stack into two stacks, an
3686 object stack and a mark stack. Here we push a mark onto the
3687 mark stack.
3688 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 if ((self->num_marks + 1) >= self->marks_size) {
3691 s=self->marks_size+20;
3692 if (s <= self->num_marks) s=self->num_marks + 1;
3693 if (self->marks == NULL)
3694 self->marks=(int *)malloc(s * sizeof(int));
3695 else
Tim Peterscba30e22003-02-01 06:24:36 +00003696 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003697 s * sizeof(int));
3698 if (! self->marks) {
3699 PyErr_NoMemory();
3700 return -1;
3701 }
3702 self->marks_size = s;
3703 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708}
3709
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710static int
Tim Peterscba30e22003-02-01 06:24:36 +00003711load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712{
3713 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715 PDATA_POP(self->stack, arg_tup);
3716 if (! arg_tup) return -1;
3717 PDATA_POP(self->stack, callable);
3718 if (callable) {
3719 ob = Instance_New(callable, arg_tup);
3720 Py_DECREF(callable);
3721 }
3722 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 PDATA_PUSH(self->stack, ob, -1);
3727 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728}
Tim Peters84e87f32001-03-17 04:50:51 +00003729
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003731load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732{
3733 PyObject *err = 0, *val = 0;
3734 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 self->num_marks = 0;
3737 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 while (1) {
3740 if ((*self->read_func)(self, &s, 1) < 0)
3741 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003743 switch (s[0]) {
3744 case NONE:
3745 if (load_none(self) < 0)
3746 break;
3747 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 case BININT:
3750 if (load_binint(self) < 0)
3751 break;
3752 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754 case BININT1:
3755 if (load_binint1(self) < 0)
3756 break;
3757 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003759 case BININT2:
3760 if (load_binint2(self) < 0)
3761 break;
3762 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764 case INT:
3765 if (load_int(self) < 0)
3766 break;
3767 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003769 case LONG:
3770 if (load_long(self) < 0)
3771 break;
3772 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 case FLOAT:
3775 if (load_float(self) < 0)
3776 break;
3777 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 case BINFLOAT:
3780 if (load_binfloat(self) < 0)
3781 break;
3782 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784 case BINSTRING:
3785 if (load_binstring(self) < 0)
3786 break;
3787 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 case SHORT_BINSTRING:
3790 if (load_short_binstring(self) < 0)
3791 break;
3792 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003794 case STRING:
3795 if (load_string(self) < 0)
3796 break;
3797 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003799#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 case UNICODE:
3801 if (load_unicode(self) < 0)
3802 break;
3803 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 case BINUNICODE:
3806 if (load_binunicode(self) < 0)
3807 break;
3808 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003809#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811 case EMPTY_TUPLE:
3812 if (load_empty_tuple(self) < 0)
3813 break;
3814 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816 case TUPLE:
3817 if (load_tuple(self) < 0)
3818 break;
3819 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003821 case EMPTY_LIST:
3822 if (load_empty_list(self) < 0)
3823 break;
3824 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003826 case LIST:
3827 if (load_list(self) < 0)
3828 break;
3829 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 case EMPTY_DICT:
3832 if (load_empty_dict(self) < 0)
3833 break;
3834 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 case DICT:
3837 if (load_dict(self) < 0)
3838 break;
3839 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 case OBJ:
3842 if (load_obj(self) < 0)
3843 break;
3844 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003846 case INST:
3847 if (load_inst(self) < 0)
3848 break;
3849 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851 case GLOBAL:
3852 if (load_global(self) < 0)
3853 break;
3854 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 case APPEND:
3857 if (load_append(self) < 0)
3858 break;
3859 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003861 case APPENDS:
3862 if (load_appends(self) < 0)
3863 break;
3864 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 case BUILD:
3867 if (load_build(self) < 0)
3868 break;
3869 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871 case DUP:
3872 if (load_dup(self) < 0)
3873 break;
3874 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 case BINGET:
3877 if (load_binget(self) < 0)
3878 break;
3879 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003881 case LONG_BINGET:
3882 if (load_long_binget(self) < 0)
3883 break;
3884 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 case GET:
3887 if (load_get(self) < 0)
3888 break;
3889 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891 case MARK:
3892 if (load_mark(self) < 0)
3893 break;
3894 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896 case BINPUT:
3897 if (load_binput(self) < 0)
3898 break;
3899 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901 case LONG_BINPUT:
3902 if (load_long_binput(self) < 0)
3903 break;
3904 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906 case PUT:
3907 if (load_put(self) < 0)
3908 break;
3909 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911 case POP:
3912 if (load_pop(self) < 0)
3913 break;
3914 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 case POP_MARK:
3917 if (load_pop_mark(self) < 0)
3918 break;
3919 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 case SETITEM:
3922 if (load_setitem(self) < 0)
3923 break;
3924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 case SETITEMS:
3927 if (load_setitems(self) < 0)
3928 break;
3929 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 case STOP:
3932 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 case PERSID:
3935 if (load_persid(self) < 0)
3936 break;
3937 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 case BINPERSID:
3940 if (load_binpersid(self) < 0)
3941 break;
3942 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 case REDUCE:
3945 if (load_reduce(self) < 0)
3946 break;
3947 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 case '\0':
3950 /* end of file */
3951 PyErr_SetNone(PyExc_EOFError);
3952 break;
Tim Peterscba30e22003-02-01 06:24:36 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 default:
Tim Peterscba30e22003-02-01 06:24:36 +00003955 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956 "invalid load key, '%s'.",
3957 "c", s[0]);
3958 return NULL;
3959 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 break;
3962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 if ((err = PyErr_Occurred())) {
3965 if (err == PyExc_EOFError) {
3966 PyErr_SetNone(PyExc_EOFError);
3967 }
3968 return NULL;
3969 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 PDATA_POP(self->stack, val);
3972 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973}
Tim Peters84e87f32001-03-17 04:50:51 +00003974
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003976/* No-load functions to support noload, which is used to
3977 find persistent references. */
3978
3979static int
Tim Peterscba30e22003-02-01 06:24:36 +00003980noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981{
3982 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 if ((i = marker(self)) < 0) return -1;
3985 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003986}
3987
3988
3989static int
Tim Peterscba30e22003-02-01 06:24:36 +00003990noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991{
3992 int i;
3993 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 if ((i = marker(self)) < 0) return -1;
3996 Pdata_clear(self->stack, i);
3997 if ((*self->readline_func)(self, &s) < 0) return -1;
3998 if ((*self->readline_func)(self, &s) < 0) return -1;
3999 PDATA_APPEND(self->stack, Py_None,-1);
4000 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004001}
4002
4003static int
Tim Peterscba30e22003-02-01 06:24:36 +00004004noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004005{
4006 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008 if ((*self->readline_func)(self, &s) < 0) return -1;
4009 if ((*self->readline_func)(self, &s) < 0) return -1;
4010 PDATA_APPEND(self->stack, Py_None,-1);
4011 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004012}
4013
4014static int
Tim Peterscba30e22003-02-01 06:24:36 +00004015noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018 if (self->stack->length < 2) return stackUnderflow();
4019 Pdata_clear(self->stack, self->stack->length-2);
4020 PDATA_APPEND(self->stack, Py_None,-1);
4021 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004022}
4023
4024static int
4025noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004026
Guido van Rossum053b8df1998-11-25 16:18:00 +00004027 if (self->stack->length < 1) return stackUnderflow();
4028 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004029 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004030}
4031
4032
4033static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004034noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035{
4036 PyObject *err = 0, *val = 0;
4037 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 self->num_marks = 0;
4040 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 while (1) {
4043 if ((*self->read_func)(self, &s, 1) < 0)
4044 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 switch (s[0]) {
4047 case NONE:
4048 if (load_none(self) < 0)
4049 break;
4050 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 case BININT:
4053 if (load_binint(self) < 0)
4054 break;
4055 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 case BININT1:
4058 if (load_binint1(self) < 0)
4059 break;
4060 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 case BININT2:
4063 if (load_binint2(self) < 0)
4064 break;
4065 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 case INT:
4068 if (load_int(self) < 0)
4069 break;
4070 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 case LONG:
4073 if (load_long(self) < 0)
4074 break;
4075 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004077 case FLOAT:
4078 if (load_float(self) < 0)
4079 break;
4080 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 case BINFLOAT:
4083 if (load_binfloat(self) < 0)
4084 break;
4085 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 case BINSTRING:
4088 if (load_binstring(self) < 0)
4089 break;
4090 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 case SHORT_BINSTRING:
4093 if (load_short_binstring(self) < 0)
4094 break;
4095 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 case STRING:
4098 if (load_string(self) < 0)
4099 break;
4100 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004101
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004102#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 case UNICODE:
4104 if (load_unicode(self) < 0)
4105 break;
4106 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 case BINUNICODE:
4109 if (load_binunicode(self) < 0)
4110 break;
4111 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004112#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 case EMPTY_TUPLE:
4115 if (load_empty_tuple(self) < 0)
4116 break;
4117 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 case TUPLE:
4120 if (load_tuple(self) < 0)
4121 break;
4122 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 case EMPTY_LIST:
4125 if (load_empty_list(self) < 0)
4126 break;
4127 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004129 case LIST:
4130 if (load_list(self) < 0)
4131 break;
4132 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 case EMPTY_DICT:
4135 if (load_empty_dict(self) < 0)
4136 break;
4137 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 case DICT:
4140 if (load_dict(self) < 0)
4141 break;
4142 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144 case OBJ:
4145 if (noload_obj(self) < 0)
4146 break;
4147 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 case INST:
4150 if (noload_inst(self) < 0)
4151 break;
4152 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 case GLOBAL:
4155 if (noload_global(self) < 0)
4156 break;
4157 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 case APPEND:
4160 if (load_append(self) < 0)
4161 break;
4162 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 case APPENDS:
4165 if (load_appends(self) < 0)
4166 break;
4167 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 case BUILD:
4170 if (noload_build(self) < 0)
4171 break;
4172 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 case DUP:
4175 if (load_dup(self) < 0)
4176 break;
4177 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 case BINGET:
4180 if (load_binget(self) < 0)
4181 break;
4182 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case LONG_BINGET:
4185 if (load_long_binget(self) < 0)
4186 break;
4187 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case GET:
4190 if (load_get(self) < 0)
4191 break;
4192 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case MARK:
4195 if (load_mark(self) < 0)
4196 break;
4197 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case BINPUT:
4200 if (load_binput(self) < 0)
4201 break;
4202 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 case LONG_BINPUT:
4205 if (load_long_binput(self) < 0)
4206 break;
4207 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 case PUT:
4210 if (load_put(self) < 0)
4211 break;
4212 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case POP:
4215 if (load_pop(self) < 0)
4216 break;
4217 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case POP_MARK:
4220 if (load_pop_mark(self) < 0)
4221 break;
4222 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 case SETITEM:
4225 if (load_setitem(self) < 0)
4226 break;
4227 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 case SETITEMS:
4230 if (load_setitems(self) < 0)
4231 break;
4232 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 case STOP:
4235 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case PERSID:
4238 if (load_persid(self) < 0)
4239 break;
4240 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case BINPERSID:
4243 if (load_binpersid(self) < 0)
4244 break;
4245 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case REDUCE:
4248 if (noload_reduce(self) < 0)
4249 break;
4250 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004253 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 "invalid load key, '%s'.",
4255 "c", s[0]);
4256 return NULL;
4257 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 break;
4260 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 if ((err = PyErr_Occurred())) {
4263 if (err == PyExc_EOFError) {
4264 PyErr_SetNone(PyExc_EOFError);
4265 }
4266 return NULL;
4267 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004269 PDATA_POP(self->stack, val);
4270 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004271}
Tim Peters84e87f32001-03-17 04:50:51 +00004272
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004273
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004275Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276{
Tim Peterscba30e22003-02-01 06:24:36 +00004277 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281}
4282
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004283static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004284Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285{
Tim Peterscba30e22003-02-01 06:24:36 +00004286 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004290}
4291
Guido van Rossum60456fd1997-04-09 17:36:32 +00004292
4293static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004294 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004295 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004297 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004298 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299 "noload() -- not load a pickle, but go through most of the motions\n"
4300 "\n"
4301 "This function can be used to read past a pickle without instantiating\n"
4302 "any objects or importing any modules. It can also be used to find all\n"
4303 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004304 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004305 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306 {NULL, NULL} /* sentinel */
4307};
4308
4309
4310static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004311newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312{
4313 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004314
Tim Peterscba30e22003-02-01 06:24:36 +00004315 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 self->file = NULL;
4319 self->arg = NULL;
4320 self->stack = (Pdata*)Pdata_New();
4321 self->pers_func = NULL;
4322 self->last_string = NULL;
4323 self->marks = NULL;
4324 self->num_marks = 0;
4325 self->marks_size = 0;
4326 self->buf_size = 0;
4327 self->read = NULL;
4328 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004329 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Tim Peterscba30e22003-02-01 06:24:36 +00004331 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 Py_INCREF(f);
4335 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 /* Set read, readline based on type of f */
4338 if (PyFile_Check(f)) {
4339 self->fp = PyFile_AsFile(f);
4340 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004341 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 "I/O operation on closed file");
4343 goto err;
4344 }
4345 self->read_func = read_file;
4346 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004347 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348 else if (PycStringIO_InputCheck(f)) {
4349 self->fp = NULL;
4350 self->read_func = read_cStringIO;
4351 self->readline_func = readline_cStringIO;
4352 }
4353 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 self->fp = NULL;
4356 self->read_func = read_other;
4357 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4360 (self->read = PyObject_GetAttr(f, read_str)))) {
4361 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004362 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363 "argument must have 'read' and "
4364 "'readline' attributes" );
4365 goto err;
4366 }
4367 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 err:
4372 Py_DECREF((PyObject *)self);
4373 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004374}
4375
4376
4377static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004378get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379{
4380 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004381
Tim Peterscba30e22003-02-01 06:24:36 +00004382 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 return NULL;
4384 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004386
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004387
Guido van Rossum60456fd1997-04-09 17:36:32 +00004388static void
Tim Peterscba30e22003-02-01 06:24:36 +00004389Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390{
4391 Py_XDECREF(self->readline);
4392 Py_XDECREF(self->read);
4393 Py_XDECREF(self->file);
4394 Py_XDECREF(self->memo);
4395 Py_XDECREF(self->stack);
4396 Py_XDECREF(self->pers_func);
4397 Py_XDECREF(self->arg);
4398 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 if (self->marks) {
4401 free(self->marks);
4402 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404 if (self->buf_size) {
4405 free(self->buf);
4406 }
Tim Peters84e87f32001-03-17 04:50:51 +00004407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004408 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004409}
4410
4411
4412static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004413Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004414{
4415 if (!strcmp(name, "persistent_load")) {
4416 if (!self->pers_func) {
4417 PyErr_SetString(PyExc_AttributeError, name);
4418 return NULL;
4419 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 Py_INCREF(self->pers_func);
4422 return self->pers_func;
4423 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 if (!strcmp(name, "find_global")) {
4426 if (!self->find_class) {
4427 PyErr_SetString(PyExc_AttributeError, name);
4428 return NULL;
4429 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 Py_INCREF(self->find_class);
4432 return self->find_class;
4433 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435 if (!strcmp(name, "memo")) {
4436 if (!self->memo) {
4437 PyErr_SetString(PyExc_AttributeError, name);
4438 return NULL;
4439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 Py_INCREF(self->memo);
4442 return self->memo;
4443 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 if (!strcmp(name, "UnpicklingError")) {
4446 Py_INCREF(UnpicklingError);
4447 return UnpicklingError;
4448 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004451}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004452
Guido van Rossum60456fd1997-04-09 17:36:32 +00004453
4454static int
Tim Peterscba30e22003-02-01 06:24:36 +00004455Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 if (!strcmp(name, "persistent_load")) {
4459 Py_XDECREF(self->pers_func);
4460 self->pers_func = value;
4461 Py_XINCREF(value);
4462 return 0;
4463 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 if (!strcmp(name, "find_global")) {
4466 Py_XDECREF(self->find_class);
4467 self->find_class = value;
4468 Py_XINCREF(value);
4469 return 0;
4470 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 if (! value) {
4473 PyErr_SetString(PyExc_TypeError,
4474 "attribute deletion is not supported");
4475 return -1;
4476 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 if (strcmp(name, "memo") == 0) {
4479 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004480 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 "memo must be a dictionary");
4482 return -1;
4483 }
4484 Py_XDECREF(self->memo);
4485 self->memo = value;
4486 Py_INCREF(value);
4487 return 0;
4488 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 PyErr_SetString(PyExc_AttributeError, name);
4491 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004492}
4493
4494
4495static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004496cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497{
4498 PyObject *ob, *file, *res = NULL;
4499 Picklerobject *pickler = 0;
4500 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004501
Tim Peterscba30e22003-02-01 06:24:36 +00004502 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004504
Tim Peterscba30e22003-02-01 06:24:36 +00004505 if (!( pickler = newPicklerobject(file, bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004508 if (dump(pickler, ob) < 0)
4509 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511 Py_INCREF(Py_None);
4512 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 finally:
4515 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518}
4519
4520
4521static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004522cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523{
4524 PyObject *ob, *file = 0, *res = NULL;
4525 Picklerobject *pickler = 0;
4526 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Tim Peterscba30e22003-02-01 06:24:36 +00004528 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Tim Peterscba30e22003-02-01 06:24:36 +00004531 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Tim Peterscba30e22003-02-01 06:24:36 +00004534 if (!( pickler = newPicklerobject(file, bin)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 if (dump(pickler, ob) < 0)
4538 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 finally:
4543 Py_XDECREF(pickler);
4544 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004547}
4548
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004549
4550static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004551cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552{
4553 Unpicklerobject *unpickler = 0;
4554 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004555
Tim Peterscba30e22003-02-01 06:24:36 +00004556 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004558
Tim Peterscba30e22003-02-01 06:24:36 +00004559 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004560 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 finally:
4565 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004568}
4569
4570
4571static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004572cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004573{
4574 PyObject *ob, *file = 0, *res = NULL;
4575 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004576
Tim Peterscba30e22003-02-01 06:24:36 +00004577 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004579
Tim Peterscba30e22003-02-01 06:24:36 +00004580 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004582
Tim Peterscba30e22003-02-01 06:24:36 +00004583 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 finally:
4589 Py_XDECREF(file);
4590 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004593}
4594
4595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004596PyDoc_STRVAR(Unpicklertype__doc__,
4597"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004598
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004599static PyTypeObject Unpicklertype = {
4600 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004601 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004602 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004603 sizeof(Unpicklerobject), /*tp_basicsize*/
4604 0, /*tp_itemsize*/
4605 /* methods */
4606 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4607 (printfunc)0, /*tp_print*/
4608 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4609 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4610 (cmpfunc)0, /*tp_compare*/
4611 (reprfunc)0, /*tp_repr*/
4612 0, /*tp_as_number*/
4613 0, /*tp_as_sequence*/
4614 0, /*tp_as_mapping*/
4615 (hashfunc)0, /*tp_hash*/
4616 (ternaryfunc)0, /*tp_call*/
4617 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618
Guido van Rossum60456fd1997-04-09 17:36:32 +00004619 /* Space for future expansion */
4620 0L,0L,0L,0L,
4621 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004622};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004623
Guido van Rossum60456fd1997-04-09 17:36:32 +00004624static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004625 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004626 PyDoc_STR("dump(object, file, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004627 "Write an object in pickle format to the given file\n"
4628 "\n"
4629 "If the optional argument, binary, is provided and is true, then the\n"
4630 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004631 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004632 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004633 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004634 PyDoc_STR("dumps(object, [binary]) --"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004635 "Return a string containing an object in pickle format\n"
4636 "\n"
4637 "If the optional argument, binary, is provided and is true, then the\n"
4638 "pickle will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004639 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004640 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004641 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004642 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004643 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004644 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Neal Norwitzb0493252002-03-31 14:44:22 +00004645 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004646 PyDoc_STR("Pickler(file, [binary]) -- Create a pickler\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004647 "\n"
4648 "If the optional argument, binary, is provided and is true, then\n"
4649 "pickles will be written in binary format, which is more space and\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004650 "computationally efficient. \n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004652 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004653 PyDoc_STR("Unpickler(file) -- Create an unpickler")},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004654 { NULL, NULL }
4655};
4656
Guido van Rossum60456fd1997-04-09 17:36:32 +00004657static int
Tim Peterscba30e22003-02-01 06:24:36 +00004658init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659{
4660 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004661
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004662#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664 INIT_STR(__class__);
4665 INIT_STR(__getinitargs__);
4666 INIT_STR(__dict__);
4667 INIT_STR(__getstate__);
4668 INIT_STR(__setstate__);
4669 INIT_STR(__name__);
4670 INIT_STR(__main__);
4671 INIT_STR(__reduce__);
4672 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 INIT_STR(append);
4674 INIT_STR(read);
4675 INIT_STR(readline);
4676 INIT_STR(copy_reg);
4677 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004679
Tim Peterscba30e22003-02-01 06:24:36 +00004680 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Tim Peters1f1b2d22003-02-01 02:16:37 +00004683 /* This is special because we want to use a different
4684 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004686 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004692
Tim Peterscba30e22003-02-01 06:24:36 +00004693 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 /* Ugh */
4697 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4698 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4699 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 if (!( t=PyDict_New())) return -1;
4702 if (!( r=PyRun_String(
4703 "def __init__(self, *args): self.args=args\n\n"
4704 "def __str__(self):\n"
4705 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4706 Py_file_input,
4707 module_dict, t) )) return -1;
4708 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004711 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004715
Tim Peterscba30e22003-02-01 06:24:36 +00004716 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004718 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 if (!( t=PyDict_New())) return -1;
4722 if (!( r=PyRun_String(
4723 "def __init__(self, *args): self.args=args\n\n"
4724 "def __str__(self):\n"
4725 " a=self.args\n"
4726 " a=a and type(a[0]) or '(what)'\n"
4727 " return 'Cannot pickle %s objects' % a\n"
4728 , Py_file_input,
4729 module_dict, t) )) return -1;
4730 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004733 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004739 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004741
Martin v. Löwis658009a2002-09-16 17:26:24 +00004742 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4743 UnpicklingError, NULL)))
4744 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if (PyDict_SetItemString(module_dict, "PickleError",
4747 PickleError) < 0)
4748 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 if (PyDict_SetItemString(module_dict, "PicklingError",
4751 PicklingError) < 0)
4752 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4755 UnpicklingError) < 0)
4756 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4759 UnpickleableError) < 0)
4760 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4763 BadPickleGet) < 0)
4764 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004769}
4770
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004771#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
4772#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004773#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004774PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00004775initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776{
4777 PyObject *m, *d, *di, *v, *k;
4778 int i;
4779 char *rev="1.71";
4780 PyObject *format_version;
4781 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 Unpicklertype.ob_type = &PyType_Type;
4785 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 /* Initialize some pieces. We need to do this before module creation,
4788 so we're forced to use a temporary dictionary. :(
4789 */
4790 di=PyDict_New();
4791 if (!di) return;
4792 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 /* Create the module and add the functions */
4795 m = Py_InitModule4("cPickle", cPickle_methods,
4796 cPickle_module_documentation,
4797 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 /* Add some symbolic constants to the module */
4800 d = PyModule_GetDict(m);
4801 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4802 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 /* Copy data from di. Waaa. */
4805 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4806 if (PyObject_SetItem(d, k, v) < 0) {
4807 Py_DECREF(di);
4808 return;
4809 }
4810 }
4811 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 format_version = PyString_FromString("1.3");
4814 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 PyDict_SetItemString(d, "format_version", format_version);
4817 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4818 Py_XDECREF(format_version);
4819 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004820}