blob: f2fe5b0cfcbafb0b501d3f1c3dfbe70205856755 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18#define CURRENT_PROTOCOL_NUMBER 2
19
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Guido van Rossum60456fd1997-04-09 17:36:32 +000090static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossumc03158b1999-06-09 15:23:31 +000092static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000094static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000096static PyObject *BadPickleGet;
97
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000100static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000101
Guido van Rossum60456fd1997-04-09 17:36:32 +0000102static PyObject *__class___str, *__getinitargs___str, *__dict___str,
103 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000104 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000105 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000106 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Guido van Rossum053b8df1998-11-25 16:18:00 +0000108/*************************************************************************
109 Internal Data type for pickle data. */
110
111typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000112 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000113 int length; /* number of initial slots in data currently used */
114 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000115 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
Tim Peters1d63c9f2003-02-02 20:29:39 +0000124 for (i = self->length, p = self->data; --i >= 0; p++) {
125 Py_DECREF(*p);
126 }
127 if (self->data)
128 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000129 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000130}
131
132static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
134 (destructor)Pdata_dealloc,
135 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000136};
137
138#define Pdata_Check(O) ((O)->ob_type == &PdataType)
139
140static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000141Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000142{
143 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 if (!(self = PyObject_New(Pdata, &PdataType)))
146 return NULL;
147 self->size = 8;
148 self->length = 0;
149 self->data = malloc(self->size * sizeof(PyObject*));
150 if (self->data)
151 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000152 Py_DECREF(self);
153 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000154}
155
Tim Peters84e87f32001-03-17 04:50:51 +0000156static int
Tim Peterscba30e22003-02-01 06:24:36 +0000157stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000158{
159 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
160 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000161}
162
Tim Peters1d63c9f2003-02-02 20:29:39 +0000163/* Retain only the initial clearto items. If clearto >= the current
164 * number of items, this is a (non-erroneous) NOP.
165 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000166static int
Tim Peterscba30e22003-02-01 06:24:36 +0000167Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168{
169 int i;
170 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172 if (clearto < 0) return stackUnderflow();
173 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174
Tim Peters1d63c9f2003-02-02 20:29:39 +0000175 for (i = self->length, p = self->data + clearto;
176 --i >= clearto;
177 p++) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178 Py_DECREF(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000179 }
180 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000182 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000183}
184
Tim Peters84e87f32001-03-17 04:50:51 +0000185static int
Tim Peterscba30e22003-02-01 06:24:36 +0000186Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000187{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000188 int bigger;
189 size_t nbytes;
190
191 if (! self->size)
192 goto nomemory;
193 bigger = self->size << 1;
194 if (bigger <= 0)
195 goto nomemory;
196 if ((int)(size_t)bigger != bigger)
197 goto nomemory;
198 nbytes = (size_t)bigger * sizeof(PyObject *);
199 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
200 goto nomemory;
201 self->data = realloc(self->data, nbytes);
202 if (self->data == NULL)
203 goto nomemory;
204 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000205 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000206
207 nomemory:
208 self->size = 0;
209 PyErr_NoMemory();
210 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000211}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213/* D is a Pdata *. Pop the topmost element and store it into V, which
214 * must be an lvalue holding PyObject *. On stack underflow, UnpicklingError
215 * is raised and V is set to NULL. D and V may be evaluated several times.
216 */
217#define PDATA_POP(D, V) { \
218 if ((D)->length) \
219 (V) = (D)->data[--((D)->length)]; \
220 else { \
221 PyErr_SetString(UnpicklingError, "bad pickle data"); \
222 (V) = NULL; \
223 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000224}
225
Guido van Rossum053b8df1998-11-25 16:18:00 +0000226static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000227Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000228{
229 PyObject *r;
230 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000231
Tim Peters1d63c9f2003-02-02 20:29:39 +0000232 l = self->length-start;
233 r = PyTuple_New(l);
234 if (r == NULL)
235 return NULL;
236 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000237 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000238
Tim Peters1d63c9f2003-02-02 20:29:39 +0000239 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000240 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000241}
242
243static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000244Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000245{
246 PyObject *r;
247 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000249 l=self->length-start;
250 if (!( r=PyList_New(l))) return NULL;
251 for (i=start, j=0 ; j < l; i++, j++)
252 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000254 self->length=start;
255 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000256}
257
Guido van Rossum053b8df1998-11-25 16:18:00 +0000258#define PDATA_APPEND(D,O,ER) { \
259 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
260 Pdata_grow((Pdata*)(D)) < 0) \
261 return ER; \
262 Py_INCREF(O); \
263 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
264}
265
266#define PDATA_PUSH(D,O,ER) { \
267 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
268 Pdata_grow((Pdata*)(D)) < 0) { \
269 Py_DECREF(O); \
270 return ER; \
271 } \
272 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
273}
274
275/*************************************************************************/
276
277#define ARG_TUP(self, o) { \
278 if (self->arg || (self->arg=PyTuple_New(1))) { \
279 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
280 PyTuple_SET_ITEM(self->arg,0,o); \
281 } \
282 else { \
283 Py_DECREF(o); \
284 } \
285}
286
287#define FREE_ARG_TUP(self) { \
288 if (self->arg->ob_refcnt > 1) { \
289 Py_DECREF(self->arg); \
290 self->arg=NULL; \
291 } \
292 }
293
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000294typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000295 PyObject_HEAD
296 FILE *fp;
297 PyObject *write;
298 PyObject *file;
299 PyObject *memo;
300 PyObject *arg;
301 PyObject *pers_func;
302 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000303
304 /* pickle protocol number, >= 0 */
305 int proto;
306
307 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000308 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000310 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000311 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000312 int (*write_func)(struct Picklerobject *, char *, int);
313 char *write_buf;
314 int buf_size;
315 PyObject *dispatch_table;
316 int fast_container; /* count nested container dumps */
317 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000318} Picklerobject;
319
Barry Warsaw52acb492001-12-21 20:04:22 +0000320#ifndef PY_CPICKLE_FAST_LIMIT
321#define PY_CPICKLE_FAST_LIMIT 50
322#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000323
Jeremy Hylton938ace62002-07-17 16:30:39 +0000324static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000325
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000326typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000327 PyObject_HEAD
328 FILE *fp;
329 PyObject *file;
330 PyObject *readline;
331 PyObject *read;
332 PyObject *memo;
333 PyObject *arg;
334 Pdata *stack;
335 PyObject *mark;
336 PyObject *pers_func;
337 PyObject *last_string;
338 int *marks;
339 int num_marks;
340 int marks_size;
341 int (*read_func)(struct Unpicklerobject *, char **, int);
342 int (*readline_func)(struct Unpicklerobject *, char **);
343 int buf_size;
344 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000345 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000346} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000347
Jeremy Hylton938ace62002-07-17 16:30:39 +0000348static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000350/* Forward decls that need the above structs */
351static int save(Picklerobject *, PyObject *, int);
352static int put2(Picklerobject *, PyObject *);
353
Tim Peters84e87f32001-03-17 04:50:51 +0000354int
Tim Peterscba30e22003-02-01 06:24:36 +0000355cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000356{
357 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000359 if ((v = PyObject_GetItem(o,key))) {
360 Py_DECREF(v);
361 return 1;
362 }
Tim Peterscba30e22003-02-01 06:24:36 +0000363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000364 PyErr_Clear();
365 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000366}
367
Guido van Rossumd385d591997-04-09 17:47:47 +0000368static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000369PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000370cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
371{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000372 va_list va;
373 PyObject *args=0, *retval=0;
374 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 if (format) args = Py_VaBuildValue(format, va);
377 va_end(va);
378 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000379 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000380 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000382 if (retval) {
383 if (args) {
384 PyObject *v;
385 v=PyString_Format(retval, args);
386 Py_DECREF(retval);
387 Py_DECREF(args);
388 if (! v) return NULL;
389 retval=v;
390 }
391 }
392 else
393 if (args) retval=args;
394 else {
395 PyErr_SetObject(ErrType,Py_None);
396 return NULL;
397 }
398 PyErr_SetObject(ErrType,retval);
399 Py_DECREF(retval);
400 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000401}
402
Tim Peters84e87f32001-03-17 04:50:51 +0000403static int
Tim Peterscba30e22003-02-01 06:24:36 +0000404write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000405{
406 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000408 if (s == NULL) {
409 return 0;
410 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000412 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000413 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000414 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000415 if (nbyteswritten != (size_t)n) {
416 PyErr_SetFromErrno(PyExc_IOError);
417 return -1;
418 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000421}
422
Tim Peters84e87f32001-03-17 04:50:51 +0000423static int
Tim Peterscba30e22003-02-01 06:24:36 +0000424write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425{
426 if (s == NULL) {
427 return 0;
428 }
Tim Peterscba30e22003-02-01 06:24:36 +0000429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000430 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
431 return -1;
432 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000435}
436
Tim Peters84e87f32001-03-17 04:50:51 +0000437static int
Tim Peterscba30e22003-02-01 06:24:36 +0000438write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439{
440 if (s == NULL) return 0;
441 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000442}
443
Tim Peters84e87f32001-03-17 04:50:51 +0000444static int
Tim Peterscba30e22003-02-01 06:24:36 +0000445write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000446{
447 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000449 if (s == NULL) {
450 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000451 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000453 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 return -1;
455 }
456 else {
457 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
458 if (write_other(self, NULL, 0) < 0)
459 return -1;
460 }
Tim Peterscba30e22003-02-01 06:24:36 +0000461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462 if (n > WRITE_BUF_SIZE) {
463 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000464 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000465 return -1;
466 }
467 else {
468 memcpy(self->write_buf + self->buf_size, s, n);
469 self->buf_size += n;
470 return n;
471 }
472 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 if (self->write) {
475 /* object with write method */
476 ARG_TUP(self, py_str);
477 if (self->arg) {
478 junk = PyObject_Call(self->write, self->arg, NULL);
479 FREE_ARG_TUP(self);
480 }
481 if (junk) Py_DECREF(junk);
482 else return -1;
483 }
484 else
485 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000487 self->buf_size = 0;
488 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000489}
490
491
Tim Peters84e87f32001-03-17 04:50:51 +0000492static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000493read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000494{
495 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000497 if (self->buf_size == 0) {
498 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000501 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 PyErr_NoMemory();
503 return -1;
504 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 self->buf_size = size;
507 }
508 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000509 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510 if (!self->buf) {
511 PyErr_NoMemory();
512 return -1;
513 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = n;
515 }
Tim Peters84e87f32001-03-17 04:50:51 +0000516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 Py_BEGIN_ALLOW_THREADS
518 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
519 Py_END_ALLOW_THREADS
520 if (nbytesread != (size_t)n) {
521 if (feof(self->fp)) {
522 PyErr_SetNone(PyExc_EOFError);
523 return -1;
524 }
Tim Peterscba30e22003-02-01 06:24:36 +0000525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 PyErr_SetFromErrno(PyExc_IOError);
527 return -1;
528 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000532 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000533}
534
535
Tim Peters84e87f32001-03-17 04:50:51 +0000536static int
Tim Peterscba30e22003-02-01 06:24:36 +0000537readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538{
539 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000542 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 PyErr_NoMemory();
544 return -1;
545 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546 self->buf_size = 40;
547 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000549 i = 0;
550 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000551 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000552 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000553 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 (self->buf[i] = getc(self->fp)) == '\n') {
555 self->buf[i + 1] = '\0';
556 *s = self->buf;
557 return i + 1;
558 }
559 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000560 bigger = self->buf_size << 1;
561 if (bigger <= 0) { /* overflow */
562 PyErr_NoMemory();
563 return -1;
564 }
565 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 if (!self->buf) {
567 PyErr_NoMemory();
568 return -1;
569 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000570 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 }
Tim Peters84e87f32001-03-17 04:50:51 +0000572}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000573
574
Tim Peters84e87f32001-03-17 04:50:51 +0000575static int
Tim Peterscba30e22003-02-01 06:24:36 +0000576read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577{
578 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
581 PyErr_SetNone(PyExc_EOFError);
582 return -1;
583 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000587 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000588}
589
590
Tim Peters84e87f32001-03-17 04:50:51 +0000591static int
Tim Peterscba30e22003-02-01 06:24:36 +0000592readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593{
594 int n;
595 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000597 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
598 return -1;
599 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000603 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000604}
605
606
Tim Peters84e87f32001-03-17 04:50:51 +0000607static int
Tim Peterscba30e22003-02-01 06:24:36 +0000608read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609{
610 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 ARG_TUP(self, bytes);
615 if (self->arg) {
616 str = PyObject_Call(self->read, self->arg, NULL);
617 FREE_ARG_TUP(self);
618 }
619 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000621 Py_XDECREF(self->last_string);
622 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624 if (! (*s = PyString_AsString(str))) return -1;
625 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626}
627
628
Tim Peters84e87f32001-03-17 04:50:51 +0000629static int
Tim Peterscba30e22003-02-01 06:24:36 +0000630readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631{
632 PyObject *str;
633 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000635 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
636 return -1;
637 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639 if ((str_size = PyString_Size(str)) < 0)
640 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642 Py_XDECREF(self->last_string);
643 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000645 if (! (*s = PyString_AsString(str)))
646 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000649}
650
Tim Petersee1a53c2003-02-02 02:57:53 +0000651/* Copy the first n bytes from s into newly malloc'ed memory, plus a
652 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
653 * The caller is responsible for free()'ing the return value.
654 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000655static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000656pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657{
Tim Petersee1a53c2003-02-02 02:57:53 +0000658 char *r = (char *)malloc(n+1);
659 if (r == NULL)
660 return (char*)PyErr_NoMemory();
661 memcpy(r, s, n);
662 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664}
665
666
667static int
Tim Peterscba30e22003-02-01 06:24:36 +0000668get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669{
670 PyObject *value, *mv;
671 long c_value;
672 char s[30];
673 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 if (!( mv = PyDict_GetItem(self->memo, id))) {
676 PyErr_SetObject(PyExc_KeyError, id);
677 return -1;
678 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679
Tim Peterscba30e22003-02-01 06:24:36 +0000680 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 if (!( PyInt_Check(value))) {
684 PyErr_SetString(PicklingError, "no int where int expected in memo");
685 return -1;
686 }
687 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 if (!self->bin) {
690 s[0] = GET;
691 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
692 len = strlen(s);
693 }
694 else if (Pdata_Check(self->file)) {
695 if (write_other(self, NULL, 0) < 0) return -1;
696 PDATA_APPEND(self->file, mv, -1);
697 return 0;
698 }
699 else {
700 if (c_value < 256) {
701 s[0] = BINGET;
702 s[1] = (int)(c_value & 0xff);
703 len = 2;
704 }
705 else {
706 s[0] = LONG_BINGET;
707 s[1] = (int)(c_value & 0xff);
708 s[2] = (int)((c_value >> 8) & 0xff);
709 s[3] = (int)((c_value >> 16) & 0xff);
710 s[4] = (int)((c_value >> 24) & 0xff);
711 len = 5;
712 }
713 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000714
Tim Peters0bc93f52003-02-02 18:29:33 +0000715 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000717
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000718 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000720
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722static int
Tim Peterscba30e22003-02-01 06:24:36 +0000723put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724{
Tim Peterscba30e22003-02-01 06:24:36 +0000725 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000726 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728 return put2(self, ob);
729}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000730
Guido van Rossum053b8df1998-11-25 16:18:00 +0000731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000732static int
Tim Peterscba30e22003-02-01 06:24:36 +0000733put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000734{
735 char c_str[30];
736 int p;
737 size_t len;
738 int res = -1;
739 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000741 if (self->fast)
742 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000744 if ((p = PyDict_Size(self->memo)) < 0)
745 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000747 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000748 /* XXX Why?
749 * XXX And does "positive" really mean non-negative?
750 * XXX pickle.py starts with PUT index 0, not 1. This makes for
751 * XXX gratuitous differences between the pickling modules.
752 */
Tim Peterscba30e22003-02-01 06:24:36 +0000753 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000754
Tim Peterscba30e22003-02-01 06:24:36 +0000755 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000757
Tim Peterscba30e22003-02-01 06:24:36 +0000758 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000760
Tim Peterscba30e22003-02-01 06:24:36 +0000761 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764 PyTuple_SET_ITEM(t, 0, memo_len);
765 Py_INCREF(memo_len);
766 PyTuple_SET_ITEM(t, 1, ob);
767 Py_INCREF(ob);
768
769 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
770 goto finally;
771
772 if (!self->bin) {
773 c_str[0] = PUT;
774 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
775 len = strlen(c_str);
776 }
777 else if (Pdata_Check(self->file)) {
778 if (write_other(self, NULL, 0) < 0) return -1;
779 PDATA_APPEND(self->file, memo_len, -1);
780 res=0; /* Job well done ;) */
781 goto finally;
782 }
783 else {
784 if (p >= 256) {
785 c_str[0] = LONG_BINPUT;
786 c_str[1] = (int)(p & 0xff);
787 c_str[2] = (int)((p >> 8) & 0xff);
788 c_str[3] = (int)((p >> 16) & 0xff);
789 c_str[4] = (int)((p >> 24) & 0xff);
790 len = 5;
791 }
792 else {
793 c_str[0] = BINPUT;
794 c_str[1] = p;
795 len = 2;
796 }
797 }
798
Tim Peters0bc93f52003-02-02 18:29:33 +0000799 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000800 goto finally;
801
802 res = 0;
803
804 finally:
805 Py_XDECREF(py_ob_id);
806 Py_XDECREF(memo_len);
807 Py_XDECREF(t);
808
809 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000810}
811
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000813
814static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000815PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816{
817 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
818 static PyObject *standard_builtins=0;
819 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000822 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000823 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000824 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000826 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 return NULL;
828 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830 if ((globals=PyEval_GetGlobals())) {
831 Py_INCREF(globals);
832 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000833 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834 goto err;
835 }
836 else {
837 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000840 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 __builtins__=standard_builtins;
844 Py_INCREF(__builtins__);
845 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000846 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 goto err;
848 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000850 if (PyDict_Check(__builtins__)) {
851 __import__=PyObject_GetItem(__builtins__,__import___str);
852 if (!__import__) goto err;
853 }
854 else {
855 __import__=PyObject_GetAttr(__builtins__,__import___str);
856 if (!__import__) goto err;
857 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 r=PyObject_CallFunction(__import__,"OOOO",
860 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000861 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 Py_DECREF(globals);
865 Py_DECREF(__builtins__);
866 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 return r;
869 err:
870 Py_XDECREF(globals);
871 Py_XDECREF(__builtins__);
872 Py_XDECREF(__import__);
873 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000874}
875
876static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000877whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878{
879 int i, j;
880 PyObject *module = 0, *modules_dict = 0,
881 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 module = PyObject_GetAttrString(global, "__module__");
884 if (module) return module;
885 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000886
Tim Peterscba30e22003-02-01 06:24:36 +0000887 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000890 i = 0;
891 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000893 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 global_name_attr = PyObject_GetAttr(module, global_name);
896 if (!global_name_attr) {
897 PyErr_Clear();
898 continue;
899 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 if (global_name_attr != global) {
902 Py_DECREF(global_name_attr);
903 continue;
904 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000906 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000908 break;
909 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000911 /* The following implements the rule in pickle.py added in 1.5
912 that used __main__ if no module is found. I don't actually
913 like this rule. jlf
914 */
915 if (!j) {
916 j=1;
917 name=__main___str;
918 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 Py_INCREF(name);
921 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000922}
923
924
Guido van Rossum60456fd1997-04-09 17:36:32 +0000925static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000926fast_save_enter(Picklerobject *self, PyObject *obj)
927{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928 /* if fast_container < 0, we're doing an error exit. */
929 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
930 PyObject *key = NULL;
931 if (self->fast_memo == NULL) {
932 self->fast_memo = PyDict_New();
933 if (self->fast_memo == NULL) {
934 self->fast_container = -1;
935 return 0;
936 }
937 }
938 key = PyLong_FromVoidPtr(obj);
939 if (key == NULL)
940 return 0;
941 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000942 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000943 PyErr_Format(PyExc_ValueError,
944 "fast mode: can't pickle cyclic objects including object type %s at %p",
945 obj->ob_type->tp_name, obj);
946 self->fast_container = -1;
947 return 0;
948 }
949 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000950 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951 self->fast_container = -1;
952 return 0;
953 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000954 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000955 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000957}
958
Tim Peterscba30e22003-02-01 06:24:36 +0000959int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000960fast_save_leave(Picklerobject *self, PyObject *obj)
961{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000962 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
963 PyObject *key = PyLong_FromVoidPtr(obj);
964 if (key == NULL)
965 return 0;
966 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000967 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000968 return 0;
969 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000970 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000971 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000972 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000973}
974
975static int
Tim Peterscba30e22003-02-01 06:24:36 +0000976save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977{
978 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000979 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000983}
984
Guido van Rossum77f6a652002-04-03 22:41:51 +0000985static int
Tim Peterscba30e22003-02-01 06:24:36 +0000986save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000987{
Guido van Rossume2763392002-04-05 19:30:08 +0000988 static char *buf[2] = {FALSE, TRUE};
989 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000990 long l = PyInt_AS_LONG((PyIntObject *)args);
991
Tim Peters3c67d792003-02-02 17:59:11 +0000992 if (self->proto >= 2) {
993 char opcode = l ? NEWTRUE : NEWFALSE;
994 if (self->write_func(self, &opcode, 1) < 0)
995 return -1;
996 }
997 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000998 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000999 return 0;
1000}
Tim Peters84e87f32001-03-17 04:50:51 +00001001
Guido van Rossum60456fd1997-04-09 17:36:32 +00001002static int
Tim Peterscba30e22003-02-01 06:24:36 +00001003save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004{
1005 char c_str[32];
1006 long l = PyInt_AS_LONG((PyIntObject *)args);
1007 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001010#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 || l > 0x7fffffffL
1012 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001013#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 ) {
1015 /* Text-mode pickle, or long too big to fit in the 4-byte
1016 * signed BININT format: store as a string.
1017 */
1018 c_str[0] = INT;
1019 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 return -1;
1022 }
1023 else {
1024 /* Binary pickle and l fits in a signed 4-byte int. */
1025 c_str[1] = (int)( l & 0xff);
1026 c_str[2] = (int)((l >> 8) & 0xff);
1027 c_str[3] = (int)((l >> 16) & 0xff);
1028 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1031 if (c_str[2] == 0) {
1032 c_str[0] = BININT1;
1033 len = 2;
1034 }
1035 else {
1036 c_str[0] = BININT2;
1037 len = 3;
1038 }
1039 }
1040 else {
1041 c_str[0] = BININT;
1042 len = 5;
1043 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044
Tim Peters0bc93f52003-02-02 18:29:33 +00001045 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001046 return -1;
1047 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001049 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001050}
1051
1052
1053static int
Tim Peterscba30e22003-02-01 06:24:36 +00001054save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055{
Tim Petersee1a53c2003-02-02 02:57:53 +00001056 int size;
1057 int res = -1;
1058 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001061
Tim Petersee1a53c2003-02-02 02:57:53 +00001062 if (self->proto >= 2) {
1063 /* Linear-time pickling. */
1064 size_t nbits;
1065 size_t nbytes;
1066 unsigned char *pdata;
1067 char c_str[5];
1068 int i;
1069 int sign = _PyLong_Sign(args);
1070
1071 if (sign == 0) {
1072 /* It's 0 -- an empty bytestring. */
1073 c_str[0] = LONG1;
1074 c_str[1] = 0;
1075 i = self->write_func(self, c_str, 2);
1076 if (i < 0) goto finally;
1077 res = 0;
1078 goto finally;
1079 }
1080 nbits = _PyLong_NumBits(args);
1081 if (nbits == (size_t)-1 && PyErr_Occurred())
1082 goto finally;
1083 /* How many bytes do we need? There are nbits >> 3 full
1084 * bytes of data, and nbits & 7 leftover bits. If there
1085 * are any leftover bits, then we clearly need another
1086 * byte. Wnat's not so obvious is that we *probably*
1087 * need another byte even if there aren't any leftovers:
1088 * the most-significant bit of the most-significant byte
1089 * acts like a sign bit, and it's usually got a sense
1090 * opposite of the one we need. The exception is longs
1091 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1092 * its own 256's-complement, so has the right sign bit
1093 * even without the extra byte. That's a pain to check
1094 * for in advance, though, so we always grab an extra
1095 * byte at the start, and cut it back later if possible.
1096 */
1097 nbytes = (nbits >> 3) + 1;
1098 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1099 PyErr_SetString(PyExc_OverflowError, "long too large "
1100 "to pickle");
1101 goto finally;
1102 }
1103 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1104 if (repr == NULL) goto finally;
1105 pdata = (unsigned char *)PyString_AS_STRING(repr);
1106 i = _PyLong_AsByteArray((PyLongObject *)args,
1107 pdata, nbytes,
1108 1 /* little endian */, 1 /* signed */);
1109 if (i < 0) goto finally;
1110 /* If the long is negative, this may be a byte more than
1111 * needed. This is so iff the MSB is all redundant sign
1112 * bits.
1113 */
1114 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1115 (pdata[nbytes - 2] & 0x80) != 0)
1116 --nbytes;
1117
1118 if (nbytes < 256) {
1119 c_str[0] = LONG1;
1120 c_str[1] = (char)nbytes;
1121 size = 2;
1122 }
1123 else {
1124 c_str[0] = LONG4;
1125 size = (int)nbytes;
1126 for (i = 1; i < 5; i++) {
1127 c_str[i] = (char)(size & 0xff);
1128 size >>= 8;
1129 }
1130 size = 5;
1131 }
1132 i = self->write_func(self, c_str, size);
1133 if (i < 0) goto finally;
1134 i = self->write_func(self, (char *)pdata, (int)nbytes);
1135 if (i < 0) goto finally;
1136 res = 0;
1137 goto finally;
1138 }
1139
1140 /* proto < 2: write the repr and newline. This is quadratic-time
1141 * (in the number of digits), in both directions.
1142 */
Tim Peterscba30e22003-02-01 06:24:36 +00001143 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 if ((size = PyString_Size(repr)) < 0)
1147 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001148
Tim Peters0bc93f52003-02-02 18:29:33 +00001149 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Tim Peters0bc93f52003-02-02 18:29:33 +00001152 if (self->write_func(self,
1153 PyString_AS_STRING((PyStringObject *)repr),
1154 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Tim Peters0bc93f52003-02-02 18:29:33 +00001157 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001162 finally:
1163 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165}
1166
1167
1168static int
Tim Peterscba30e22003-02-01 06:24:36 +00001169save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170{
1171 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if (self->bin) {
1174 int s, e;
1175 double f;
1176 long fhi, flo;
1177 char str[9];
1178 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 *p = BINFLOAT;
1181 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001183 if (x < 0) {
1184 s = 1;
1185 x = -x;
1186 }
1187 else
1188 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 /* Normalize f to be in the range [1.0, 2.0) */
1193 if (0.5 <= f && f < 1.0) {
1194 f *= 2.0;
1195 e--;
1196 }
1197 else if (f == 0.0) {
1198 e = 0;
1199 }
1200 else {
1201 PyErr_SetString(PyExc_SystemError,
1202 "frexp() result out of range");
1203 return -1;
1204 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if (e >= 1024) {
1207 /* XXX 1024 itself is reserved for Inf/NaN */
1208 PyErr_SetString(PyExc_OverflowError,
1209 "float too large to pack with d format");
1210 return -1;
1211 }
1212 else if (e < -1022) {
1213 /* Gradual underflow */
1214 f = ldexp(f, 1022 + e);
1215 e = 0;
1216 }
1217 else if (!(e == 0 && f == 0.0)) {
1218 e += 1023;
1219 f -= 1.0; /* Get rid of leading 1 */
1220 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001221
Tim Peterscba30e22003-02-01 06:24:36 +00001222 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 flo the low 24 bits (== 52 bits) */
1224 f *= 268435456.0; /* 2**28 */
1225 fhi = (long) floor(f); /* Truncate */
1226 f -= (double)fhi;
1227 f *= 16777216.0; /* 2**24 */
1228 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001230 /* First byte */
1231 *p = (s<<7) | (e>>4);
1232 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 /* Second byte */
1235 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1236 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 /* Third byte */
1239 *p = (unsigned char) ((fhi>>16) & 0xFF);
1240 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001242 /* Fourth byte */
1243 *p = (unsigned char) ((fhi>>8) & 0xFF);
1244 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001246 /* Fifth byte */
1247 *p = (unsigned char) (fhi & 0xFF);
1248 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001250 /* Sixth byte */
1251 *p = (unsigned char) ((flo>>16) & 0xFF);
1252 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 /* Seventh byte */
1255 *p = (unsigned char) ((flo>>8) & 0xFF);
1256 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001258 /* Eighth byte */
1259 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260
Tim Peters0bc93f52003-02-02 18:29:33 +00001261 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262 return -1;
1263 }
1264 else {
1265 char c_str[250];
1266 c_str[0] = FLOAT;
1267 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001268
Tim Peters0bc93f52003-02-02 18:29:33 +00001269 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 return -1;
1271 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001274}
1275
1276
1277static int
Tim Peterscba30e22003-02-01 06:24:36 +00001278save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279{
1280 int size, len;
1281 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001283 if ((size = PyString_Size(args)) < 0)
1284 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001286 if (!self->bin) {
1287 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001289 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001290
Tim Peterscba30e22003-02-01 06:24:36 +00001291 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if ((len = PyString_Size(repr)) < 0)
1295 goto err;
1296 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001297
Tim Peters0bc93f52003-02-02 18:29:33 +00001298 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001299 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001300
Tim Peters0bc93f52003-02-02 18:29:33 +00001301 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001303
Tim Peters0bc93f52003-02-02 18:29:33 +00001304 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 Py_XDECREF(repr);
1308 }
1309 else {
1310 int i;
1311 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 if ((size = PyString_Size(args)) < 0)
1314 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 if (size < 256) {
1317 c_str[0] = SHORT_BINSTRING;
1318 c_str[1] = size;
1319 len = 2;
1320 }
1321 else {
1322 c_str[0] = BINSTRING;
1323 for (i = 1; i < 5; i++)
1324 c_str[i] = (int)(size >> ((i - 1) * 8));
1325 len = 5;
1326 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001327
Tim Peters0bc93f52003-02-02 18:29:33 +00001328 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if (size > 128 && Pdata_Check(self->file)) {
1332 if (write_other(self, NULL, 0) < 0) return -1;
1333 PDATA_APPEND(self->file, args, -1);
1334 }
1335 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001336 if (self->write_func(self,
1337 PyString_AS_STRING(
1338 (PyStringObject *)args),
1339 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 return -1;
1341 }
1342 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 if (doput)
1345 if (put(self, args) < 0)
1346 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001348 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 err:
1351 Py_XDECREF(repr);
1352 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001353}
1354
1355
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001356#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001357/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1358 backslash and newline characters to \uXXXX escapes. */
1359static PyObject *
1360modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1361{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 PyObject *repr;
1363 char *p;
1364 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 repr = PyString_FromStringAndSize(NULL, 6 * size);
1369 if (repr == NULL)
1370 return NULL;
1371 if (size == 0)
1372 return repr;
1373
1374 p = q = PyString_AS_STRING(repr);
1375 while (size-- > 0) {
1376 Py_UNICODE ch = *s++;
1377 /* Map 16-bit characters to '\uxxxx' */
1378 if (ch >= 256 || ch == '\\' || ch == '\n') {
1379 *p++ = '\\';
1380 *p++ = 'u';
1381 *p++ = hexdigit[(ch >> 12) & 0xf];
1382 *p++ = hexdigit[(ch >> 8) & 0xf];
1383 *p++ = hexdigit[(ch >> 4) & 0xf];
1384 *p++ = hexdigit[ch & 15];
1385 }
1386 /* Copy everything else as-is */
1387 else
1388 *p++ = (char) ch;
1389 }
1390 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001391 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001392 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001393}
1394
1395
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396static int
Tim Peterscba30e22003-02-01 06:24:36 +00001397save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398{
1399 int size, len;
1400 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 if (!PyUnicode_Check(args))
1403 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405 if (!self->bin) {
1406 char *repr_str;
1407 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 repr = modified_EncodeRawUnicodeEscape(
1410 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001411 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 if ((len = PyString_Size(repr)) < 0)
1415 goto err;
1416 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001417
Tim Peters0bc93f52003-02-02 18:29:33 +00001418 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001420
Tim Peters0bc93f52003-02-02 18:29:33 +00001421 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001423
Tim Peters0bc93f52003-02-02 18:29:33 +00001424 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 Py_XDECREF(repr);
1428 }
1429 else {
1430 int i;
1431 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001432
Tim Peterscba30e22003-02-01 06:24:36 +00001433 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 if ((size = PyString_Size(repr)) < 0)
1437 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 c_str[0] = BINUNICODE;
1440 for (i = 1; i < 5; i++)
1441 c_str[i] = (int)(size >> ((i - 1) * 8));
1442 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001443
Tim Peters0bc93f52003-02-02 18:29:33 +00001444 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001445 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 if (size > 128 && Pdata_Check(self->file)) {
1448 if (write_other(self, NULL, 0) < 0)
1449 goto err;
1450 PDATA_APPEND(self->file, repr, -1);
1451 }
1452 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001453 if (self->write_func(self, PyString_AS_STRING(repr),
1454 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 goto err;
1456 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 Py_DECREF(repr);
1459 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 if (doput)
1462 if (put(self, args) < 0)
1463 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001465 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 err:
1468 Py_XDECREF(repr);
1469 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001470}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001471#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001472
Tim Peters1d63c9f2003-02-02 20:29:39 +00001473/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1474static int
1475store_tuple_elememts(Picklerobject *self, PyObject *t, int len)
1476{
1477 int i;
1478 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001479
Tim Peters1d63c9f2003-02-02 20:29:39 +00001480 assert(PyTuple_Size(t) == len);
1481
1482 for (i = 0; i < len; i++) {
1483 PyObject *element = PyTuple_GET_ITEM(t, i);
1484
1485 if (element == NULL)
1486 goto finally;
1487 if (save(self, element, 0) < 0)
1488 goto finally;
1489 }
1490 res = 0;
1491
1492 finally:
1493 return res;
1494}
1495
1496/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1497 * used across protocols to minimize the space needed to pickle them.
1498 * Tuples are also the only builtin immuatable type that can be recursive
1499 * (a tuple can be reached from itself), and that requires some subtle
1500 * magic so that it works in all cases. IOW, this is a long routine.
1501 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001502static int
Tim Peterscba30e22003-02-01 06:24:36 +00001503save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001505 PyObject *py_tuple_id = NULL;
1506 int len, i;
1507 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001510 static char pop = POP;
1511 static char pop_mark = POP_MARK;
1512 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001514 if ((len = PyTuple_Size(args)) < 0)
1515 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001516
Tim Peters1d63c9f2003-02-02 20:29:39 +00001517 if (len == 0) {
1518 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001519
Tim Peters1d63c9f2003-02-02 20:29:39 +00001520 if (self->proto) {
1521 c_str[0] = EMPTY_TUPLE;
1522 len = 1;
1523 }
1524 else {
1525 c_str[0] = MARK;
1526 c_str[1] = TUPLE;
1527 len = 2;
1528 }
1529 if (self->write_func(self, c_str, len) >= 0)
1530 res = 0;
1531 /* Don't memoize an empty tuple. */
1532 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001534
Tim Peters1d63c9f2003-02-02 20:29:39 +00001535 /* A non-empty tuple. */
1536
1537 /* id(tuple) isn't in the memo now. If it shows up there after
1538 * saving the tuple elements, the tuple must be recursive, in
1539 * which case we'll pop everything we put on the stack, and fetch
1540 * its value from the memo.
1541 */
1542 py_tuple_id = PyLong_FromVoidPtr(args);
1543 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001545
Tim Peters1d63c9f2003-02-02 20:29:39 +00001546 if (len <= 3 && self->proto >= 2) {
1547 /* Use TUPLE{1,2,3} opcodes. */
1548 if (store_tuple_elememts(self, args, len) < 0)
1549 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001551 /* pop the len elements */
1552 for (i = 0; i < len; ++i)
1553 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001554 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001555 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 if (get(self, py_tuple_id) < 0)
1557 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558 res = 0;
1559 goto finally;
1560 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001561 /* Not recursive. */
1562 if (self->write_func(self, len2opcode + len, 1) < 0)
1563 goto finally;
1564 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001566
Tim Peters1d63c9f2003-02-02 20:29:39 +00001567 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1568 * Generate MARK elt1 elt2 ... TUPLE
1569 */
1570 if (self->write_func(self, &MARKv, 1) < 0)
1571 goto finally;
1572
1573 if (store_tuple_elememts(self, args, len) < 0)
1574 goto finally;
1575
1576 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1577 /* pop the stack stuff we pushed */
1578 if (self->bin) {
1579 if (self->write_func(self, &pop_mark, 1) < 0)
1580 goto finally;
1581 }
1582 else {
1583 /* Note that we pop one more than len, to remove
1584 * the MARK too.
1585 */
1586 for (i = 0; i <= len; i++)
1587 if (self->write_func(self, &pop, 1) < 0)
1588 goto finally;
1589 }
1590 /* fetch from memo */
1591 if (get(self, py_tuple_id) >= 0)
1592 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593 goto finally;
1594 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Tim Peters1d63c9f2003-02-02 20:29:39 +00001596 /* Not recursive. */
1597 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001599
Tim Peters1d63c9f2003-02-02 20:29:39 +00001600 memoize:
1601 if (put(self, args) >= 0)
1602 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001604 finally:
1605 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001607}
1608
1609static int
Tim Peterscba30e22003-02-01 06:24:36 +00001610save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611{
1612 PyObject *element = 0;
1613 int s_len, len, i, using_appends, res = -1;
1614 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if (self->fast && !fast_save_enter(self, args))
1619 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 if (self->bin) {
1622 s[0] = EMPTY_LIST;
1623 s_len = 1;
1624 }
1625 else {
1626 s[0] = MARK;
1627 s[1] = LIST;
1628 s_len = 2;
1629 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if ((len = PyList_Size(args)) < 0)
1632 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Tim Peters0bc93f52003-02-02 18:29:33 +00001634 if (self->write_func(self, s, s_len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001635 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 if (len == 0) {
1638 if (put(self, args) < 0)
1639 goto finally;
1640 }
1641 else {
1642 if (put2(self, args) < 0)
1643 goto finally;
1644 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 if ((using_appends = (self->bin && (len > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001647 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001650 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001651 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 if (save(self, element, 0) < 0)
1655 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001657 if (!using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001658 if (self->write_func(self, &append, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001659 goto finally;
1660 }
1661 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 if (using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001664 if (self->write_func(self, &appends, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 goto finally;
1666 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001670 finally:
1671 if (self->fast && !fast_save_leave(self, args))
1672 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001675}
1676
1677
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678static int
Tim Peterscba30e22003-02-01 06:24:36 +00001679save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680{
1681 PyObject *key = 0, *value = 0;
1682 int i, len, res = -1, using_setitems;
1683 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 if (self->fast && !fast_save_enter(self, args))
1688 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 if (self->bin) {
1691 s[0] = EMPTY_DICT;
1692 len = 1;
1693 }
1694 else {
1695 s[0] = MARK;
1696 s[1] = DICT;
1697 len = 2;
1698 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001699
Tim Peters0bc93f52003-02-02 18:29:33 +00001700 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 if ((len = PyDict_Size(args)) < 0)
1704 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if (len == 0) {
1707 if (put(self, args) < 0)
1708 goto finally;
1709 }
1710 else {
1711 if (put2(self, args) < 0)
1712 goto finally;
1713 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001716 if (self->write_func(self, &MARKv, 1) < 0)
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 i = 0;
1720 while (PyDict_Next(args, &i, &key, &value)) {
1721 if (save(self, key, 0) < 0)
1722 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 if (save(self, value, 0) < 0)
1725 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 if (!using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001728 if (self->write_func(self, &setitem, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001729 goto finally;
1730 }
1731 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 if (using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001734 if (self->write_func(self, &setitems, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 goto finally;
1736 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 finally:
1741 if (self->fast && !fast_save_leave(self, args))
1742 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001745}
1746
1747
Tim Peters84e87f32001-03-17 04:50:51 +00001748static int
Tim Peterscba30e22003-02-01 06:24:36 +00001749save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750{
1751 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1752 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1753 char *module_str, *name_str;
1754 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758 if (self->fast && !fast_save_enter(self, args))
1759 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001760
Tim Peters0bc93f52003-02-02 18:29:33 +00001761 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001763
Tim Peterscba30e22003-02-01 06:24:36 +00001764 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 if (self->bin) {
1768 if (save(self, class, 0) < 0)
1769 goto finally;
1770 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1773 PyObject *element = 0;
1774 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001777 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 if ((len = PyObject_Size(class_args)) < 0)
1781 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001784 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001787 if (save(self, element, 0) < 0) {
1788 Py_DECREF(element);
1789 goto finally;
1790 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 Py_DECREF(element);
1793 }
1794 }
1795 else {
1796 PyErr_Clear();
1797 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if (!self->bin) {
1800 if (!( name = ((PyClassObject *)class)->cl_name )) {
1801 PyErr_SetString(PicklingError, "class has no name");
1802 goto finally;
1803 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804
Tim Peterscba30e22003-02-01 06:24:36 +00001805 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001807
Tim Peters84e87f32001-03-17 04:50:51 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 if ((module_size = PyString_Size(module)) < 0 ||
1810 (name_size = PyString_Size(name)) < 0)
1811 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 module_str = PyString_AS_STRING((PyStringObject *)module);
1814 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Tim Peters0bc93f52003-02-02 18:29:33 +00001816 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Tim Peters0bc93f52003-02-02 18:29:33 +00001819 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Tim Peters0bc93f52003-02-02 18:29:33 +00001822 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001824
Tim Peters0bc93f52003-02-02 18:29:33 +00001825 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001827
Tim Peters0bc93f52003-02-02 18:29:33 +00001828 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 goto finally;
1830 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001831 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 goto finally;
1833 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1836 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001837 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 goto finally;
1839 }
1840 else {
1841 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1844 PyErr_Clear();
1845 res = 0;
1846 goto finally;
1847 }
1848 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 if (!PyDict_Check(state)) {
1851 if (put2(self, args) < 0)
1852 goto finally;
1853 }
1854 else {
1855 if (put(self, args) < 0)
1856 goto finally;
1857 }
Tim Peters84e87f32001-03-17 04:50:51 +00001858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 if (save(self, state, 0) < 0)
1860 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001861
Tim Peters0bc93f52003-02-02 18:29:33 +00001862 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001865 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001867 finally:
1868 if (self->fast && !fast_save_leave(self, args))
1869 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 Py_XDECREF(module);
1872 Py_XDECREF(class);
1873 Py_XDECREF(state);
1874 Py_XDECREF(getinitargs_func);
1875 Py_XDECREF(getstate_func);
1876 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001879}
1880
1881
Guido van Rossum60456fd1997-04-09 17:36:32 +00001882static int
Tim Peterscba30e22003-02-01 06:24:36 +00001883save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001885 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 char *name_str, *module_str;
1887 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 if (name) {
1892 global_name = name;
1893 Py_INCREF(global_name);
1894 }
1895 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001896 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 goto finally;
1898 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001899
Tim Peterscba30e22003-02-01 06:24:36 +00001900 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001903 if ((module_size = PyString_Size(module)) < 0 ||
1904 (name_size = PyString_Size(global_name)) < 0)
1905 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 module_str = PyString_AS_STRING((PyStringObject *)module);
1908 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001909
Guido van Rossum75bfd052002-12-24 18:10:07 +00001910 /* XXX This can be doing a relative import. Clearly it shouldn't,
1911 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 mod = PyImport_ImportModule(module_str);
1913 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001914 cPickle_ErrFormat(PicklingError,
1915 "Can't pickle %s: it's not found as %s.%s",
1916 "OSS", args, module, global_name);
1917 goto finally;
1918 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001919 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 if (klass == NULL) {
1921 cPickle_ErrFormat(PicklingError,
1922 "Can't pickle %s: it's not found as %s.%s",
1923 "OSS", args, module, global_name);
1924 goto finally;
1925 }
1926 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001927 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 cPickle_ErrFormat(PicklingError,
1929 "Can't pickle %s: it's not the same object as %s.%s",
1930 "OSS", args, module, global_name);
1931 goto finally;
1932 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001933 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001934
Tim Peters0bc93f52003-02-02 18:29:33 +00001935 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Tim Peters0bc93f52003-02-02 18:29:33 +00001938 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940
Tim Peters0bc93f52003-02-02 18:29:33 +00001941 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001943
Tim Peters0bc93f52003-02-02 18:29:33 +00001944 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946
Tim Peters0bc93f52003-02-02 18:29:33 +00001947 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if (put(self, args) < 0)
1951 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 finally:
1956 Py_XDECREF(module);
1957 Py_XDECREF(global_name);
1958 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001960 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961}
1962
Guido van Rossum60456fd1997-04-09 17:36:32 +00001963static int
Tim Peterscba30e22003-02-01 06:24:36 +00001964save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965{
1966 PyObject *pid = 0;
1967 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001971 Py_INCREF(args);
1972 ARG_TUP(self, args);
1973 if (self->arg) {
1974 pid = PyObject_Call(f, self->arg, NULL);
1975 FREE_ARG_TUP(self);
1976 }
1977 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001979 if (pid != Py_None) {
1980 if (!self->bin) {
1981 if (!PyString_Check(pid)) {
1982 PyErr_SetString(PicklingError,
1983 "persistent id must be string");
1984 goto finally;
1985 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001986
Tim Peters0bc93f52003-02-02 18:29:33 +00001987 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001988 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 if ((size = PyString_Size(pid)) < 0)
1991 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001992
Tim Peters0bc93f52003-02-02 18:29:33 +00001993 if (self->write_func(self,
1994 PyString_AS_STRING(
1995 (PyStringObject *)pid),
1996 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001998
Tim Peters0bc93f52003-02-02 18:29:33 +00001999 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 res = 1;
2003 goto finally;
2004 }
2005 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002006 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 res = -1;
2008 else
2009 res = 1;
2010 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 goto finally;
2013 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002015 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 finally:
2018 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002021}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002022
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002023
Tim Peters84e87f32001-03-17 04:50:51 +00002024static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002025save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002026 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027{
2028 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002030 if (save(self, callable, 0) < 0)
2031 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 if (save(self, tup, 0) < 0)
2034 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002035
Tim Peters0bc93f52003-02-02 18:29:33 +00002036 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002037 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 if (ob != NULL) {
2040 if (state && !PyDict_Check(state)) {
2041 if (put2(self, ob) < 0)
2042 return -1;
2043 }
2044 else {
2045 if (put(self, ob) < 0)
2046 return -1;
2047 }
2048 }
Tim Peters84e87f32001-03-17 04:50:51 +00002049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 if (state) {
2051 if (save(self, state, 0) < 0)
2052 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002053
Tim Peters0bc93f52003-02-02 18:29:33 +00002054 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 return -1;
2056 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002058 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002059}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002060
Guido van Rossum60456fd1997-04-09 17:36:32 +00002061static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002062save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063{
2064 PyTypeObject *type;
2065 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2066 *callable = 0, *state = 0;
2067 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002068
Martin v. Löwis5a395302002-08-04 08:20:23 +00002069 if (self->nesting++ > Py_GetRecursionLimit()){
2070 PyErr_SetString(PyExc_RuntimeError,
2071 "maximum recursion depth exceeded");
2072 goto finally;
2073 }
2074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 if (!pers_save && self->pers_func) {
2076 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2077 res = tmp;
2078 goto finally;
2079 }
2080 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 if (args == Py_None) {
2083 res = save_none(self, args);
2084 goto finally;
2085 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002090 case 'b':
2091 if (args == Py_False || args == Py_True) {
2092 res = save_bool(self, args);
2093 goto finally;
2094 }
2095 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 if (type == &PyInt_Type) {
2098 res = save_int(self, args);
2099 goto finally;
2100 }
2101 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002102
Guido van Rossum60456fd1997-04-09 17:36:32 +00002103 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104 if (type == &PyLong_Type) {
2105 res = save_long(self, args);
2106 goto finally;
2107 }
2108 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002109
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 if (type == &PyFloat_Type) {
2112 res = save_float(self, args);
2113 goto finally;
2114 }
2115 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002116
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002118 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2119 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 goto finally;
2121 }
2122 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002123
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2126 res = save_string(self, args, 0);
2127 goto finally;
2128 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002129
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002130#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002131 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2133 res = save_unicode(self, args, 0);
2134 goto finally;
2135 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002136#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002140 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002143 if (PyDict_GetItem(self->memo, py_ob_id)) {
2144 if (get(self, py_ob_id) < 0)
2145 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 res = 0;
2148 goto finally;
2149 }
2150 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002153 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002154 if (type == &PyString_Type) {
2155 res = save_string(self, args, 1);
2156 goto finally;
2157 }
2158 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002159
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002160#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002161 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 if (type == &PyUnicode_Type) {
2163 res = save_unicode(self, args, 1);
2164 goto finally;
2165 }
2166 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002167#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002168
Guido van Rossum60456fd1997-04-09 17:36:32 +00002169 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 if (type == &PyTuple_Type) {
2171 res = save_tuple(self, args);
2172 goto finally;
2173 }
2174 if (type == &PyType_Type) {
2175 res = save_global(self, args, NULL);
2176 goto finally;
2177 }
2178 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002179
Guido van Rossum60456fd1997-04-09 17:36:32 +00002180 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002181 if (type == &PyList_Type) {
2182 res = save_list(self, args);
2183 goto finally;
2184 }
2185 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002186
2187 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002188 if (type == &PyDict_Type) {
2189 res = save_dict(self, args);
2190 goto finally;
2191 }
2192 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002193
2194 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002195 if (type == &PyInstance_Type) {
2196 res = save_inst(self, args);
2197 goto finally;
2198 }
2199 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002200
2201 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 if (type == &PyClass_Type) {
2203 res = save_global(self, args, NULL);
2204 goto finally;
2205 }
2206 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002207
2208 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002209 if (type == &PyFunction_Type) {
2210 res = save_global(self, args, NULL);
2211 goto finally;
2212 }
2213 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002214
2215 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 if (type == &PyCFunction_Type) {
2217 res = save_global(self, args, NULL);
2218 goto finally;
2219 }
2220 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002222 if (!pers_save && self->inst_pers_func) {
2223 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2224 res = tmp;
2225 goto finally;
2226 }
2227 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002228
Jeremy Hylton39c61162002-07-16 19:47:43 +00002229 if (PyType_IsSubtype(type, &PyType_Type)) {
2230 res = save_global(self, args, NULL);
2231 goto finally;
2232 }
2233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2235 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002237 Py_INCREF(args);
2238 ARG_TUP(self, args);
2239 if (self->arg) {
2240 t = PyObject_Call(__reduce__, self->arg, NULL);
2241 FREE_ARG_TUP(self);
2242 }
2243 if (! t) goto finally;
2244 }
2245 else {
2246 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2249 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002250 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 goto finally;
2252 }
2253 else {
2254 PyErr_Clear();
2255 }
2256 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 if (t) {
2259 if (PyString_Check(t)) {
2260 res = save_global(self, args, t);
2261 goto finally;
2262 }
Tim Peters84e87f32001-03-17 04:50:51 +00002263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002264 if (!PyTuple_Check(t)) {
2265 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2266 "be a tuple", "O", __reduce__);
2267 goto finally;
2268 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002270 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002272 if ((size != 3) && (size != 2)) {
2273 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2274 "contain only two or three elements", "O", __reduce__);
2275 goto finally;
2276 }
Tim Peters84e87f32001-03-17 04:50:51 +00002277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 if (size > 2) {
2283 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002284 if (state == Py_None)
2285 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2289 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2290 "returned by %s must be a tuple", "O", __reduce__);
2291 goto finally;
2292 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 res = save_reduce(self, callable, arg_tup, state, args);
2295 goto finally;
2296 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002301 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002302 Py_XDECREF(py_ob_id);
2303 Py_XDECREF(__reduce__);
2304 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002307}
2308
2309
2310static int
Tim Peterscba30e22003-02-01 06:24:36 +00002311dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002312{
2313 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002314
Tim Peters4190fb82003-02-02 16:09:05 +00002315 if (self->proto >= 2) {
2316 char bytes[2];
2317
2318 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002319 assert(self->proto >= 0 && self->proto < 256);
2320 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002321 if (self->write_func(self, bytes, 2) < 0)
2322 return -1;
2323 }
2324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 if (save(self, args, 0) < 0)
2326 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002327
Tim Peters4190fb82003-02-02 16:09:05 +00002328 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330
Tim Peters4190fb82003-02-02 16:09:05 +00002331 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002335}
2336
2337static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002338Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339{
Tim Peterscba30e22003-02-01 06:24:36 +00002340 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 PyDict_Clear(self->memo);
2342 Py_INCREF(Py_None);
2343 return Py_None;
2344}
2345
2346static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002347Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002348{
2349 int l, i, rsize, ssize, clear=1, lm;
2350 long ik;
2351 PyObject *k, *r;
2352 char *s, *p, *have_get;
2353 Pdata *data;
2354
2355 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002356 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357 return NULL;
2358
2359 /* Check to make sure we are based on a list */
2360 if (! Pdata_Check(self->file)) {
2361 PyErr_SetString(PicklingError,
2362 "Attempt to getvalue() a non-list-based pickler");
2363 return NULL;
2364 }
2365
2366 /* flush write buffer */
2367 if (write_other(self, NULL, 0) < 0) return NULL;
2368
2369 data=(Pdata*)self->file;
2370 l=data->length;
2371
2372 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002373 lm = PyDict_Size(self->memo);
2374 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002375 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002376 have_get = malloc(lm);
2377 if (have_get == NULL) return PyErr_NoMemory();
2378 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379
2380 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002381 for (rsize = 0, i = l; --i >= 0; ) {
2382 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383
Tim Petersac5687a2003-02-02 18:08:34 +00002384 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386
2387 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002388 ik = PyInt_AS_LONG((PyIntObject*)k);
2389 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002390 PyErr_SetString(PicklingError,
2391 "Invalid get data");
2392 return NULL;
2393 }
Tim Petersac5687a2003-02-02 18:08:34 +00002394 if (have_get[ik]) /* with matching get */
2395 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396 }
2397
2398 else if (! (PyTuple_Check(k) &&
2399 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002400 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 ) {
2402 PyErr_SetString(PicklingError,
2403 "Unexpected data in internal list");
2404 return NULL;
2405 }
2406
2407 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002408 ik = PyInt_AS_LONG((PyIntObject *)k);
2409 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002410 PyErr_SetString(PicklingError,
2411 "Invalid get data");
2412 return NULL;
2413 }
Tim Petersac5687a2003-02-02 18:08:34 +00002414 have_get[ik] = 1;
2415 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002416 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 }
2418
2419 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002420 r = PyString_FromStringAndSize(NULL, rsize);
2421 if (r == NULL) goto err;
2422 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002423
Tim Petersac5687a2003-02-02 18:08:34 +00002424 for (i = 0; i < l; i++) {
2425 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002426
2427 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002428 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002430 p=PyString_AS_STRING((PyStringObject *)k);
2431 while (--ssize >= 0)
2432 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 }
2434 }
2435
2436 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002437 ik = PyInt_AS_LONG((PyIntObject *)
2438 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002439 if (ik < 256) {
2440 *s++ = BINGET;
2441 *s++ = (int)(ik & 0xff);
2442 }
2443 else {
2444 *s++ = LONG_BINGET;
2445 *s++ = (int)(ik & 0xff);
2446 *s++ = (int)((ik >> 8) & 0xff);
2447 *s++ = (int)((ik >> 16) & 0xff);
2448 *s++ = (int)((ik >> 24) & 0xff);
2449 }
2450 }
2451
2452 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002453 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002454
2455 if (have_get[ik]) { /* with matching get */
2456 if (ik < 256) {
2457 *s++ = BINPUT;
2458 *s++ = (int)(ik & 0xff);
2459 }
2460 else {
2461 *s++ = LONG_BINPUT;
2462 *s++ = (int)(ik & 0xff);
2463 *s++ = (int)((ik >> 8) & 0xff);
2464 *s++ = (int)((ik >> 16) & 0xff);
2465 *s++ = (int)((ik >> 24) & 0xff);
2466 }
2467 }
2468 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002469 }
2470
2471 if (clear) {
2472 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002473 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 }
2475
2476 free(have_get);
2477 return r;
2478 err:
2479 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002480 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002481}
2482
2483static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002484Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485{
2486 PyObject *ob;
2487 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002488
Tim Peterscba30e22003-02-01 06:24:36 +00002489 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002490 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492 if (dump(self, ob) < 0)
2493 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 /* XXX Why does dump() return self? */
2498 Py_INCREF(self);
2499 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002500}
2501
2502
Tim Peterscba30e22003-02-01 06:24:36 +00002503static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504{
Neal Norwitzb0493252002-03-31 14:44:22 +00002505 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002506 PyDoc_STR("dump(object) -- "
2507 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002508 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002509 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002510 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002511 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002512 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002513};
2514
2515
2516static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002517newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002518{
2519 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002520
Tim Peters5bd2a792003-02-01 16:45:06 +00002521 if (proto < 0)
2522 proto = CURRENT_PROTOCOL_NUMBER;
2523 if (proto > CURRENT_PROTOCOL_NUMBER) {
2524 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2525 "the highest available protocol is %d",
2526 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002528 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002529
Tim Peters5bd2a792003-02-01 16:45:06 +00002530 self = PyObject_New(Picklerobject, &Picklertype);
2531 if (self == NULL)
2532 return NULL;
2533 self->proto = proto;
2534 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002535 self->fp = NULL;
2536 self->write = NULL;
2537 self->memo = NULL;
2538 self->arg = NULL;
2539 self->pers_func = NULL;
2540 self->inst_pers_func = NULL;
2541 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002542 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002543 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002544 self->fast_container = 0;
2545 self->fast_memo = NULL;
2546 self->buf_size = 0;
2547 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002548
Tim Peters5bd2a792003-02-01 16:45:06 +00002549 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550 if (file)
2551 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002552 else {
2553 file = Pdata_New();
2554 if (file == NULL)
2555 goto err;
2556 }
2557 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002558
Tim Peterscba30e22003-02-01 06:24:36 +00002559 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002560 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002562 if (PyFile_Check(file)) {
2563 self->fp = PyFile_AsFile(file);
2564 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002565 PyErr_SetString(PyExc_ValueError,
2566 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567 goto err;
2568 }
2569 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002570 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002571 else if (PycStringIO_OutputCheck(file)) {
2572 self->write_func = write_cStringIO;
2573 }
2574 else if (file == Py_None) {
2575 self->write_func = write_none;
2576 }
2577 else {
2578 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 if (! Pdata_Check(file)) {
2581 self->write = PyObject_GetAttr(file, write_str);
2582 if (!self->write) {
2583 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002584 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585 "argument must have 'write' "
2586 "attribute");
2587 goto err;
2588 }
2589 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002590
Tim Peters5bd2a792003-02-01 16:45:06 +00002591 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2592 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 PyErr_NoMemory();
2594 goto err;
2595 }
2596 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 if (PyEval_GetRestricted()) {
2599 /* Restricted execution, get private tables */
2600 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2603 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2604 Py_DECREF(m);
2605 if (!( self->dispatch_table )) goto err;
2606 }
2607 else {
2608 self->dispatch_table=dispatch_table;
2609 Py_INCREF(dispatch_table);
2610 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002615 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002617}
2618
2619
2620static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002621get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002622{
2623 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002624 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002625
Tim Peters5bd2a792003-02-01 16:45:06 +00002626 /* XXX What is this doing? The documented signature is
2627 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2628 * XXX Pickler(integer) too. The meaning then is clear as mud.
2629 * XXX Bug? Feature?
2630 */
2631 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002633 proto = 0;
2634 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002635 return NULL;
2636 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002638}
2639
2640
2641static void
Tim Peterscba30e22003-02-01 06:24:36 +00002642Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002643{
2644 Py_XDECREF(self->write);
2645 Py_XDECREF(self->memo);
2646 Py_XDECREF(self->fast_memo);
2647 Py_XDECREF(self->arg);
2648 Py_XDECREF(self->file);
2649 Py_XDECREF(self->pers_func);
2650 Py_XDECREF(self->inst_pers_func);
2651 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002652 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002654}
2655
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002656static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002657Pickler_get_pers_func(Picklerobject *p)
2658{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 if (p->pers_func == NULL)
2660 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2661 else
2662 Py_INCREF(p->pers_func);
2663 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002664}
2665
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002666static int
2667Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2668{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002669 if (v == NULL) {
2670 PyErr_SetString(PyExc_TypeError,
2671 "attribute deletion is not supported");
2672 return -1;
2673 }
2674 Py_XDECREF(p->pers_func);
2675 Py_INCREF(v);
2676 p->pers_func = v;
2677 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002678}
2679
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002680static int
2681Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2682{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 if (v == NULL) {
2684 PyErr_SetString(PyExc_TypeError,
2685 "attribute deletion is not supported");
2686 return -1;
2687 }
2688 Py_XDECREF(p->inst_pers_func);
2689 Py_INCREF(v);
2690 p->inst_pers_func = v;
2691 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002692}
2693
2694static PyObject *
2695Pickler_get_memo(Picklerobject *p)
2696{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 if (p->memo == NULL)
2698 PyErr_SetString(PyExc_AttributeError, "memo");
2699 else
2700 Py_INCREF(p->memo);
2701 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002702}
2703
2704static int
2705Pickler_set_memo(Picklerobject *p, PyObject *v)
2706{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707 if (v == NULL) {
2708 PyErr_SetString(PyExc_TypeError,
2709 "attribute deletion is not supported");
2710 return -1;
2711 }
2712 if (!PyDict_Check(v)) {
2713 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2714 return -1;
2715 }
2716 Py_XDECREF(p->memo);
2717 Py_INCREF(v);
2718 p->memo = v;
2719 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002720}
2721
2722static PyObject *
2723Pickler_get_error(Picklerobject *p)
2724{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 /* why is this an attribute on the Pickler? */
2726 Py_INCREF(PicklingError);
2727 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002728}
2729
2730static PyMemberDef Pickler_members[] = {
2731 {"binary", T_INT, offsetof(Picklerobject, bin)},
2732 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002733 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002734};
2735
2736static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002737 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002738 (setter)Pickler_set_pers_func},
2739 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2740 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002741 {"PicklingError", (getter)Pickler_get_error, NULL},
2742 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002743};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745PyDoc_STRVAR(Picklertype__doc__,
2746"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002747
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002748static PyTypeObject Picklertype = {
2749 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002751 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002752 sizeof(Picklerobject), /*tp_basicsize*/
2753 0,
2754 (destructor)Pickler_dealloc, /* tp_dealloc */
2755 0, /* tp_print */
2756 0, /* tp_getattr */
2757 0, /* tp_setattr */
2758 0, /* tp_compare */
2759 0, /* tp_repr */
2760 0, /* tp_as_number */
2761 0, /* tp_as_sequence */
2762 0, /* tp_as_mapping */
2763 0, /* tp_hash */
2764 0, /* tp_call */
2765 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002766 PyObject_GenericGetAttr, /* tp_getattro */
2767 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002768 0, /* tp_as_buffer */
2769 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2770 Picklertype__doc__, /* tp_doc */
2771 0, /* tp_traverse */
2772 0, /* tp_clear */
2773 0, /* tp_richcompare */
2774 0, /* tp_weaklistoffset */
2775 0, /* tp_iter */
2776 0, /* tp_iternext */
2777 Pickler_methods, /* tp_methods */
2778 Pickler_members, /* tp_members */
2779 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002780};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002781
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002782static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002783find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784{
2785 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 if (fc) {
2788 if (fc==Py_None) {
2789 PyErr_SetString(UnpicklingError,
2790 "Global and instance pickles are not supported.");
2791 return NULL;
2792 }
Tim Peterscba30e22003-02-01 06:24:36 +00002793 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 py_global_name);
2795 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 module = PySys_GetObject("modules");
2798 if (module == NULL)
2799 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 module = PyDict_GetItem(module, py_module_name);
2802 if (module == NULL) {
2803 module = PyImport_Import(py_module_name);
2804 if (!module)
2805 return NULL;
2806 global = PyObject_GetAttr(module, py_global_name);
2807 Py_DECREF(module);
2808 }
2809 else
2810 global = PyObject_GetAttr(module, py_global_name);
2811 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002812}
2813
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002814static int
Tim Peterscba30e22003-02-01 06:24:36 +00002815marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816{
2817 if (self->num_marks < 1) {
2818 PyErr_SetString(UnpicklingError, "could not find MARK");
2819 return -1;
2820 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002823}
2824
Tim Peters84e87f32001-03-17 04:50:51 +00002825
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826static int
Tim Peterscba30e22003-02-01 06:24:36 +00002827load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828{
2829 PDATA_APPEND(self->stack, Py_None, -1);
2830 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002831}
2832
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002833static int
Tim Peterscba30e22003-02-01 06:24:36 +00002834bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835{
2836 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2837 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002838}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839
2840static int
Tim Peterscba30e22003-02-01 06:24:36 +00002841load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842{
2843 PyObject *py_int = 0;
2844 char *endptr, *s;
2845 int len, res = -1;
2846 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002847
Tim Peters0bc93f52003-02-02 18:29:33 +00002848 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 if (len < 2) return bad_readline();
2850 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852 errno = 0;
2853 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2856 /* Hm, maybe we've got something long. Let's try reading
2857 it as a Python long object. */
2858 errno = 0;
2859 py_int = PyLong_FromString(s, NULL, 0);
2860 if (py_int == NULL) {
2861 PyErr_SetString(PyExc_ValueError,
2862 "could not convert string to int");
2863 goto finally;
2864 }
2865 }
2866 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002867 if (len == 3 && (l == 0 || l == 1)) {
2868 if (!( py_int = PyBool_FromLong(l))) goto finally;
2869 }
2870 else {
2871 if (!( py_int = PyInt_FromLong(l))) goto finally;
2872 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875 free(s);
2876 PDATA_PUSH(self->stack, py_int, -1);
2877 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 finally:
2880 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883}
2884
Tim Peters3c67d792003-02-02 17:59:11 +00002885static int
2886load_bool(Unpicklerobject *self, PyObject *boolean)
2887{
2888 assert(boolean == Py_True || boolean == Py_False);
2889 Py_INCREF(boolean);
2890 PDATA_PUSH(self->stack, boolean, -1);
2891 return 0;
2892}
2893
Tim Petersee1a53c2003-02-02 02:57:53 +00002894/* s contains x bytes of a little-endian integer. Return its value as a
2895 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2896 * int, but when x is 4 it's a signed one. This is an historical source
2897 * of x-platform bugs.
2898 */
Tim Peters84e87f32001-03-17 04:50:51 +00002899static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002900calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901{
2902 unsigned char c;
2903 int i;
2904 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002906 for (i = 0, l = 0L; i < x; i++) {
2907 c = (unsigned char)s[i];
2908 l |= (long)c << (i * 8);
2909 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002910#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002911 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2912 * is signed, so on a box with longs bigger than 4 bytes we need
2913 * to extend a BININT's sign bit to the full width.
2914 */
2915 if (x == 4 && l & (1L << 31))
2916 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002917#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919}
2920
2921
2922static int
Tim Peterscba30e22003-02-01 06:24:36 +00002923load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924{
2925 PyObject *py_int = 0;
2926 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929
Tim Peterscba30e22003-02-01 06:24:36 +00002930 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002931 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 PDATA_PUSH(self->stack, py_int, -1);
2934 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935}
2936
2937
2938static int
Tim Peterscba30e22003-02-01 06:24:36 +00002939load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940{
2941 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Tim Peters0bc93f52003-02-02 18:29:33 +00002943 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947}
2948
2949
2950static int
Tim Peterscba30e22003-02-01 06:24:36 +00002951load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952{
2953 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954
Tim Peters0bc93f52003-02-02 18:29:33 +00002955 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959}
2960
2961
2962static int
Tim Peterscba30e22003-02-01 06:24:36 +00002963load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964{
2965 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002966
Tim Peters0bc93f52003-02-02 18:29:33 +00002967 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971}
Tim Peters84e87f32001-03-17 04:50:51 +00002972
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973static int
Tim Peterscba30e22003-02-01 06:24:36 +00002974load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975{
2976 PyObject *l = 0;
2977 char *end, *s;
2978 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979
Tim Peters0bc93f52003-02-02 18:29:33 +00002980 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if (len < 2) return bad_readline();
2982 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983
Tim Peterscba30e22003-02-01 06:24:36 +00002984 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 free(s);
2988 PDATA_PUSH(self->stack, l, -1);
2989 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 finally:
2992 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002995}
2996
Tim Petersee1a53c2003-02-02 02:57:53 +00002997/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2998 * data following.
2999 */
3000static int
3001load_counted_long(Unpicklerobject *self, int size)
3002{
3003 int i;
3004 char *nbytes;
3005 unsigned char *pdata;
3006 PyObject *along;
3007
3008 assert(size == 1 || size == 4);
3009 i = self->read_func(self, &nbytes, size);
3010 if (i < 0) return -1;
3011
3012 size = calc_binint(nbytes, size);
3013 if (size < 0) {
3014 /* Corrupt or hostile pickle -- we never write one like
3015 * this.
3016 */
3017 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
3018 "byte count");
3019 return -1;
3020 }
3021
3022 if (size == 0)
3023 along = PyLong_FromLong(0L);
3024 else {
3025 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003026 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003027 if (i < 0) return -1;
3028 along = _PyLong_FromByteArray(pdata, (size_t)size,
3029 1 /* little endian */, 1 /* signed */);
3030 }
3031 if (along == NULL)
3032 return -1;
3033 PDATA_PUSH(self->stack, along, -1);
3034 return 0;
3035}
Tim Peters84e87f32001-03-17 04:50:51 +00003036
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037static int
Tim Peterscba30e22003-02-01 06:24:36 +00003038load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039{
3040 PyObject *py_float = 0;
3041 char *endptr, *s;
3042 int len, res = -1;
3043 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
Tim Peters0bc93f52003-02-02 18:29:33 +00003045 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if (len < 2) return bad_readline();
3047 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003049 errno = 0;
3050 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3053 PyErr_SetString(PyExc_ValueError,
3054 "could not convert string to float");
3055 goto finally;
3056 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Tim Peterscba30e22003-02-01 06:24:36 +00003058 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 free(s);
3062 PDATA_PUSH(self->stack, py_float, -1);
3063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065 finally:
3066 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003069}
3070
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071static int
Tim Peterscba30e22003-02-01 06:24:36 +00003072load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073{
3074 PyObject *py_float = 0;
3075 int s, e;
3076 long fhi, flo;
3077 double x;
3078 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079
Tim Peters0bc93f52003-02-02 18:29:33 +00003080 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 /* First byte */
3084 s = (*p>>7) & 1;
3085 e = (*p & 0x7F) << 4;
3086 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 /* Second byte */
3089 e |= (*p>>4) & 0xF;
3090 fhi = (*p & 0xF) << 24;
3091 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093 /* Third byte */
3094 fhi |= (*p & 0xFF) << 16;
3095 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 /* Fourth byte */
3098 fhi |= (*p & 0xFF) << 8;
3099 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 /* Fifth byte */
3102 fhi |= *p & 0xFF;
3103 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 /* Sixth byte */
3106 flo = (*p & 0xFF) << 16;
3107 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 /* Seventh byte */
3110 flo |= (*p & 0xFF) << 8;
3111 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 /* Eighth byte */
3114 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3117 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 /* XXX This sadly ignores Inf/NaN */
3120 if (e == 0)
3121 e = -1022;
3122 else {
3123 x += 1.0;
3124 e -= 1023;
3125 }
3126 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 if (s)
3129 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 PDATA_PUSH(self->stack, py_float, -1);
3134 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003136
3137static int
Tim Peterscba30e22003-02-01 06:24:36 +00003138load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139{
3140 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003141 int len, res = -1;
3142 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003143
Tim Peters0bc93f52003-02-02 18:29:33 +00003144 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 if (len < 2) return bad_readline();
3146 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003148
3149 /* Strip outermost quotes */
3150 while (s[len-1] <= ' ')
3151 len--;
3152 if(s[0]=='"' && s[len-1]=='"'){
3153 s[len-1] = '\0';
3154 p = s + 1 ;
3155 len -= 2;
3156 } else if(s[0]=='\'' && s[len-1]=='\''){
3157 s[len-1] = '\0';
3158 p = s + 1 ;
3159 len -= 2;
3160 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003161 goto insecure;
3162 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003163
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003164 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3165 if (str) {
3166 PDATA_PUSH(self->stack, str, -1);
3167 res = 0;
3168 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172 insecure:
3173 free(s);
3174 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3175 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003176}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177
3178
3179static int
Tim Peterscba30e22003-02-01 06:24:36 +00003180load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181{
3182 PyObject *py_string = 0;
3183 long l;
3184 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Tim Peters0bc93f52003-02-02 18:29:33 +00003186 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
Tim Peters0bc93f52003-02-02 18:29:33 +00003190 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
Tim Peterscba30e22003-02-01 06:24:36 +00003193 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 PDATA_PUSH(self->stack, py_string, -1);
3197 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198}
3199
3200
3201static int
Tim Peterscba30e22003-02-01 06:24:36 +00003202load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203{
3204 PyObject *py_string = 0;
3205 unsigned char l;
3206 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207
Tim Peters0bc93f52003-02-02 18:29:33 +00003208 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212
Tim Peters0bc93f52003-02-02 18:29:33 +00003213 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 PDATA_PUSH(self->stack, py_string, -1);
3218 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003219}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
3221
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003222#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003223static int
Tim Peterscba30e22003-02-01 06:24:36 +00003224load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225{
3226 PyObject *str = 0;
3227 int len, res = -1;
3228 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003229
Tim Peters0bc93f52003-02-02 18:29:33 +00003230 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003232
Tim Peterscba30e22003-02-01 06:24:36 +00003233 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003234 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236 PDATA_PUSH(self->stack, str, -1);
3237 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 finally:
3240 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003241}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003242#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003243
3244
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003245#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003246static int
Tim Peterscba30e22003-02-01 06:24:36 +00003247load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248{
3249 PyObject *unicode;
3250 long l;
3251 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003252
Tim Peters0bc93f52003-02-02 18:29:33 +00003253 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003256
Tim Peters0bc93f52003-02-02 18:29:33 +00003257 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003259
Tim Peterscba30e22003-02-01 06:24:36 +00003260 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 PDATA_PUSH(self->stack, unicode, -1);
3264 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003265}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003266#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003267
3268
3269static int
Tim Peterscba30e22003-02-01 06:24:36 +00003270load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271{
3272 PyObject *tup;
3273 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 if ((i = marker(self)) < 0) return -1;
3276 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3277 PDATA_PUSH(self->stack, tup, -1);
3278 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279}
3280
3281static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003282load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003283{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003284 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285
Tim Peters1d63c9f2003-02-02 20:29:39 +00003286 if (tup == NULL)
3287 return -1;
3288
3289 while (--len >= 0) {
3290 PyObject *element;
3291
3292 PDATA_POP(self->stack, element);
3293 if (element == NULL)
3294 return -1;
3295 PyTuple_SET_ITEM(tup, len, element);
3296 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003297 PDATA_PUSH(self->stack, tup, -1);
3298 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299}
3300
3301static int
Tim Peterscba30e22003-02-01 06:24:36 +00003302load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303{
3304 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 if (!( list=PyList_New(0))) return -1;
3307 PDATA_PUSH(self->stack, list, -1);
3308 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003309}
3310
3311static int
Tim Peterscba30e22003-02-01 06:24:36 +00003312load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003313{
3314 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003316 if (!( dict=PyDict_New())) return -1;
3317 PDATA_PUSH(self->stack, dict, -1);
3318 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003319}
3320
3321
3322static int
Tim Peterscba30e22003-02-01 06:24:36 +00003323load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003324{
3325 PyObject *list = 0;
3326 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003328 if ((i = marker(self)) < 0) return -1;
3329 if (!( list=Pdata_popList(self->stack, i))) return -1;
3330 PDATA_PUSH(self->stack, list, -1);
3331 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003332}
3333
3334static int
Tim Peterscba30e22003-02-01 06:24:36 +00003335load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336{
3337 PyObject *dict, *key, *value;
3338 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003340 if ((i = marker(self)) < 0) return -1;
3341 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003343 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345 for (k = i+1; k < j; k += 2) {
3346 key =self->stack->data[k-1];
3347 value=self->stack->data[k ];
3348 if (PyDict_SetItem(dict, key, value) < 0) {
3349 Py_DECREF(dict);
3350 return -1;
3351 }
3352 }
3353 Pdata_clear(self->stack, i);
3354 PDATA_PUSH(self->stack, dict, -1);
3355 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003356}
3357
3358static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003359Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003361 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003363 if (PyClass_Check(cls)) {
3364 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 if ((l=PyObject_Size(args)) < 0) goto err;
3367 if (!( l )) {
3368 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003369
Tim Peterscba30e22003-02-01 06:24:36 +00003370 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371 __getinitargs___str);
3372 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003373 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003374 so bypass usual construction */
3375 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003377 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003378 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 goto err;
3380 return inst;
3381 }
3382 Py_DECREF(__getinitargs__);
3383 }
Tim Peters84e87f32001-03-17 04:50:51 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 if ((r=PyInstance_New(cls, args, NULL))) return r;
3386 else goto err;
3387 }
Tim Peters84e87f32001-03-17 04:50:51 +00003388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003389 if (args==Py_None) {
3390 /* Special case, call cls.__basicnew__() */
3391 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3394 if (!basicnew) return NULL;
3395 r=PyObject_CallObject(basicnew, NULL);
3396 Py_DECREF(basicnew);
3397 if (r) return r;
3398 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 err:
3403 {
3404 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 PyErr_Fetch(&tp, &v, &tb);
3407 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3408 Py_XDECREF(v);
3409 v=r;
3410 }
3411 PyErr_Restore(tp,v,tb);
3412 }
3413 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414}
Tim Peters84e87f32001-03-17 04:50:51 +00003415
Guido van Rossum60456fd1997-04-09 17:36:32 +00003416
3417static int
Tim Peterscba30e22003-02-01 06:24:36 +00003418load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419{
3420 PyObject *class, *tup, *obj=0;
3421 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 if ((i = marker(self)) < 0) return -1;
3424 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3425 PDATA_POP(self->stack, class);
3426 if (class) {
3427 obj = Instance_New(class, tup);
3428 Py_DECREF(class);
3429 }
3430 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 if (! obj) return -1;
3433 PDATA_PUSH(self->stack, obj, -1);
3434 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435}
3436
3437
3438static int
Tim Peterscba30e22003-02-01 06:24:36 +00003439load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440{
3441 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3442 int i, len;
3443 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003446
Tim Peters0bc93f52003-02-02 18:29:33 +00003447 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 if (len < 2) return bad_readline();
3449 module_name = PyString_FromStringAndSize(s, len - 1);
3450 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003451
Tim Peters0bc93f52003-02-02 18:29:33 +00003452 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003453 if (len < 2) return bad_readline();
3454 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003455 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 self->find_class);
3457 Py_DECREF(class_name);
3458 }
3459 }
3460 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 if ((tup=Pdata_popTuple(self->stack, i))) {
3465 obj = Instance_New(class, tup);
3466 Py_DECREF(tup);
3467 }
3468 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472 PDATA_PUSH(self->stack, obj, -1);
3473 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474}
3475
3476
3477static int
Tim Peterscba30e22003-02-01 06:24:36 +00003478load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479{
3480 PyObject *class = 0, *module_name = 0, *class_name = 0;
3481 int len;
3482 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003483
Tim Peters0bc93f52003-02-02 18:29:33 +00003484 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 if (len < 2) return bad_readline();
3486 module_name = PyString_FromStringAndSize(s, len - 1);
3487 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488
Tim Peters0bc93f52003-02-02 18:29:33 +00003489 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003490 if (len < 2) {
3491 Py_DECREF(module_name);
3492 return bad_readline();
3493 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003495 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 self->find_class);
3497 Py_DECREF(class_name);
3498 }
3499 }
3500 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502 if (! class) return -1;
3503 PDATA_PUSH(self->stack, class, -1);
3504 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003505}
3506
3507
3508static int
Tim Peterscba30e22003-02-01 06:24:36 +00003509load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510{
3511 PyObject *pid = 0;
3512 int len;
3513 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003516 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003517 if (len < 2) return bad_readline();
3518
3519 pid = PyString_FromStringAndSize(s, len - 1);
3520 if (!pid) return -1;
3521
3522 if (PyList_Check(self->pers_func)) {
3523 if (PyList_Append(self->pers_func, pid) < 0) {
3524 Py_DECREF(pid);
3525 return -1;
3526 }
3527 }
3528 else {
3529 ARG_TUP(self, pid);
3530 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003531 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532 NULL);
3533 FREE_ARG_TUP(self);
3534 }
3535 }
3536
3537 if (! pid) return -1;
3538
3539 PDATA_PUSH(self->stack, pid, -1);
3540 return 0;
3541 }
3542 else {
3543 PyErr_SetString(UnpicklingError,
3544 "A load persistent id instruction was encountered,\n"
3545 "but no persistent_load function was specified.");
3546 return -1;
3547 }
3548}
3549
3550static int
Tim Peterscba30e22003-02-01 06:24:36 +00003551load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552{
3553 PyObject *pid = 0;
3554
3555 if (self->pers_func) {
3556 PDATA_POP(self->stack, pid);
3557 if (! pid) return -1;
3558
3559 if (PyList_Check(self->pers_func)) {
3560 if (PyList_Append(self->pers_func, pid) < 0) {
3561 Py_DECREF(pid);
3562 return -1;
3563 }
3564 }
3565 else {
3566 ARG_TUP(self, pid);
3567 if (self->arg) {
3568 pid = PyObject_Call(self->pers_func, self->arg,
3569 NULL);
3570 FREE_ARG_TUP(self);
3571 }
3572 if (! pid) return -1;
3573 }
3574
3575 PDATA_PUSH(self->stack, pid, -1);
3576 return 0;
3577 }
3578 else {
3579 PyErr_SetString(UnpicklingError,
3580 "A load persistent id instruction was encountered,\n"
3581 "but no persistent_load function was specified.");
3582 return -1;
3583 }
3584}
3585
3586
3587static int
Tim Peterscba30e22003-02-01 06:24:36 +00003588load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589{
3590 int len;
3591
3592 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3593
3594 /* Note that we split the (pickle.py) stack into two stacks,
3595 an object stack and a mark stack. We have to be clever and
3596 pop the right one. We do this by looking at the top of the
3597 mark stack.
3598 */
3599
3600 if ((self->num_marks > 0) &&
3601 (self->marks[self->num_marks - 1] == len))
3602 self->num_marks--;
3603 else {
3604 len--;
3605 Py_DECREF(self->stack->data[len]);
3606 self->stack->length=len;
3607 }
3608
3609 return 0;
3610}
3611
3612
3613static int
Tim Peterscba30e22003-02-01 06:24:36 +00003614load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615{
3616 int i;
3617
3618 if ((i = marker(self)) < 0)
3619 return -1;
3620
3621 Pdata_clear(self->stack, i);
3622
3623 return 0;
3624}
3625
3626
3627static int
Tim Peterscba30e22003-02-01 06:24:36 +00003628load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629{
3630 PyObject *last;
3631 int len;
3632
3633 if ((len = self->stack->length) <= 0) return stackUnderflow();
3634 last=self->stack->data[len-1];
3635 Py_INCREF(last);
3636 PDATA_PUSH(self->stack, last, -1);
3637 return 0;
3638}
3639
3640
3641static int
Tim Peterscba30e22003-02-01 06:24:36 +00003642load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003643{
3644 PyObject *py_str = 0, *value = 0;
3645 int len;
3646 char *s;
3647 int rc;
3648
Tim Peters0bc93f52003-02-02 18:29:33 +00003649 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003650 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003652 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003654 value = PyDict_GetItem(self->memo, py_str);
3655 if (! value) {
3656 PyErr_SetObject(BadPickleGet, py_str);
3657 rc = -1;
3658 } else {
3659 PDATA_APPEND(self->stack, value, -1);
3660 rc = 0;
3661 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003663 Py_DECREF(py_str);
3664 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665}
3666
3667
3668static int
Tim Peterscba30e22003-02-01 06:24:36 +00003669load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670{
3671 PyObject *py_key = 0, *value = 0;
3672 unsigned char key;
3673 char *s;
3674 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003675
Tim Peters0bc93f52003-02-02 18:29:33 +00003676 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 key = (unsigned char)s[0];
3679 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681 value = PyDict_GetItem(self->memo, py_key);
3682 if (! value) {
3683 PyErr_SetObject(BadPickleGet, py_key);
3684 rc = -1;
3685 } else {
3686 PDATA_APPEND(self->stack, value, -1);
3687 rc = 0;
3688 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 Py_DECREF(py_key);
3691 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003692}
3693
3694
3695static int
Tim Peterscba30e22003-02-01 06:24:36 +00003696load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003697{
3698 PyObject *py_key = 0, *value = 0;
3699 unsigned char c;
3700 char *s;
3701 long key;
3702 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003703
Tim Peters0bc93f52003-02-02 18:29:33 +00003704 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 c = (unsigned char)s[0];
3707 key = (long)c;
3708 c = (unsigned char)s[1];
3709 key |= (long)c << 8;
3710 c = (unsigned char)s[2];
3711 key |= (long)c << 16;
3712 c = (unsigned char)s[3];
3713 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3716
3717 value = PyDict_GetItem(self->memo, py_key);
3718 if (! value) {
3719 PyErr_SetObject(BadPickleGet, py_key);
3720 rc = -1;
3721 } else {
3722 PDATA_APPEND(self->stack, value, -1);
3723 rc = 0;
3724 }
3725
3726 Py_DECREF(py_key);
3727 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728}
3729
3730
3731static int
Tim Peterscba30e22003-02-01 06:24:36 +00003732load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003733{
3734 PyObject *py_str = 0, *value = 0;
3735 int len, l;
3736 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003737
Tim Peters0bc93f52003-02-02 18:29:33 +00003738 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739 if (l < 2) return bad_readline();
3740 if (!( len=self->stack->length )) return stackUnderflow();
3741 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3742 value=self->stack->data[len-1];
3743 l=PyDict_SetItem(self->memo, py_str, value);
3744 Py_DECREF(py_str);
3745 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746}
3747
3748
3749static int
Tim Peterscba30e22003-02-01 06:24:36 +00003750load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003751{
3752 PyObject *py_key = 0, *value = 0;
3753 unsigned char key;
3754 char *s;
3755 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Tim Peters0bc93f52003-02-02 18:29:33 +00003757 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3763 value=self->stack->data[len-1];
3764 len=PyDict_SetItem(self->memo, py_key, value);
3765 Py_DECREF(py_key);
3766 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003767}
3768
3769
3770static int
Tim Peterscba30e22003-02-01 06:24:36 +00003771load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772{
3773 PyObject *py_key = 0, *value = 0;
3774 long key;
3775 unsigned char c;
3776 char *s;
3777 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
Tim Peters0bc93f52003-02-02 18:29:33 +00003779 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 c = (unsigned char)s[0];
3783 key = (long)c;
3784 c = (unsigned char)s[1];
3785 key |= (long)c << 8;
3786 c = (unsigned char)s[2];
3787 key |= (long)c << 16;
3788 c = (unsigned char)s[3];
3789 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003791 if (!( py_key = PyInt_FromLong(key))) return -1;
3792 value=self->stack->data[len-1];
3793 len=PyDict_SetItem(self->memo, py_key, value);
3794 Py_DECREF(py_key);
3795 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796}
3797
3798
3799static int
Tim Peterscba30e22003-02-01 06:24:36 +00003800do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801{
3802 PyObject *value = 0, *list = 0, *append_method = 0;
3803 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 len=self->stack->length;
3806 if (!( len >= x && x > 0 )) return stackUnderflow();
3807 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003808 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812 if (PyList_Check(list)) {
3813 PyObject *slice;
3814 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816 slice=Pdata_popList(self->stack, x);
3817 list_len = PyList_GET_SIZE(list);
3818 i=PyList_SetSlice(list, list_len, list_len, slice);
3819 Py_DECREF(slice);
3820 return i;
3821 }
3822 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823
Tim Peterscba30e22003-02-01 06:24:36 +00003824 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 return -1;
3826
3827 for (i = x; i < len; i++) {
3828 PyObject *junk;
3829
3830 value=self->stack->data[i];
3831 junk=0;
3832 ARG_TUP(self, value);
3833 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003834 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835 NULL);
3836 FREE_ARG_TUP(self);
3837 }
3838 if (! junk) {
3839 Pdata_clear(self->stack, i+1);
3840 self->stack->length=x;
3841 Py_DECREF(append_method);
3842 return -1;
3843 }
3844 Py_DECREF(junk);
3845 }
3846 self->stack->length=x;
3847 Py_DECREF(append_method);
3848 }
3849
3850 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003851}
3852
3853
3854static int
Tim Peterscba30e22003-02-01 06:24:36 +00003855load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856{
3857 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858}
3859
3860
3861static int
Tim Peterscba30e22003-02-01 06:24:36 +00003862load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003863{
3864 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003865}
3866
3867
3868static int
Tim Peterscba30e22003-02-01 06:24:36 +00003869do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870{
3871 PyObject *value = 0, *key = 0, *dict = 0;
3872 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 if (!( (len=self->stack->length) >= x
3875 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 for (i = x+1; i < len; i += 2) {
3880 key =self->stack->data[i-1];
3881 value=self->stack->data[i ];
3882 if (PyObject_SetItem(dict, key, value) < 0) {
3883 r=-1;
3884 break;
3885 }
3886 }
3887
3888 Pdata_clear(self->stack, x);
3889
3890 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003891}
3892
3893
Tim Peters84e87f32001-03-17 04:50:51 +00003894static int
Tim Peterscba30e22003-02-01 06:24:36 +00003895load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896{
3897 return do_setitems(self, self->stack->length - 2);
3898}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900static int
Tim Peterscba30e22003-02-01 06:24:36 +00003901load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902{
3903 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003904}
3905
Tim Peters84e87f32001-03-17 04:50:51 +00003906
Guido van Rossum60456fd1997-04-09 17:36:32 +00003907static int
Tim Peterscba30e22003-02-01 06:24:36 +00003908load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909{
3910 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3911 *junk = 0, *__setstate__ = 0;
3912 int i, r = 0;
3913
3914 if (self->stack->length < 2) return stackUnderflow();
3915 PDATA_POP(self->stack, value);
3916 if (! value) return -1;
3917 inst=self->stack->data[self->stack->length-1];
3918
3919 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3920 ARG_TUP(self, value);
3921 if (self->arg) {
3922 junk = PyObject_Call(__setstate__, self->arg, NULL);
3923 FREE_ARG_TUP(self);
3924 }
3925 Py_DECREF(__setstate__);
3926 if (! junk) return -1;
3927 Py_DECREF(junk);
3928 return 0;
3929 }
3930
3931 PyErr_Clear();
3932 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3933 i = 0;
3934 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3935 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3936 r=-1;
3937 break;
3938 }
3939 }
3940 Py_DECREF(instdict);
3941 }
3942 else r=-1;
3943
3944 Py_XDECREF(value);
3945
3946 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947}
3948
3949
3950static int
Tim Peterscba30e22003-02-01 06:24:36 +00003951load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952{
3953 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003955 /* Note that we split the (pickle.py) stack into two stacks, an
3956 object stack and a mark stack. Here we push a mark onto the
3957 mark stack.
3958 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 if ((self->num_marks + 1) >= self->marks_size) {
3961 s=self->marks_size+20;
3962 if (s <= self->num_marks) s=self->num_marks + 1;
3963 if (self->marks == NULL)
3964 self->marks=(int *)malloc(s * sizeof(int));
3965 else
Tim Peterscba30e22003-02-01 06:24:36 +00003966 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 s * sizeof(int));
3968 if (! self->marks) {
3969 PyErr_NoMemory();
3970 return -1;
3971 }
3972 self->marks_size = s;
3973 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978}
3979
Guido van Rossum60456fd1997-04-09 17:36:32 +00003980static int
Tim Peterscba30e22003-02-01 06:24:36 +00003981load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982{
3983 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985 PDATA_POP(self->stack, arg_tup);
3986 if (! arg_tup) return -1;
3987 PDATA_POP(self->stack, callable);
3988 if (callable) {
3989 ob = Instance_New(callable, arg_tup);
3990 Py_DECREF(callable);
3991 }
3992 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996 PDATA_PUSH(self->stack, ob, -1);
3997 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003998}
Tim Peters84e87f32001-03-17 04:50:51 +00003999
Tim Peters4190fb82003-02-02 16:09:05 +00004000/* Just raises an error if we don't know the protocol specified. PROTO
4001 * is the first opcode for protocols >= 2.
4002 */
4003static int
4004load_proto(Unpicklerobject *self)
4005{
4006 int i;
4007 char *protobyte;
4008
4009 i = self->read_func(self, &protobyte, 1);
4010 if (i < 0)
4011 return -1;
4012
4013 i = calc_binint(protobyte, 1);
4014 /* No point checking for < 0, since calc_binint returns an unsigned
4015 * int when chewing on 1 byte.
4016 */
4017 assert(i >= 0);
4018 if (i <= CURRENT_PROTOCOL_NUMBER)
4019 return 0;
4020
4021 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4022 return -1;
4023}
4024
Guido van Rossum60456fd1997-04-09 17:36:32 +00004025static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004026load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027{
4028 PyObject *err = 0, *val = 0;
4029 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031 self->num_marks = 0;
4032 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004035 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004036 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038 switch (s[0]) {
4039 case NONE:
4040 if (load_none(self) < 0)
4041 break;
4042 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 case BININT:
4045 if (load_binint(self) < 0)
4046 break;
4047 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 case BININT1:
4050 if (load_binint1(self) < 0)
4051 break;
4052 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004054 case BININT2:
4055 if (load_binint2(self) < 0)
4056 break;
4057 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 case INT:
4060 if (load_int(self) < 0)
4061 break;
4062 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004064 case LONG:
4065 if (load_long(self) < 0)
4066 break;
4067 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004068
Tim Petersee1a53c2003-02-02 02:57:53 +00004069 case LONG1:
4070 if (load_counted_long(self, 1) < 0)
4071 break;
4072 continue;
4073
4074 case LONG4:
4075 if (load_counted_long(self, 4) < 0)
4076 break;
4077 continue;
4078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004079 case FLOAT:
4080 if (load_float(self) < 0)
4081 break;
4082 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 case BINFLOAT:
4085 if (load_binfloat(self) < 0)
4086 break;
4087 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089 case BINSTRING:
4090 if (load_binstring(self) < 0)
4091 break;
4092 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094 case SHORT_BINSTRING:
4095 if (load_short_binstring(self) < 0)
4096 break;
4097 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 case STRING:
4100 if (load_string(self) < 0)
4101 break;
4102 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004103
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004104#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 case UNICODE:
4106 if (load_unicode(self) < 0)
4107 break;
4108 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case BINUNICODE:
4111 if (load_binunicode(self) < 0)
4112 break;
4113 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004114#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004117 if (load_counted_tuple(self, 0) < 0)
4118 break;
4119 continue;
4120
4121 case TUPLE1:
4122 if (load_counted_tuple(self, 1) < 0)
4123 break;
4124 continue;
4125
4126 case TUPLE2:
4127 if (load_counted_tuple(self, 2) < 0)
4128 break;
4129 continue;
4130
4131 case TUPLE3:
4132 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 break;
4134 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 case TUPLE:
4137 if (load_tuple(self) < 0)
4138 break;
4139 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 case EMPTY_LIST:
4142 if (load_empty_list(self) < 0)
4143 break;
4144 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004146 case LIST:
4147 if (load_list(self) < 0)
4148 break;
4149 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004151 case EMPTY_DICT:
4152 if (load_empty_dict(self) < 0)
4153 break;
4154 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004156 case DICT:
4157 if (load_dict(self) < 0)
4158 break;
4159 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004161 case OBJ:
4162 if (load_obj(self) < 0)
4163 break;
4164 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004166 case INST:
4167 if (load_inst(self) < 0)
4168 break;
4169 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004171 case GLOBAL:
4172 if (load_global(self) < 0)
4173 break;
4174 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004176 case APPEND:
4177 if (load_append(self) < 0)
4178 break;
4179 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004181 case APPENDS:
4182 if (load_appends(self) < 0)
4183 break;
4184 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004186 case BUILD:
4187 if (load_build(self) < 0)
4188 break;
4189 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004191 case DUP:
4192 if (load_dup(self) < 0)
4193 break;
4194 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 case BINGET:
4197 if (load_binget(self) < 0)
4198 break;
4199 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004201 case LONG_BINGET:
4202 if (load_long_binget(self) < 0)
4203 break;
4204 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 case GET:
4207 if (load_get(self) < 0)
4208 break;
4209 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211 case MARK:
4212 if (load_mark(self) < 0)
4213 break;
4214 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 case BINPUT:
4217 if (load_binput(self) < 0)
4218 break;
4219 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004221 case LONG_BINPUT:
4222 if (load_long_binput(self) < 0)
4223 break;
4224 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 case PUT:
4227 if (load_put(self) < 0)
4228 break;
4229 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 case POP:
4232 if (load_pop(self) < 0)
4233 break;
4234 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236 case POP_MARK:
4237 if (load_pop_mark(self) < 0)
4238 break;
4239 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004241 case SETITEM:
4242 if (load_setitem(self) < 0)
4243 break;
4244 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004246 case SETITEMS:
4247 if (load_setitems(self) < 0)
4248 break;
4249 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 case STOP:
4252 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 case PERSID:
4255 if (load_persid(self) < 0)
4256 break;
4257 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 case BINPERSID:
4260 if (load_binpersid(self) < 0)
4261 break;
4262 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264 case REDUCE:
4265 if (load_reduce(self) < 0)
4266 break;
4267 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004268
Tim Peters4190fb82003-02-02 16:09:05 +00004269 case PROTO:
4270 if (load_proto(self) < 0)
4271 break;
4272 continue;
4273
Tim Peters3c67d792003-02-02 17:59:11 +00004274 case NEWTRUE:
4275 if (load_bool(self, Py_True) < 0)
4276 break;
4277 continue;
4278
4279 case NEWFALSE:
4280 if (load_bool(self, Py_False) < 0)
4281 break;
4282 continue;
4283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284 case '\0':
4285 /* end of file */
4286 PyErr_SetNone(PyExc_EOFError);
4287 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004290 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 "invalid load key, '%s'.",
4292 "c", s[0]);
4293 return NULL;
4294 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 break;
4297 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 if ((err = PyErr_Occurred())) {
4300 if (err == PyExc_EOFError) {
4301 PyErr_SetNone(PyExc_EOFError);
4302 }
4303 return NULL;
4304 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306 PDATA_POP(self->stack, val);
4307 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308}
Tim Peters84e87f32001-03-17 04:50:51 +00004309
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004311/* No-load functions to support noload, which is used to
4312 find persistent references. */
4313
4314static int
Tim Peterscba30e22003-02-01 06:24:36 +00004315noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316{
4317 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319 if ((i = marker(self)) < 0) return -1;
4320 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004321}
4322
4323
4324static int
Tim Peterscba30e22003-02-01 06:24:36 +00004325noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326{
4327 int i;
4328 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 if ((i = marker(self)) < 0) return -1;
4331 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004332 if (self->readline_func(self, &s) < 0) return -1;
4333 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 PDATA_APPEND(self->stack, Py_None,-1);
4335 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004336}
4337
4338static int
Tim Peterscba30e22003-02-01 06:24:36 +00004339noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340{
4341 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004342
Tim Peters0bc93f52003-02-02 18:29:33 +00004343 if (self->readline_func(self, &s) < 0) return -1;
4344 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 PDATA_APPEND(self->stack, Py_None,-1);
4346 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004347}
4348
4349static int
Tim Peterscba30e22003-02-01 06:24:36 +00004350noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 if (self->stack->length < 2) return stackUnderflow();
4354 Pdata_clear(self->stack, self->stack->length-2);
4355 PDATA_APPEND(self->stack, Py_None,-1);
4356 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004357}
4358
4359static int
4360noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004361
Guido van Rossum053b8df1998-11-25 16:18:00 +00004362 if (self->stack->length < 1) return stackUnderflow();
4363 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004364 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004365}
4366
4367
4368static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004369noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370{
4371 PyObject *err = 0, *val = 0;
4372 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 self->num_marks = 0;
4375 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004378 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 switch (s[0]) {
4382 case NONE:
4383 if (load_none(self) < 0)
4384 break;
4385 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 case BININT:
4388 if (load_binint(self) < 0)
4389 break;
4390 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 case BININT1:
4393 if (load_binint1(self) < 0)
4394 break;
4395 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 case BININT2:
4398 if (load_binint2(self) < 0)
4399 break;
4400 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 case INT:
4403 if (load_int(self) < 0)
4404 break;
4405 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 case LONG:
4408 if (load_long(self) < 0)
4409 break;
4410 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004411
Tim Peters4190fb82003-02-02 16:09:05 +00004412 case LONG1:
4413 if (load_counted_long(self, 1) < 0)
4414 break;
4415 continue;
4416
4417 case LONG4:
4418 if (load_counted_long(self, 4) < 0)
4419 break;
4420 continue;
4421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 case FLOAT:
4423 if (load_float(self) < 0)
4424 break;
4425 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 case BINFLOAT:
4428 if (load_binfloat(self) < 0)
4429 break;
4430 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432 case BINSTRING:
4433 if (load_binstring(self) < 0)
4434 break;
4435 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 case SHORT_BINSTRING:
4438 if (load_short_binstring(self) < 0)
4439 break;
4440 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 case STRING:
4443 if (load_string(self) < 0)
4444 break;
4445 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004446
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004447#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 case UNICODE:
4449 if (load_unicode(self) < 0)
4450 break;
4451 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453 case BINUNICODE:
4454 if (load_binunicode(self) < 0)
4455 break;
4456 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004457#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004460 if (load_counted_tuple(self, 0) < 0)
4461 break;
4462 continue;
4463
4464 case TUPLE1:
4465 if (load_counted_tuple(self, 1) < 0)
4466 break;
4467 continue;
4468
4469 case TUPLE2:
4470 if (load_counted_tuple(self, 2) < 0)
4471 break;
4472 continue;
4473
4474 case TUPLE3:
4475 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476 break;
4477 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case TUPLE:
4480 if (load_tuple(self) < 0)
4481 break;
4482 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 case EMPTY_LIST:
4485 if (load_empty_list(self) < 0)
4486 break;
4487 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 case LIST:
4490 if (load_list(self) < 0)
4491 break;
4492 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 case EMPTY_DICT:
4495 if (load_empty_dict(self) < 0)
4496 break;
4497 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 case DICT:
4500 if (load_dict(self) < 0)
4501 break;
4502 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504 case OBJ:
4505 if (noload_obj(self) < 0)
4506 break;
4507 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004509 case INST:
4510 if (noload_inst(self) < 0)
4511 break;
4512 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 case GLOBAL:
4515 if (noload_global(self) < 0)
4516 break;
4517 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 case APPEND:
4520 if (load_append(self) < 0)
4521 break;
4522 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 case APPENDS:
4525 if (load_appends(self) < 0)
4526 break;
4527 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 case BUILD:
4530 if (noload_build(self) < 0)
4531 break;
4532 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 case DUP:
4535 if (load_dup(self) < 0)
4536 break;
4537 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 case BINGET:
4540 if (load_binget(self) < 0)
4541 break;
4542 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 case LONG_BINGET:
4545 if (load_long_binget(self) < 0)
4546 break;
4547 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 case GET:
4550 if (load_get(self) < 0)
4551 break;
4552 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 case MARK:
4555 if (load_mark(self) < 0)
4556 break;
4557 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 case BINPUT:
4560 if (load_binput(self) < 0)
4561 break;
4562 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 case LONG_BINPUT:
4565 if (load_long_binput(self) < 0)
4566 break;
4567 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 case PUT:
4570 if (load_put(self) < 0)
4571 break;
4572 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 case POP:
4575 if (load_pop(self) < 0)
4576 break;
4577 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 case POP_MARK:
4580 if (load_pop_mark(self) < 0)
4581 break;
4582 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 case SETITEM:
4585 if (load_setitem(self) < 0)
4586 break;
4587 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589 case SETITEMS:
4590 if (load_setitems(self) < 0)
4591 break;
4592 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004594 case STOP:
4595 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 case PERSID:
4598 if (load_persid(self) < 0)
4599 break;
4600 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 case BINPERSID:
4603 if (load_binpersid(self) < 0)
4604 break;
4605 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 case REDUCE:
4608 if (noload_reduce(self) < 0)
4609 break;
4610 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004611
Tim Peters4190fb82003-02-02 16:09:05 +00004612 case PROTO:
4613 if (load_proto(self) < 0)
4614 break;
4615 continue;
4616
Tim Peters3c67d792003-02-02 17:59:11 +00004617 case NEWTRUE:
4618 if (load_bool(self, Py_True) < 0)
4619 break;
4620 continue;
4621
4622 case NEWFALSE:
4623 if (load_bool(self, Py_False) < 0)
4624 break;
4625 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004627 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 "invalid load key, '%s'.",
4629 "c", s[0]);
4630 return NULL;
4631 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 break;
4634 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004636 if ((err = PyErr_Occurred())) {
4637 if (err == PyExc_EOFError) {
4638 PyErr_SetNone(PyExc_EOFError);
4639 }
4640 return NULL;
4641 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004643 PDATA_POP(self->stack, val);
4644 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004645}
Tim Peters84e87f32001-03-17 04:50:51 +00004646
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004647
Guido van Rossum60456fd1997-04-09 17:36:32 +00004648static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004649Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004650{
Tim Peterscba30e22003-02-01 06:24:36 +00004651 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004654 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004655}
4656
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004657static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004658Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659{
Tim Peterscba30e22003-02-01 06:24:36 +00004660 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004664}
4665
Guido van Rossum60456fd1997-04-09 17:36:32 +00004666
4667static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004668 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004669 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004671 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004672 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673 "noload() -- not load a pickle, but go through most of the motions\n"
4674 "\n"
4675 "This function can be used to read past a pickle without instantiating\n"
4676 "any objects or importing any modules. It can also be used to find all\n"
4677 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004678 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004679 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680 {NULL, NULL} /* sentinel */
4681};
4682
4683
4684static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004685newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686{
4687 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004688
Tim Peterscba30e22003-02-01 06:24:36 +00004689 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692 self->file = NULL;
4693 self->arg = NULL;
4694 self->stack = (Pdata*)Pdata_New();
4695 self->pers_func = NULL;
4696 self->last_string = NULL;
4697 self->marks = NULL;
4698 self->num_marks = 0;
4699 self->marks_size = 0;
4700 self->buf_size = 0;
4701 self->read = NULL;
4702 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Tim Peterscba30e22003-02-01 06:24:36 +00004705 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 Py_INCREF(f);
4709 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 /* Set read, readline based on type of f */
4712 if (PyFile_Check(f)) {
4713 self->fp = PyFile_AsFile(f);
4714 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004715 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 "I/O operation on closed file");
4717 goto err;
4718 }
4719 self->read_func = read_file;
4720 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004721 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 else if (PycStringIO_InputCheck(f)) {
4723 self->fp = NULL;
4724 self->read_func = read_cStringIO;
4725 self->readline_func = readline_cStringIO;
4726 }
4727 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 self->fp = NULL;
4730 self->read_func = read_other;
4731 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004733 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4734 (self->read = PyObject_GetAttr(f, read_str)))) {
4735 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004736 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 "argument must have 'read' and "
4738 "'readline' attributes" );
4739 goto err;
4740 }
4741 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 err:
4746 Py_DECREF((PyObject *)self);
4747 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004748}
4749
4750
4751static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004752get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753{
4754 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004755
Tim Peterscba30e22003-02-01 06:24:36 +00004756 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 return NULL;
4758 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004760
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004761
Guido van Rossum60456fd1997-04-09 17:36:32 +00004762static void
Tim Peterscba30e22003-02-01 06:24:36 +00004763Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764{
4765 Py_XDECREF(self->readline);
4766 Py_XDECREF(self->read);
4767 Py_XDECREF(self->file);
4768 Py_XDECREF(self->memo);
4769 Py_XDECREF(self->stack);
4770 Py_XDECREF(self->pers_func);
4771 Py_XDECREF(self->arg);
4772 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 if (self->marks) {
4775 free(self->marks);
4776 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778 if (self->buf_size) {
4779 free(self->buf);
4780 }
Tim Peters84e87f32001-03-17 04:50:51 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004783}
4784
4785
4786static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004787Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788{
4789 if (!strcmp(name, "persistent_load")) {
4790 if (!self->pers_func) {
4791 PyErr_SetString(PyExc_AttributeError, name);
4792 return NULL;
4793 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 Py_INCREF(self->pers_func);
4796 return self->pers_func;
4797 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 if (!strcmp(name, "find_global")) {
4800 if (!self->find_class) {
4801 PyErr_SetString(PyExc_AttributeError, name);
4802 return NULL;
4803 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805 Py_INCREF(self->find_class);
4806 return self->find_class;
4807 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 if (!strcmp(name, "memo")) {
4810 if (!self->memo) {
4811 PyErr_SetString(PyExc_AttributeError, name);
4812 return NULL;
4813 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815 Py_INCREF(self->memo);
4816 return self->memo;
4817 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 if (!strcmp(name, "UnpicklingError")) {
4820 Py_INCREF(UnpicklingError);
4821 return UnpicklingError;
4822 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004825}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004826
Guido van Rossum60456fd1997-04-09 17:36:32 +00004827
4828static int
Tim Peterscba30e22003-02-01 06:24:36 +00004829Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004830{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 if (!strcmp(name, "persistent_load")) {
4833 Py_XDECREF(self->pers_func);
4834 self->pers_func = value;
4835 Py_XINCREF(value);
4836 return 0;
4837 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 if (!strcmp(name, "find_global")) {
4840 Py_XDECREF(self->find_class);
4841 self->find_class = value;
4842 Py_XINCREF(value);
4843 return 0;
4844 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004846 if (! value) {
4847 PyErr_SetString(PyExc_TypeError,
4848 "attribute deletion is not supported");
4849 return -1;
4850 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 if (strcmp(name, "memo") == 0) {
4853 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004854 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004855 "memo must be a dictionary");
4856 return -1;
4857 }
4858 Py_XDECREF(self->memo);
4859 self->memo = value;
4860 Py_INCREF(value);
4861 return 0;
4862 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004864 PyErr_SetString(PyExc_AttributeError, name);
4865 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004866}
4867
Tim Peters5bd2a792003-02-01 16:45:06 +00004868/* ---------------------------------------------------------------------------
4869 * Module-level functions.
4870 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004871
Tim Peters5bd2a792003-02-01 16:45:06 +00004872/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004873static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004874cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004875{
4876 PyObject *ob, *file, *res = NULL;
4877 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004878 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004879
Tim Peters5bd2a792003-02-01 16:45:06 +00004880 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004881 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004882
Tim Peters5bd2a792003-02-01 16:45:06 +00004883 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004886 if (dump(pickler, ob) < 0)
4887 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 Py_INCREF(Py_None);
4890 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 finally:
4893 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004895 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004896}
4897
4898
Tim Peters5bd2a792003-02-01 16:45:06 +00004899/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004900static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004901cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902{
4903 PyObject *ob, *file = 0, *res = NULL;
4904 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004905 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004906
Tim Peters5bd2a792003-02-01 16:45:06 +00004907 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004909
Tim Peterscba30e22003-02-01 06:24:36 +00004910 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004912
Tim Peters5bd2a792003-02-01 16:45:06 +00004913 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916 if (dump(pickler, ob) < 0)
4917 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921 finally:
4922 Py_XDECREF(pickler);
4923 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004925 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004926}
4927
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004928
Tim Peters5bd2a792003-02-01 16:45:06 +00004929/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004930static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004931cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932{
4933 Unpicklerobject *unpickler = 0;
4934 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004935
Tim Peterscba30e22003-02-01 06:24:36 +00004936 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004937 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004938
Tim Peterscba30e22003-02-01 06:24:36 +00004939 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004940 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004942 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944 finally:
4945 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004948}
4949
4950
Tim Peters5bd2a792003-02-01 16:45:06 +00004951/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004952static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004953cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004954{
4955 PyObject *ob, *file = 0, *res = NULL;
4956 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004957
Tim Peterscba30e22003-02-01 06:24:36 +00004958 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004960
Tim Peterscba30e22003-02-01 06:24:36 +00004961 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004963
Tim Peterscba30e22003-02-01 06:24:36 +00004964 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 finally:
4970 Py_XDECREF(file);
4971 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004974}
4975
4976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004977PyDoc_STRVAR(Unpicklertype__doc__,
4978"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004979
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004980static PyTypeObject Unpicklertype = {
4981 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004982 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004983 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004984 sizeof(Unpicklerobject), /*tp_basicsize*/
4985 0, /*tp_itemsize*/
4986 /* methods */
4987 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4988 (printfunc)0, /*tp_print*/
4989 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4990 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4991 (cmpfunc)0, /*tp_compare*/
4992 (reprfunc)0, /*tp_repr*/
4993 0, /*tp_as_number*/
4994 0, /*tp_as_sequence*/
4995 0, /*tp_as_mapping*/
4996 (hashfunc)0, /*tp_hash*/
4997 (ternaryfunc)0, /*tp_call*/
4998 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004999
Guido van Rossum60456fd1997-04-09 17:36:32 +00005000 /* Space for future expansion */
5001 0L,0L,0L,0L,
5002 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005003};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005004
Guido van Rossum60456fd1997-04-09 17:36:32 +00005005static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005006 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005007 PyDoc_STR("dump(object, file, proto=0) -- "
5008 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005009 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005010 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005011 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005012
Neal Norwitzb0493252002-03-31 14:44:22 +00005013 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005014 PyDoc_STR("dumps(object, proto=0) -- "
5015 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005016 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005017 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005018 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005019
Neal Norwitzb0493252002-03-31 14:44:22 +00005020 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005021 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005022
Neal Norwitzb0493252002-03-31 14:44:22 +00005023 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005024 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005025
Neal Norwitzb0493252002-03-31 14:44:22 +00005026 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005027 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005028 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005029 "This takes a file-like object for writing a pickle data stream.\n"
5030 "The optional proto argument tells the pickler to use the given\n"
5031 "protocol; supported protocols are 0, 1, 2. The default\n"
5032 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5033 "only protocol that can be written to a file opened in text\n"
5034 "mode and read back successfully. When using a protocol higher\n"
5035 "than 0, make sure the file is opened in binary mode, both when\n"
5036 "pickling and unpickling.)\n"
5037 "\n"
5038 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5039 "more efficient than protocol 1.\n"
5040 "\n"
5041 "Specifying a negative protocol version selects the highest\n"
5042 "protocol version supported. The higher the protocol used, the\n"
5043 "more recent the version of Python needed to read the pickle\n"
5044 "produced.\n"
5045 "\n"
5046 "The file parameter must have a write() method that accepts a single\n"
5047 "string argument. It can thus be an open file object, a StringIO\n"
5048 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005049 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005050
Neal Norwitzb0493252002-03-31 14:44:22 +00005051 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005052 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5053
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005054 { NULL, NULL }
5055};
5056
Guido van Rossum60456fd1997-04-09 17:36:32 +00005057static int
Tim Peterscba30e22003-02-01 06:24:36 +00005058init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059{
5060 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005061
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005062#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 INIT_STR(__class__);
5065 INIT_STR(__getinitargs__);
5066 INIT_STR(__dict__);
5067 INIT_STR(__getstate__);
5068 INIT_STR(__setstate__);
5069 INIT_STR(__name__);
5070 INIT_STR(__main__);
5071 INIT_STR(__reduce__);
5072 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005073 INIT_STR(append);
5074 INIT_STR(read);
5075 INIT_STR(readline);
5076 INIT_STR(copy_reg);
5077 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005078 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005079
Tim Peterscba30e22003-02-01 06:24:36 +00005080 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005082
Tim Peters1f1b2d22003-02-01 02:16:37 +00005083 /* This is special because we want to use a different
5084 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00005086 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005090
Tim Peterscba30e22003-02-01 06:24:36 +00005091 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005092 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005094 /* Ugh */
5095 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5096 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5097 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005099 if (!( t=PyDict_New())) return -1;
5100 if (!( r=PyRun_String(
5101 "def __init__(self, *args): self.args=args\n\n"
5102 "def __str__(self):\n"
5103 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5104 Py_file_input,
5105 module_dict, t) )) return -1;
5106 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005108 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005109 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005110 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005113
Tim Peterscba30e22003-02-01 06:24:36 +00005114 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005115 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005116 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 if (!( t=PyDict_New())) return -1;
5120 if (!( r=PyRun_String(
5121 "def __init__(self, *args): self.args=args\n\n"
5122 "def __str__(self):\n"
5123 " a=self.args\n"
5124 " a=a and type(a[0]) or '(what)'\n"
5125 " return 'Cannot pickle %s objects' % a\n"
5126 , Py_file_input,
5127 module_dict, t) )) return -1;
5128 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005130 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005131 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005134 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005136 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005137 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005139
Martin v. Löwis658009a2002-09-16 17:26:24 +00005140 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5141 UnpicklingError, NULL)))
5142 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 if (PyDict_SetItemString(module_dict, "PickleError",
5145 PickleError) < 0)
5146 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 if (PyDict_SetItemString(module_dict, "PicklingError",
5149 PicklingError) < 0)
5150 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5153 UnpicklingError) < 0)
5154 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005156 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5157 UnpickleableError) < 0)
5158 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005160 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5161 BadPickleGet) < 0)
5162 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005164 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005166 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005167}
5168
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005169#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5170#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005171#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005172PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005173initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174{
5175 PyObject *m, *d, *di, *v, *k;
5176 int i;
5177 char *rev="1.71";
5178 PyObject *format_version;
5179 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005181 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005182 Unpicklertype.ob_type = &PyType_Type;
5183 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005185 /* Initialize some pieces. We need to do this before module creation,
5186 so we're forced to use a temporary dictionary. :(
5187 */
5188 di=PyDict_New();
5189 if (!di) return;
5190 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005192 /* Create the module and add the functions */
5193 m = Py_InitModule4("cPickle", cPickle_methods,
5194 cPickle_module_documentation,
5195 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005197 /* Add some symbolic constants to the module */
5198 d = PyModule_GetDict(m);
5199 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5200 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005202 /* Copy data from di. Waaa. */
5203 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5204 if (PyObject_SetItem(d, k, v) < 0) {
5205 Py_DECREF(di);
5206 return;
5207 }
5208 }
5209 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005211 format_version = PyString_FromString("1.3");
5212 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 PyDict_SetItemString(d, "format_version", format_version);
5215 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5216 Py_XDECREF(format_version);
5217 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005218}