blob: 49e7271830f65970ad70da89e66fbc3d7892ade7 [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
Tim Peters1d63c9f2003-02-02 20:29:39 +0000191 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000192 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000193 goto nomemory;
194 if ((int)(size_t)bigger != bigger)
195 goto nomemory;
196 nbytes = (size_t)bigger * sizeof(PyObject *);
197 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
198 goto nomemory;
199 self->data = realloc(self->data, nbytes);
200 if (self->data == NULL)
201 goto nomemory;
202 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000204
205 nomemory:
206 self->size = 0;
207 PyErr_NoMemory();
208 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000209}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000210
Tim Peterse0a39072003-02-03 15:45:56 +0000211/* D is a Pdata*. Pop the topmost element and store it into V, which
212 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 * is raised and V is set to NULL. D and V may be evaluated several times.
214 */
215#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000216 if ((D)->length) \
217 (V) = (D)->data[--((D)->length)]; \
218 else { \
219 PyErr_SetString(UnpicklingError, "bad pickle data"); \
220 (V) = NULL; \
221 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000222}
223
Tim Peterse0a39072003-02-03 15:45:56 +0000224/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
225 * D. If the Pdata stack can't be grown to hold the new value, both
226 * raise MemoryError and execute "return ER". The difference is in ownership
227 * of O after: _PUSH transfers ownership of O from the caller to the stack
228 * (no incref of O is done, and in case of error O is decrefed), while
229 * _APPEND pushes a new reference.
230 */
231
232/* Push O on stack D, giving ownership of O to the stack. */
233#define PDATA_PUSH(D, O, ER) { \
234 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
235 Pdata_grow((Pdata*)(D)) < 0) { \
236 Py_DECREF(O); \
237 return ER; \
238 } \
239 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
240}
241
242/* Push O on stack D, pushing a new reference. */
243#define PDATA_APPEND(D, O, ER) { \
244 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
245 Pdata_grow((Pdata*)(D)) < 0) \
246 return ER; \
247 Py_INCREF(O); \
248 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
249}
250
251
Guido van Rossum053b8df1998-11-25 16:18:00 +0000252static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000253Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000254{
255 PyObject *r;
256 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000257
Tim Peters1d63c9f2003-02-02 20:29:39 +0000258 l = self->length-start;
259 r = PyTuple_New(l);
260 if (r == NULL)
261 return NULL;
262 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000263 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000264
Tim Peters1d63c9f2003-02-02 20:29:39 +0000265 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000266 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000267}
268
269static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000270Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000271{
272 PyObject *r;
273 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000275 l=self->length-start;
276 if (!( r=PyList_New(l))) return NULL;
277 for (i=start, j=0 ; j < l; i++, j++)
278 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000280 self->length=start;
281 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000282}
283
Guido van Rossum053b8df1998-11-25 16:18:00 +0000284/*************************************************************************/
285
286#define ARG_TUP(self, o) { \
287 if (self->arg || (self->arg=PyTuple_New(1))) { \
288 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
289 PyTuple_SET_ITEM(self->arg,0,o); \
290 } \
291 else { \
292 Py_DECREF(o); \
293 } \
294}
295
296#define FREE_ARG_TUP(self) { \
297 if (self->arg->ob_refcnt > 1) { \
298 Py_DECREF(self->arg); \
299 self->arg=NULL; \
300 } \
301 }
302
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000303typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000304 PyObject_HEAD
305 FILE *fp;
306 PyObject *write;
307 PyObject *file;
308 PyObject *memo;
309 PyObject *arg;
310 PyObject *pers_func;
311 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000312
313 /* pickle protocol number, >= 0 */
314 int proto;
315
316 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000317 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000319 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000320 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000321 int (*write_func)(struct Picklerobject *, char *, int);
322 char *write_buf;
323 int buf_size;
324 PyObject *dispatch_table;
325 int fast_container; /* count nested container dumps */
326 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000327} Picklerobject;
328
Barry Warsaw52acb492001-12-21 20:04:22 +0000329#ifndef PY_CPICKLE_FAST_LIMIT
330#define PY_CPICKLE_FAST_LIMIT 50
331#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000332
Jeremy Hylton938ace62002-07-17 16:30:39 +0000333static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000334
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000335typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000336 PyObject_HEAD
337 FILE *fp;
338 PyObject *file;
339 PyObject *readline;
340 PyObject *read;
341 PyObject *memo;
342 PyObject *arg;
343 Pdata *stack;
344 PyObject *mark;
345 PyObject *pers_func;
346 PyObject *last_string;
347 int *marks;
348 int num_marks;
349 int marks_size;
350 int (*read_func)(struct Unpicklerobject *, char **, int);
351 int (*readline_func)(struct Unpicklerobject *, char **);
352 int buf_size;
353 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000354 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000355} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000356
Jeremy Hylton938ace62002-07-17 16:30:39 +0000357static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000358
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000359/* Forward decls that need the above structs */
360static int save(Picklerobject *, PyObject *, int);
361static int put2(Picklerobject *, PyObject *);
362
Tim Peters84e87f32001-03-17 04:50:51 +0000363int
Tim Peterscba30e22003-02-01 06:24:36 +0000364cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000365{
366 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000368 if ((v = PyObject_GetItem(o,key))) {
369 Py_DECREF(v);
370 return 1;
371 }
Tim Peterscba30e22003-02-01 06:24:36 +0000372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000373 PyErr_Clear();
374 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000375}
376
Guido van Rossumd385d591997-04-09 17:47:47 +0000377static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000378PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000379cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
380{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000381 va_list va;
382 PyObject *args=0, *retval=0;
383 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000385 if (format) args = Py_VaBuildValue(format, va);
386 va_end(va);
387 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000388 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391 if (retval) {
392 if (args) {
393 PyObject *v;
394 v=PyString_Format(retval, args);
395 Py_DECREF(retval);
396 Py_DECREF(args);
397 if (! v) return NULL;
398 retval=v;
399 }
400 }
401 else
402 if (args) retval=args;
403 else {
404 PyErr_SetObject(ErrType,Py_None);
405 return NULL;
406 }
407 PyErr_SetObject(ErrType,retval);
408 Py_DECREF(retval);
409 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000410}
411
Tim Peters84e87f32001-03-17 04:50:51 +0000412static int
Tim Peterscba30e22003-02-01 06:24:36 +0000413write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000414{
415 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000417 if (s == NULL) {
418 return 0;
419 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000421 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000422 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000424 if (nbyteswritten != (size_t)n) {
425 PyErr_SetFromErrno(PyExc_IOError);
426 return -1;
427 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000430}
431
Tim Peters84e87f32001-03-17 04:50:51 +0000432static int
Tim Peterscba30e22003-02-01 06:24:36 +0000433write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434{
435 if (s == NULL) {
436 return 0;
437 }
Tim Peterscba30e22003-02-01 06:24:36 +0000438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
440 return -1;
441 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000443 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000444}
445
Tim Peters84e87f32001-03-17 04:50:51 +0000446static int
Tim Peterscba30e22003-02-01 06:24:36 +0000447write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000448{
449 if (s == NULL) return 0;
450 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000451}
452
Tim Peters84e87f32001-03-17 04:50:51 +0000453static int
Tim Peterscba30e22003-02-01 06:24:36 +0000454write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000455{
456 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000458 if (s == NULL) {
459 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000460 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000462 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000463 return -1;
464 }
465 else {
466 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
467 if (write_other(self, NULL, 0) < 0)
468 return -1;
469 }
Tim Peterscba30e22003-02-01 06:24:36 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 if (n > WRITE_BUF_SIZE) {
472 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000473 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 return -1;
475 }
476 else {
477 memcpy(self->write_buf + self->buf_size, s, n);
478 self->buf_size += n;
479 return n;
480 }
481 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000483 if (self->write) {
484 /* object with write method */
485 ARG_TUP(self, py_str);
486 if (self->arg) {
487 junk = PyObject_Call(self->write, self->arg, NULL);
488 FREE_ARG_TUP(self);
489 }
490 if (junk) Py_DECREF(junk);
491 else return -1;
492 }
493 else
494 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496 self->buf_size = 0;
497 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000498}
499
500
Tim Peters84e87f32001-03-17 04:50:51 +0000501static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000502read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000503{
504 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 if (self->buf_size == 0) {
507 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000510 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000511 PyErr_NoMemory();
512 return -1;
513 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 self->buf_size = size;
516 }
517 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000518 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000519 if (!self->buf) {
520 PyErr_NoMemory();
521 return -1;
522 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 self->buf_size = n;
524 }
Tim Peters84e87f32001-03-17 04:50:51 +0000525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 Py_BEGIN_ALLOW_THREADS
527 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
528 Py_END_ALLOW_THREADS
529 if (nbytesread != (size_t)n) {
530 if (feof(self->fp)) {
531 PyErr_SetNone(PyExc_EOFError);
532 return -1;
533 }
Tim Peterscba30e22003-02-01 06:24:36 +0000534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000535 PyErr_SetFromErrno(PyExc_IOError);
536 return -1;
537 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000539 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542}
543
544
Tim Peters84e87f32001-03-17 04:50:51 +0000545static int
Tim Peterscba30e22003-02-01 06:24:36 +0000546readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547{
548 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000551 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000552 PyErr_NoMemory();
553 return -1;
554 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000555 self->buf_size = 40;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 i = 0;
559 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000560 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000562 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000563 (self->buf[i] = getc(self->fp)) == '\n') {
564 self->buf[i + 1] = '\0';
565 *s = self->buf;
566 return i + 1;
567 }
568 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000569 bigger = self->buf_size << 1;
570 if (bigger <= 0) { /* overflow */
571 PyErr_NoMemory();
572 return -1;
573 }
574 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 if (!self->buf) {
576 PyErr_NoMemory();
577 return -1;
578 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000579 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 }
Tim Peters84e87f32001-03-17 04:50:51 +0000581}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000582
583
Tim Peters84e87f32001-03-17 04:50:51 +0000584static int
Tim Peterscba30e22003-02-01 06:24:36 +0000585read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586{
587 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000589 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
590 PyErr_SetNone(PyExc_EOFError);
591 return -1;
592 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000597}
598
599
Tim Peters84e87f32001-03-17 04:50:51 +0000600static int
Tim Peterscba30e22003-02-01 06:24:36 +0000601readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602{
603 int n;
604 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000606 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
607 return -1;
608 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613}
614
615
Tim Peters84e87f32001-03-17 04:50:51 +0000616static int
Tim Peterscba30e22003-02-01 06:24:36 +0000617read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618{
619 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000621 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623 ARG_TUP(self, bytes);
624 if (self->arg) {
625 str = PyObject_Call(self->read, self->arg, NULL);
626 FREE_ARG_TUP(self);
627 }
628 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 Py_XDECREF(self->last_string);
631 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000633 if (! (*s = PyString_AsString(str))) return -1;
634 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635}
636
637
Tim Peters84e87f32001-03-17 04:50:51 +0000638static int
Tim Peterscba30e22003-02-01 06:24:36 +0000639readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640{
641 PyObject *str;
642 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
645 return -1;
646 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 if ((str_size = PyString_Size(str)) < 0)
649 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 Py_XDECREF(self->last_string);
652 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (! (*s = PyString_AsString(str)))
655 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000658}
659
Tim Petersee1a53c2003-02-02 02:57:53 +0000660/* Copy the first n bytes from s into newly malloc'ed memory, plus a
661 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
662 * The caller is responsible for free()'ing the return value.
663 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000665pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666{
Tim Petersee1a53c2003-02-02 02:57:53 +0000667 char *r = (char *)malloc(n+1);
668 if (r == NULL)
669 return (char*)PyErr_NoMemory();
670 memcpy(r, s, n);
671 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673}
674
675
676static int
Tim Peterscba30e22003-02-01 06:24:36 +0000677get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678{
679 PyObject *value, *mv;
680 long c_value;
681 char s[30];
682 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684 if (!( mv = PyDict_GetItem(self->memo, id))) {
685 PyErr_SetObject(PyExc_KeyError, id);
686 return -1;
687 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Tim Peterscba30e22003-02-01 06:24:36 +0000689 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000692 if (!( PyInt_Check(value))) {
693 PyErr_SetString(PicklingError, "no int where int expected in memo");
694 return -1;
695 }
696 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698 if (!self->bin) {
699 s[0] = GET;
700 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
701 len = strlen(s);
702 }
703 else if (Pdata_Check(self->file)) {
704 if (write_other(self, NULL, 0) < 0) return -1;
705 PDATA_APPEND(self->file, mv, -1);
706 return 0;
707 }
708 else {
709 if (c_value < 256) {
710 s[0] = BINGET;
711 s[1] = (int)(c_value & 0xff);
712 len = 2;
713 }
714 else {
715 s[0] = LONG_BINGET;
716 s[1] = (int)(c_value & 0xff);
717 s[2] = (int)((c_value >> 8) & 0xff);
718 s[3] = (int)((c_value >> 16) & 0xff);
719 s[4] = (int)((c_value >> 24) & 0xff);
720 len = 5;
721 }
722 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723
Tim Peters0bc93f52003-02-02 18:29:33 +0000724 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000725 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000726
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000727 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000729
Guido van Rossum60456fd1997-04-09 17:36:32 +0000730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000731static int
Tim Peterscba30e22003-02-01 06:24:36 +0000732put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000733{
Tim Peterscba30e22003-02-01 06:24:36 +0000734 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000735 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737 return put2(self, ob);
738}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000739
Guido van Rossum053b8df1998-11-25 16:18:00 +0000740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000741static int
Tim Peterscba30e22003-02-01 06:24:36 +0000742put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000743{
744 char c_str[30];
745 int p;
746 size_t len;
747 int res = -1;
748 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000750 if (self->fast)
751 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753 if ((p = PyDict_Size(self->memo)) < 0)
754 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000757 /* XXX Why?
758 * XXX And does "positive" really mean non-negative?
759 * XXX pickle.py starts with PUT index 0, not 1. This makes for
760 * XXX gratuitous differences between the pickling modules.
761 */
Tim Peterscba30e22003-02-01 06:24:36 +0000762 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000763
Tim Peterscba30e22003-02-01 06:24:36 +0000764 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000766
Tim Peterscba30e22003-02-01 06:24:36 +0000767 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000768 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Tim Peterscba30e22003-02-01 06:24:36 +0000770 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 PyTuple_SET_ITEM(t, 0, memo_len);
774 Py_INCREF(memo_len);
775 PyTuple_SET_ITEM(t, 1, ob);
776 Py_INCREF(ob);
777
778 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
779 goto finally;
780
781 if (!self->bin) {
782 c_str[0] = PUT;
783 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
784 len = strlen(c_str);
785 }
786 else if (Pdata_Check(self->file)) {
787 if (write_other(self, NULL, 0) < 0) return -1;
788 PDATA_APPEND(self->file, memo_len, -1);
789 res=0; /* Job well done ;) */
790 goto finally;
791 }
792 else {
793 if (p >= 256) {
794 c_str[0] = LONG_BINPUT;
795 c_str[1] = (int)(p & 0xff);
796 c_str[2] = (int)((p >> 8) & 0xff);
797 c_str[3] = (int)((p >> 16) & 0xff);
798 c_str[4] = (int)((p >> 24) & 0xff);
799 len = 5;
800 }
801 else {
802 c_str[0] = BINPUT;
803 c_str[1] = p;
804 len = 2;
805 }
806 }
807
Tim Peters0bc93f52003-02-02 18:29:33 +0000808 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000809 goto finally;
810
811 res = 0;
812
813 finally:
814 Py_XDECREF(py_ob_id);
815 Py_XDECREF(memo_len);
816 Py_XDECREF(t);
817
818 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000819}
820
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000821#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000822
823static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000824PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825{
826 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
827 static PyObject *standard_builtins=0;
828 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000831 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000833 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000835 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000836 return NULL;
837 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 if ((globals=PyEval_GetGlobals())) {
840 Py_INCREF(globals);
841 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000842 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 goto err;
844 }
845 else {
846 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000849 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000850 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 __builtins__=standard_builtins;
853 Py_INCREF(__builtins__);
854 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000855 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000856 goto err;
857 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 if (PyDict_Check(__builtins__)) {
860 __import__=PyObject_GetItem(__builtins__,__import___str);
861 if (!__import__) goto err;
862 }
863 else {
864 __import__=PyObject_GetAttr(__builtins__,__import___str);
865 if (!__import__) goto err;
866 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 r=PyObject_CallFunction(__import__,"OOOO",
869 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000870 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 Py_DECREF(globals);
874 Py_DECREF(__builtins__);
875 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 return r;
878 err:
879 Py_XDECREF(globals);
880 Py_XDECREF(__builtins__);
881 Py_XDECREF(__import__);
882 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000883}
884
885static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000886whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000887{
888 int i, j;
889 PyObject *module = 0, *modules_dict = 0,
890 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000892 module = PyObject_GetAttrString(global, "__module__");
893 if (module) return module;
894 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000895
Tim Peterscba30e22003-02-01 06:24:36 +0000896 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000897 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000899 i = 0;
900 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000902 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000904 global_name_attr = PyObject_GetAttr(module, global_name);
905 if (!global_name_attr) {
906 PyErr_Clear();
907 continue;
908 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 if (global_name_attr != global) {
911 Py_DECREF(global_name_attr);
912 continue;
913 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 break;
918 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 /* The following implements the rule in pickle.py added in 1.5
921 that used __main__ if no module is found. I don't actually
922 like this rule. jlf
923 */
924 if (!j) {
925 j=1;
926 name=__main___str;
927 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000929 Py_INCREF(name);
930 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000931}
932
933
Guido van Rossum60456fd1997-04-09 17:36:32 +0000934static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000935fast_save_enter(Picklerobject *self, PyObject *obj)
936{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000937 /* if fast_container < 0, we're doing an error exit. */
938 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
939 PyObject *key = NULL;
940 if (self->fast_memo == NULL) {
941 self->fast_memo = PyDict_New();
942 if (self->fast_memo == NULL) {
943 self->fast_container = -1;
944 return 0;
945 }
946 }
947 key = PyLong_FromVoidPtr(obj);
948 if (key == NULL)
949 return 0;
950 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000951 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000952 PyErr_Format(PyExc_ValueError,
953 "fast mode: can't pickle cyclic objects including object type %s at %p",
954 obj->ob_type->tp_name, obj);
955 self->fast_container = -1;
956 return 0;
957 }
958 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000959 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000960 self->fast_container = -1;
961 return 0;
962 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000963 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000964 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000965 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000966}
967
Tim Peterscba30e22003-02-01 06:24:36 +0000968int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000969fast_save_leave(Picklerobject *self, PyObject *obj)
970{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
972 PyObject *key = PyLong_FromVoidPtr(obj);
973 if (key == NULL)
974 return 0;
975 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000976 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977 return 0;
978 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000979 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000980 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000982}
983
984static int
Tim Peterscba30e22003-02-01 06:24:36 +0000985save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986{
987 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000988 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000991 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000992}
993
Guido van Rossum77f6a652002-04-03 22:41:51 +0000994static int
Tim Peterscba30e22003-02-01 06:24:36 +0000995save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000996{
Guido van Rossume2763392002-04-05 19:30:08 +0000997 static char *buf[2] = {FALSE, TRUE};
998 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000999 long l = PyInt_AS_LONG((PyIntObject *)args);
1000
Tim Peters3c67d792003-02-02 17:59:11 +00001001 if (self->proto >= 2) {
1002 char opcode = l ? NEWTRUE : NEWFALSE;
1003 if (self->write_func(self, &opcode, 1) < 0)
1004 return -1;
1005 }
1006 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +00001007 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001008 return 0;
1009}
Tim Peters84e87f32001-03-17 04:50:51 +00001010
Guido van Rossum60456fd1997-04-09 17:36:32 +00001011static int
Tim Peterscba30e22003-02-01 06:24:36 +00001012save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001013{
1014 char c_str[32];
1015 long l = PyInt_AS_LONG((PyIntObject *)args);
1016 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001019#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 || l > 0x7fffffffL
1021 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001022#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 ) {
1024 /* Text-mode pickle, or long too big to fit in the 4-byte
1025 * signed BININT format: store as a string.
1026 */
1027 c_str[0] = INT;
1028 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001029 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 return -1;
1031 }
1032 else {
1033 /* Binary pickle and l fits in a signed 4-byte int. */
1034 c_str[1] = (int)( l & 0xff);
1035 c_str[2] = (int)((l >> 8) & 0xff);
1036 c_str[3] = (int)((l >> 16) & 0xff);
1037 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1040 if (c_str[2] == 0) {
1041 c_str[0] = BININT1;
1042 len = 2;
1043 }
1044 else {
1045 c_str[0] = BININT2;
1046 len = 3;
1047 }
1048 }
1049 else {
1050 c_str[0] = BININT;
1051 len = 5;
1052 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001053
Tim Peters0bc93f52003-02-02 18:29:33 +00001054 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055 return -1;
1056 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001059}
1060
1061
1062static int
Tim Peterscba30e22003-02-01 06:24:36 +00001063save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001064{
Tim Petersee1a53c2003-02-02 02:57:53 +00001065 int size;
1066 int res = -1;
1067 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001070
Tim Petersee1a53c2003-02-02 02:57:53 +00001071 if (self->proto >= 2) {
1072 /* Linear-time pickling. */
1073 size_t nbits;
1074 size_t nbytes;
1075 unsigned char *pdata;
1076 char c_str[5];
1077 int i;
1078 int sign = _PyLong_Sign(args);
1079
1080 if (sign == 0) {
1081 /* It's 0 -- an empty bytestring. */
1082 c_str[0] = LONG1;
1083 c_str[1] = 0;
1084 i = self->write_func(self, c_str, 2);
1085 if (i < 0) goto finally;
1086 res = 0;
1087 goto finally;
1088 }
1089 nbits = _PyLong_NumBits(args);
1090 if (nbits == (size_t)-1 && PyErr_Occurred())
1091 goto finally;
1092 /* How many bytes do we need? There are nbits >> 3 full
1093 * bytes of data, and nbits & 7 leftover bits. If there
1094 * are any leftover bits, then we clearly need another
1095 * byte. Wnat's not so obvious is that we *probably*
1096 * need another byte even if there aren't any leftovers:
1097 * the most-significant bit of the most-significant byte
1098 * acts like a sign bit, and it's usually got a sense
1099 * opposite of the one we need. The exception is longs
1100 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1101 * its own 256's-complement, so has the right sign bit
1102 * even without the extra byte. That's a pain to check
1103 * for in advance, though, so we always grab an extra
1104 * byte at the start, and cut it back later if possible.
1105 */
1106 nbytes = (nbits >> 3) + 1;
1107 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1108 PyErr_SetString(PyExc_OverflowError, "long too large "
1109 "to pickle");
1110 goto finally;
1111 }
1112 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1113 if (repr == NULL) goto finally;
1114 pdata = (unsigned char *)PyString_AS_STRING(repr);
1115 i = _PyLong_AsByteArray((PyLongObject *)args,
1116 pdata, nbytes,
1117 1 /* little endian */, 1 /* signed */);
1118 if (i < 0) goto finally;
1119 /* If the long is negative, this may be a byte more than
1120 * needed. This is so iff the MSB is all redundant sign
1121 * bits.
1122 */
1123 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1124 (pdata[nbytes - 2] & 0x80) != 0)
1125 --nbytes;
1126
1127 if (nbytes < 256) {
1128 c_str[0] = LONG1;
1129 c_str[1] = (char)nbytes;
1130 size = 2;
1131 }
1132 else {
1133 c_str[0] = LONG4;
1134 size = (int)nbytes;
1135 for (i = 1; i < 5; i++) {
1136 c_str[i] = (char)(size & 0xff);
1137 size >>= 8;
1138 }
1139 size = 5;
1140 }
1141 i = self->write_func(self, c_str, size);
1142 if (i < 0) goto finally;
1143 i = self->write_func(self, (char *)pdata, (int)nbytes);
1144 if (i < 0) goto finally;
1145 res = 0;
1146 goto finally;
1147 }
1148
1149 /* proto < 2: write the repr and newline. This is quadratic-time
1150 * (in the number of digits), in both directions.
1151 */
Tim Peterscba30e22003-02-01 06:24:36 +00001152 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 if ((size = PyString_Size(repr)) < 0)
1156 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Tim Peters0bc93f52003-02-02 18:29:33 +00001158 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160
Tim Peters0bc93f52003-02-02 18:29:33 +00001161 if (self->write_func(self,
1162 PyString_AS_STRING((PyStringObject *)repr),
1163 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Tim Peters0bc93f52003-02-02 18:29:33 +00001166 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 finally:
1172 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001174}
1175
1176
1177static int
Tim Peterscba30e22003-02-01 06:24:36 +00001178save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179{
1180 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if (self->bin) {
1183 int s, e;
1184 double f;
1185 long fhi, flo;
1186 char str[9];
1187 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001189 *p = BINFLOAT;
1190 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 if (x < 0) {
1193 s = 1;
1194 x = -x;
1195 }
1196 else
1197 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001199 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001201 /* Normalize f to be in the range [1.0, 2.0) */
1202 if (0.5 <= f && f < 1.0) {
1203 f *= 2.0;
1204 e--;
1205 }
1206 else if (f == 0.0) {
1207 e = 0;
1208 }
1209 else {
1210 PyErr_SetString(PyExc_SystemError,
1211 "frexp() result out of range");
1212 return -1;
1213 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 if (e >= 1024) {
1216 /* XXX 1024 itself is reserved for Inf/NaN */
1217 PyErr_SetString(PyExc_OverflowError,
1218 "float too large to pack with d format");
1219 return -1;
1220 }
1221 else if (e < -1022) {
1222 /* Gradual underflow */
1223 f = ldexp(f, 1022 + e);
1224 e = 0;
1225 }
1226 else if (!(e == 0 && f == 0.0)) {
1227 e += 1023;
1228 f -= 1.0; /* Get rid of leading 1 */
1229 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Tim Peterscba30e22003-02-01 06:24:36 +00001231 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 flo the low 24 bits (== 52 bits) */
1233 f *= 268435456.0; /* 2**28 */
1234 fhi = (long) floor(f); /* Truncate */
1235 f -= (double)fhi;
1236 f *= 16777216.0; /* 2**24 */
1237 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 /* First byte */
1240 *p = (s<<7) | (e>>4);
1241 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 /* Second byte */
1244 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1245 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 /* Third byte */
1248 *p = (unsigned char) ((fhi>>16) & 0xFF);
1249 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 /* Fourth byte */
1252 *p = (unsigned char) ((fhi>>8) & 0xFF);
1253 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 /* Fifth byte */
1256 *p = (unsigned char) (fhi & 0xFF);
1257 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 /* Sixth byte */
1260 *p = (unsigned char) ((flo>>16) & 0xFF);
1261 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 /* Seventh byte */
1264 *p = (unsigned char) ((flo>>8) & 0xFF);
1265 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 /* Eighth byte */
1268 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001269
Tim Peters0bc93f52003-02-02 18:29:33 +00001270 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271 return -1;
1272 }
1273 else {
1274 char c_str[250];
1275 c_str[0] = FLOAT;
1276 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Tim Peters0bc93f52003-02-02 18:29:33 +00001278 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 return -1;
1280 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001283}
1284
1285
1286static int
Tim Peterscba30e22003-02-01 06:24:36 +00001287save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288{
1289 int size, len;
1290 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 if ((size = PyString_Size(args)) < 0)
1293 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001295 if (!self->bin) {
1296 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001299
Tim Peterscba30e22003-02-01 06:24:36 +00001300 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if ((len = PyString_Size(repr)) < 0)
1304 goto err;
1305 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001306
Tim Peters0bc93f52003-02-02 18:29:33 +00001307 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001309
Tim Peters0bc93f52003-02-02 18:29:33 +00001310 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001312
Tim Peters0bc93f52003-02-02 18:29:33 +00001313 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 Py_XDECREF(repr);
1317 }
1318 else {
1319 int i;
1320 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 if ((size = PyString_Size(args)) < 0)
1323 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 if (size < 256) {
1326 c_str[0] = SHORT_BINSTRING;
1327 c_str[1] = size;
1328 len = 2;
1329 }
1330 else {
1331 c_str[0] = BINSTRING;
1332 for (i = 1; i < 5; i++)
1333 c_str[i] = (int)(size >> ((i - 1) * 8));
1334 len = 5;
1335 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001336
Tim Peters0bc93f52003-02-02 18:29:33 +00001337 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 if (size > 128 && Pdata_Check(self->file)) {
1341 if (write_other(self, NULL, 0) < 0) return -1;
1342 PDATA_APPEND(self->file, args, -1);
1343 }
1344 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001345 if (self->write_func(self,
1346 PyString_AS_STRING(
1347 (PyStringObject *)args),
1348 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 return -1;
1350 }
1351 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 if (doput)
1354 if (put(self, args) < 0)
1355 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 err:
1360 Py_XDECREF(repr);
1361 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362}
1363
1364
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001365#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001366/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1367 backslash and newline characters to \uXXXX escapes. */
1368static PyObject *
1369modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1370{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 PyObject *repr;
1372 char *p;
1373 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 repr = PyString_FromStringAndSize(NULL, 6 * size);
1378 if (repr == NULL)
1379 return NULL;
1380 if (size == 0)
1381 return repr;
1382
1383 p = q = PyString_AS_STRING(repr);
1384 while (size-- > 0) {
1385 Py_UNICODE ch = *s++;
1386 /* Map 16-bit characters to '\uxxxx' */
1387 if (ch >= 256 || ch == '\\' || ch == '\n') {
1388 *p++ = '\\';
1389 *p++ = 'u';
1390 *p++ = hexdigit[(ch >> 12) & 0xf];
1391 *p++ = hexdigit[(ch >> 8) & 0xf];
1392 *p++ = hexdigit[(ch >> 4) & 0xf];
1393 *p++ = hexdigit[ch & 15];
1394 }
1395 /* Copy everything else as-is */
1396 else
1397 *p++ = (char) ch;
1398 }
1399 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001400 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001401 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001402}
1403
1404
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405static int
Tim Peterscba30e22003-02-01 06:24:36 +00001406save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407{
1408 int size, len;
1409 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 if (!PyUnicode_Check(args))
1412 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 if (!self->bin) {
1415 char *repr_str;
1416 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418 repr = modified_EncodeRawUnicodeEscape(
1419 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001420 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 if ((len = PyString_Size(repr)) < 0)
1424 goto err;
1425 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001426
Tim Peters0bc93f52003-02-02 18:29:33 +00001427 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001428 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001429
Tim Peters0bc93f52003-02-02 18:29:33 +00001430 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001431 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001432
Tim Peters0bc93f52003-02-02 18:29:33 +00001433 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 Py_XDECREF(repr);
1437 }
1438 else {
1439 int i;
1440 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001441
Tim Peterscba30e22003-02-01 06:24:36 +00001442 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001445 if ((size = PyString_Size(repr)) < 0)
1446 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 c_str[0] = BINUNICODE;
1449 for (i = 1; i < 5; i++)
1450 c_str[i] = (int)(size >> ((i - 1) * 8));
1451 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001452
Tim Peters0bc93f52003-02-02 18:29:33 +00001453 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 if (size > 128 && Pdata_Check(self->file)) {
1457 if (write_other(self, NULL, 0) < 0)
1458 goto err;
1459 PDATA_APPEND(self->file, repr, -1);
1460 }
1461 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001462 if (self->write_func(self, PyString_AS_STRING(repr),
1463 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001464 goto err;
1465 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 Py_DECREF(repr);
1468 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 if (doput)
1471 if (put(self, args) < 0)
1472 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001474 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 err:
1477 Py_XDECREF(repr);
1478 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001479}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001480#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001481
Tim Peters1d63c9f2003-02-02 20:29:39 +00001482/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1483static int
1484store_tuple_elememts(Picklerobject *self, PyObject *t, int len)
1485{
1486 int i;
1487 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001488
Tim Peters1d63c9f2003-02-02 20:29:39 +00001489 assert(PyTuple_Size(t) == len);
1490
1491 for (i = 0; i < len; i++) {
1492 PyObject *element = PyTuple_GET_ITEM(t, i);
1493
1494 if (element == NULL)
1495 goto finally;
1496 if (save(self, element, 0) < 0)
1497 goto finally;
1498 }
1499 res = 0;
1500
1501 finally:
1502 return res;
1503}
1504
1505/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1506 * used across protocols to minimize the space needed to pickle them.
1507 * Tuples are also the only builtin immuatable type that can be recursive
1508 * (a tuple can be reached from itself), and that requires some subtle
1509 * magic so that it works in all cases. IOW, this is a long routine.
1510 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001511static int
Tim Peterscba30e22003-02-01 06:24:36 +00001512save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001514 PyObject *py_tuple_id = NULL;
1515 int len, i;
1516 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001519 static char pop = POP;
1520 static char pop_mark = POP_MARK;
1521 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 if ((len = PyTuple_Size(args)) < 0)
1524 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001525
Tim Peters1d63c9f2003-02-02 20:29:39 +00001526 if (len == 0) {
1527 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001528
Tim Peters1d63c9f2003-02-02 20:29:39 +00001529 if (self->proto) {
1530 c_str[0] = EMPTY_TUPLE;
1531 len = 1;
1532 }
1533 else {
1534 c_str[0] = MARK;
1535 c_str[1] = TUPLE;
1536 len = 2;
1537 }
1538 if (self->write_func(self, c_str, len) >= 0)
1539 res = 0;
1540 /* Don't memoize an empty tuple. */
1541 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Tim Peters1d63c9f2003-02-02 20:29:39 +00001544 /* A non-empty tuple. */
1545
1546 /* id(tuple) isn't in the memo now. If it shows up there after
1547 * saving the tuple elements, the tuple must be recursive, in
1548 * which case we'll pop everything we put on the stack, and fetch
1549 * its value from the memo.
1550 */
1551 py_tuple_id = PyLong_FromVoidPtr(args);
1552 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001554
Tim Peters1d63c9f2003-02-02 20:29:39 +00001555 if (len <= 3 && self->proto >= 2) {
1556 /* Use TUPLE{1,2,3} opcodes. */
1557 if (store_tuple_elememts(self, args, len) < 0)
1558 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001560 /* pop the len elements */
1561 for (i = 0; i < len; ++i)
1562 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001564 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if (get(self, py_tuple_id) < 0)
1566 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 res = 0;
1568 goto finally;
1569 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001570 /* Not recursive. */
1571 if (self->write_func(self, len2opcode + len, 1) < 0)
1572 goto finally;
1573 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001575
Tim Peters1d63c9f2003-02-02 20:29:39 +00001576 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1577 * Generate MARK elt1 elt2 ... TUPLE
1578 */
1579 if (self->write_func(self, &MARKv, 1) < 0)
1580 goto finally;
1581
1582 if (store_tuple_elememts(self, args, len) < 0)
1583 goto finally;
1584
1585 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1586 /* pop the stack stuff we pushed */
1587 if (self->bin) {
1588 if (self->write_func(self, &pop_mark, 1) < 0)
1589 goto finally;
1590 }
1591 else {
1592 /* Note that we pop one more than len, to remove
1593 * the MARK too.
1594 */
1595 for (i = 0; i <= len; i++)
1596 if (self->write_func(self, &pop, 1) < 0)
1597 goto finally;
1598 }
1599 /* fetch from memo */
1600 if (get(self, py_tuple_id) >= 0)
1601 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 goto finally;
1603 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001604
Tim Peters1d63c9f2003-02-02 20:29:39 +00001605 /* Not recursive. */
1606 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001608
Tim Peters1d63c9f2003-02-02 20:29:39 +00001609 memoize:
1610 if (put(self, args) >= 0)
1611 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 finally:
1614 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001615 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001616}
1617
1618static int
Tim Peterscba30e22003-02-01 06:24:36 +00001619save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620{
1621 PyObject *element = 0;
1622 int s_len, len, i, using_appends, res = -1;
1623 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001627 if (self->fast && !fast_save_enter(self, args))
1628 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 if (self->bin) {
1631 s[0] = EMPTY_LIST;
1632 s_len = 1;
1633 }
1634 else {
1635 s[0] = MARK;
1636 s[1] = LIST;
1637 s_len = 2;
1638 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if ((len = PyList_Size(args)) < 0)
1641 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Tim Peters0bc93f52003-02-02 18:29:33 +00001643 if (self->write_func(self, s, s_len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 if (len == 0) {
1647 if (put(self, args) < 0)
1648 goto finally;
1649 }
1650 else {
1651 if (put2(self, args) < 0)
1652 goto finally;
1653 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 if ((using_appends = (self->bin && (len > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001656 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001657 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001659 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001660 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 if (save(self, element, 0) < 0)
1664 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001666 if (!using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001667 if (self->write_func(self, &append, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 goto finally;
1669 }
1670 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 if (using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001673 if (self->write_func(self, &appends, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 goto finally;
1675 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001679 finally:
1680 if (self->fast && !fast_save_leave(self, args))
1681 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001684}
1685
1686
Guido van Rossum60456fd1997-04-09 17:36:32 +00001687static int
Tim Peterscba30e22003-02-01 06:24:36 +00001688save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689{
1690 PyObject *key = 0, *value = 0;
1691 int i, len, res = -1, using_setitems;
1692 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 if (self->fast && !fast_save_enter(self, args))
1697 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001699 if (self->bin) {
1700 s[0] = EMPTY_DICT;
1701 len = 1;
1702 }
1703 else {
1704 s[0] = MARK;
1705 s[1] = DICT;
1706 len = 2;
1707 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Tim Peters0bc93f52003-02-02 18:29:33 +00001709 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001710 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 if ((len = PyDict_Size(args)) < 0)
1713 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 if (len == 0) {
1716 if (put(self, args) < 0)
1717 goto finally;
1718 }
1719 else {
1720 if (put2(self, args) < 0)
1721 goto finally;
1722 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001725 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001728 i = 0;
1729 while (PyDict_Next(args, &i, &key, &value)) {
1730 if (save(self, key, 0) < 0)
1731 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 if (save(self, value, 0) < 0)
1734 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 if (!using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001737 if (self->write_func(self, &setitem, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 goto finally;
1739 }
1740 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 if (using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001743 if (self->write_func(self, &setitems, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 goto finally;
1745 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 finally:
1750 if (self->fast && !fast_save_leave(self, args))
1751 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001754}
1755
1756
Tim Peters84e87f32001-03-17 04:50:51 +00001757static int
Tim Peterscba30e22003-02-01 06:24:36 +00001758save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759{
1760 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1761 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1762 char *module_str, *name_str;
1763 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 if (self->fast && !fast_save_enter(self, args))
1768 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001769
Tim Peters0bc93f52003-02-02 18:29:33 +00001770 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001771 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Tim Peterscba30e22003-02-01 06:24:36 +00001773 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 if (self->bin) {
1777 if (save(self, class, 0) < 0)
1778 goto finally;
1779 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1782 PyObject *element = 0;
1783 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001786 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001787 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 if ((len = PyObject_Size(class_args)) < 0)
1790 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001793 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001794 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 if (save(self, element, 0) < 0) {
1797 Py_DECREF(element);
1798 goto finally;
1799 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001801 Py_DECREF(element);
1802 }
1803 }
1804 else {
1805 PyErr_Clear();
1806 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 if (!self->bin) {
1809 if (!( name = ((PyClassObject *)class)->cl_name )) {
1810 PyErr_SetString(PicklingError, "class has no name");
1811 goto finally;
1812 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Tim Peterscba30e22003-02-01 06:24:36 +00001814 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001816
Tim Peters84e87f32001-03-17 04:50:51 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 if ((module_size = PyString_Size(module)) < 0 ||
1819 (name_size = PyString_Size(name)) < 0)
1820 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 module_str = PyString_AS_STRING((PyStringObject *)module);
1823 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Tim Peters0bc93f52003-02-02 18:29:33 +00001825 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Tim Peters0bc93f52003-02-02 18:29:33 +00001828 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Tim Peters0bc93f52003-02-02 18:29:33 +00001831 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001833
Tim Peters0bc93f52003-02-02 18:29:33 +00001834 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001836
Tim Peters0bc93f52003-02-02 18:29:33 +00001837 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 goto finally;
1839 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001840 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001841 goto finally;
1842 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001844 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1845 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001846 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001847 goto finally;
1848 }
1849 else {
1850 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1853 PyErr_Clear();
1854 res = 0;
1855 goto finally;
1856 }
1857 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 if (!PyDict_Check(state)) {
1860 if (put2(self, args) < 0)
1861 goto finally;
1862 }
1863 else {
1864 if (put(self, args) < 0)
1865 goto finally;
1866 }
Tim Peters84e87f32001-03-17 04:50:51 +00001867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 if (save(self, state, 0) < 0)
1869 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001870
Tim Peters0bc93f52003-02-02 18:29:33 +00001871 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001872 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 finally:
1877 if (self->fast && !fast_save_leave(self, args))
1878 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 Py_XDECREF(module);
1881 Py_XDECREF(class);
1882 Py_XDECREF(state);
1883 Py_XDECREF(getinitargs_func);
1884 Py_XDECREF(getstate_func);
1885 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001887 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001888}
1889
1890
Guido van Rossum60456fd1997-04-09 17:36:32 +00001891static int
Tim Peterscba30e22003-02-01 06:24:36 +00001892save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001894 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 char *name_str, *module_str;
1896 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 if (name) {
1901 global_name = name;
1902 Py_INCREF(global_name);
1903 }
1904 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001905 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906 goto finally;
1907 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001908
Tim Peterscba30e22003-02-01 06:24:36 +00001909 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001910 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 if ((module_size = PyString_Size(module)) < 0 ||
1913 (name_size = PyString_Size(global_name)) < 0)
1914 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 module_str = PyString_AS_STRING((PyStringObject *)module);
1917 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001918
Guido van Rossum75bfd052002-12-24 18:10:07 +00001919 /* XXX This can be doing a relative import. Clearly it shouldn't,
1920 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 mod = PyImport_ImportModule(module_str);
1922 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 cPickle_ErrFormat(PicklingError,
1924 "Can't pickle %s: it's not found as %s.%s",
1925 "OSS", args, module, global_name);
1926 goto finally;
1927 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001928 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 if (klass == NULL) {
1930 cPickle_ErrFormat(PicklingError,
1931 "Can't pickle %s: it's not found as %s.%s",
1932 "OSS", args, module, global_name);
1933 goto finally;
1934 }
1935 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001936 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 cPickle_ErrFormat(PicklingError,
1938 "Can't pickle %s: it's not the same object as %s.%s",
1939 "OSS", args, module, global_name);
1940 goto finally;
1941 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001942 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001943
Tim Peters0bc93f52003-02-02 18:29:33 +00001944 if (self->write_func(self, &global, 1) < 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, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001949
Tim Peters0bc93f52003-02-02 18:29:33 +00001950 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Tim Peters0bc93f52003-02-02 18:29:33 +00001953 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Tim Peters0bc93f52003-02-02 18:29:33 +00001956 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (put(self, args) < 0)
1960 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 finally:
1965 Py_XDECREF(module);
1966 Py_XDECREF(global_name);
1967 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001970}
1971
Guido van Rossum60456fd1997-04-09 17:36:32 +00001972static int
Tim Peterscba30e22003-02-01 06:24:36 +00001973save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974{
1975 PyObject *pid = 0;
1976 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001978 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001980 Py_INCREF(args);
1981 ARG_TUP(self, args);
1982 if (self->arg) {
1983 pid = PyObject_Call(f, self->arg, NULL);
1984 FREE_ARG_TUP(self);
1985 }
1986 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001988 if (pid != Py_None) {
1989 if (!self->bin) {
1990 if (!PyString_Check(pid)) {
1991 PyErr_SetString(PicklingError,
1992 "persistent id must be string");
1993 goto finally;
1994 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Tim Peters0bc93f52003-02-02 18:29:33 +00001996 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 if ((size = PyString_Size(pid)) < 0)
2000 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001
Tim Peters0bc93f52003-02-02 18:29:33 +00002002 if (self->write_func(self,
2003 PyString_AS_STRING(
2004 (PyStringObject *)pid),
2005 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002007
Tim Peters0bc93f52003-02-02 18:29:33 +00002008 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002009 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 res = 1;
2012 goto finally;
2013 }
2014 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002015 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 res = -1;
2017 else
2018 res = 1;
2019 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002021 goto finally;
2022 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 finally:
2027 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002030}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002031
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002032
Tim Peters84e87f32001-03-17 04:50:51 +00002033static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002034save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002035 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036{
2037 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 if (save(self, callable, 0) < 0)
2040 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 if (save(self, tup, 0) < 0)
2043 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002044
Tim Peters0bc93f52003-02-02 18:29:33 +00002045 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002046 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002048 if (ob != NULL) {
2049 if (state && !PyDict_Check(state)) {
2050 if (put2(self, ob) < 0)
2051 return -1;
2052 }
2053 else {
2054 if (put(self, ob) < 0)
2055 return -1;
2056 }
2057 }
Tim Peters84e87f32001-03-17 04:50:51 +00002058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002059 if (state) {
2060 if (save(self, state, 0) < 0)
2061 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002062
Tim Peters0bc93f52003-02-02 18:29:33 +00002063 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002064 return -1;
2065 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002068}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002069
Guido van Rossum60456fd1997-04-09 17:36:32 +00002070static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002071save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072{
2073 PyTypeObject *type;
2074 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2075 *callable = 0, *state = 0;
2076 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002077
Martin v. Löwis5a395302002-08-04 08:20:23 +00002078 if (self->nesting++ > Py_GetRecursionLimit()){
2079 PyErr_SetString(PyExc_RuntimeError,
2080 "maximum recursion depth exceeded");
2081 goto finally;
2082 }
2083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 if (!pers_save && self->pers_func) {
2085 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2086 res = tmp;
2087 goto finally;
2088 }
2089 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 if (args == Py_None) {
2092 res = save_none(self, args);
2093 goto finally;
2094 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002099 case 'b':
2100 if (args == Py_False || args == Py_True) {
2101 res = save_bool(self, args);
2102 goto finally;
2103 }
2104 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002105 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002106 if (type == &PyInt_Type) {
2107 res = save_int(self, args);
2108 goto finally;
2109 }
2110 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002111
Guido van Rossum60456fd1997-04-09 17:36:32 +00002112 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002113 if (type == &PyLong_Type) {
2114 res = save_long(self, args);
2115 goto finally;
2116 }
2117 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002118
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if (type == &PyFloat_Type) {
2121 res = save_float(self, args);
2122 goto finally;
2123 }
2124 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002125
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002127 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2128 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 goto finally;
2130 }
2131 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002132
Guido van Rossum60456fd1997-04-09 17:36:32 +00002133 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2135 res = save_string(self, args, 0);
2136 goto finally;
2137 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002138
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002139#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002140 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2142 res = save_unicode(self, args, 0);
2143 goto finally;
2144 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002145#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002148 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002149 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002150 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 if (PyDict_GetItem(self->memo, py_ob_id)) {
2153 if (get(self, py_ob_id) < 0)
2154 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002156 res = 0;
2157 goto finally;
2158 }
2159 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002162 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002163 if (type == &PyString_Type) {
2164 res = save_string(self, args, 1);
2165 goto finally;
2166 }
2167 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002168
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002169#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002170 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002171 if (type == &PyUnicode_Type) {
2172 res = save_unicode(self, args, 1);
2173 goto finally;
2174 }
2175 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002176#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002177
Guido van Rossum60456fd1997-04-09 17:36:32 +00002178 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 if (type == &PyTuple_Type) {
2180 res = save_tuple(self, args);
2181 goto finally;
2182 }
2183 if (type == &PyType_Type) {
2184 res = save_global(self, args, NULL);
2185 goto finally;
2186 }
2187 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002188
Guido van Rossum60456fd1997-04-09 17:36:32 +00002189 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 if (type == &PyList_Type) {
2191 res = save_list(self, args);
2192 goto finally;
2193 }
2194 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002195
2196 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002197 if (type == &PyDict_Type) {
2198 res = save_dict(self, args);
2199 goto finally;
2200 }
2201 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002202
2203 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002204 if (type == &PyInstance_Type) {
2205 res = save_inst(self, args);
2206 goto finally;
2207 }
2208 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002209
2210 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002211 if (type == &PyClass_Type) {
2212 res = save_global(self, args, NULL);
2213 goto finally;
2214 }
2215 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002216
2217 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002218 if (type == &PyFunction_Type) {
2219 res = save_global(self, args, NULL);
2220 goto finally;
2221 }
2222 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002223
2224 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002225 if (type == &PyCFunction_Type) {
2226 res = save_global(self, args, NULL);
2227 goto finally;
2228 }
2229 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002231 if (!pers_save && self->inst_pers_func) {
2232 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2233 res = tmp;
2234 goto finally;
2235 }
2236 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002237
Jeremy Hylton39c61162002-07-16 19:47:43 +00002238 if (PyType_IsSubtype(type, &PyType_Type)) {
2239 res = save_global(self, args, NULL);
2240 goto finally;
2241 }
2242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002243 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2244 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002246 Py_INCREF(args);
2247 ARG_TUP(self, args);
2248 if (self->arg) {
2249 t = PyObject_Call(__reduce__, self->arg, NULL);
2250 FREE_ARG_TUP(self);
2251 }
2252 if (! t) goto finally;
2253 }
2254 else {
2255 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2258 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002259 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002260 goto finally;
2261 }
2262 else {
2263 PyErr_Clear();
2264 }
2265 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267 if (t) {
2268 if (PyString_Check(t)) {
2269 res = save_global(self, args, t);
2270 goto finally;
2271 }
Tim Peters84e87f32001-03-17 04:50:51 +00002272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 if (!PyTuple_Check(t)) {
2274 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2275 "be a tuple", "O", __reduce__);
2276 goto finally;
2277 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 if ((size != 3) && (size != 2)) {
2282 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2283 "contain only two or three elements", "O", __reduce__);
2284 goto finally;
2285 }
Tim Peters84e87f32001-03-17 04:50:51 +00002286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 if (size > 2) {
2292 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002293 if (state == Py_None)
2294 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2298 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2299 "returned by %s must be a tuple", "O", __reduce__);
2300 goto finally;
2301 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 res = save_reduce(self, callable, arg_tup, state, args);
2304 goto finally;
2305 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002309 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002310 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 Py_XDECREF(py_ob_id);
2312 Py_XDECREF(__reduce__);
2313 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002316}
2317
2318
2319static int
Tim Peterscba30e22003-02-01 06:24:36 +00002320dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321{
2322 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002323
Tim Peters4190fb82003-02-02 16:09:05 +00002324 if (self->proto >= 2) {
2325 char bytes[2];
2326
2327 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002328 assert(self->proto >= 0 && self->proto < 256);
2329 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002330 if (self->write_func(self, bytes, 2) < 0)
2331 return -1;
2332 }
2333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334 if (save(self, args, 0) < 0)
2335 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002336
Tim Peters4190fb82003-02-02 16:09:05 +00002337 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002338 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002339
Tim Peters4190fb82003-02-02 16:09:05 +00002340 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002344}
2345
2346static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002347Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002348{
Tim Peterscba30e22003-02-01 06:24:36 +00002349 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 PyDict_Clear(self->memo);
2351 Py_INCREF(Py_None);
2352 return Py_None;
2353}
2354
2355static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002356Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357{
2358 int l, i, rsize, ssize, clear=1, lm;
2359 long ik;
2360 PyObject *k, *r;
2361 char *s, *p, *have_get;
2362 Pdata *data;
2363
2364 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002365 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002366 return NULL;
2367
2368 /* Check to make sure we are based on a list */
2369 if (! Pdata_Check(self->file)) {
2370 PyErr_SetString(PicklingError,
2371 "Attempt to getvalue() a non-list-based pickler");
2372 return NULL;
2373 }
2374
2375 /* flush write buffer */
2376 if (write_other(self, NULL, 0) < 0) return NULL;
2377
2378 data=(Pdata*)self->file;
2379 l=data->length;
2380
2381 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002382 lm = PyDict_Size(self->memo);
2383 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002385 have_get = malloc(lm);
2386 if (have_get == NULL) return PyErr_NoMemory();
2387 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002388
2389 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002390 for (rsize = 0, i = l; --i >= 0; ) {
2391 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392
Tim Petersac5687a2003-02-02 18:08:34 +00002393 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002394 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395
2396 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002397 ik = PyInt_AS_LONG((PyIntObject*)k);
2398 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 PyErr_SetString(PicklingError,
2400 "Invalid get data");
2401 return NULL;
2402 }
Tim Petersac5687a2003-02-02 18:08:34 +00002403 if (have_get[ik]) /* with matching get */
2404 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 }
2406
2407 else if (! (PyTuple_Check(k) &&
2408 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002409 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002410 ) {
2411 PyErr_SetString(PicklingError,
2412 "Unexpected data in internal list");
2413 return NULL;
2414 }
2415
2416 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002417 ik = PyInt_AS_LONG((PyIntObject *)k);
2418 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 PyErr_SetString(PicklingError,
2420 "Invalid get data");
2421 return NULL;
2422 }
Tim Petersac5687a2003-02-02 18:08:34 +00002423 have_get[ik] = 1;
2424 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002425 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002426 }
2427
2428 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002429 r = PyString_FromStringAndSize(NULL, rsize);
2430 if (r == NULL) goto err;
2431 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432
Tim Petersac5687a2003-02-02 18:08:34 +00002433 for (i = 0; i < l; i++) {
2434 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002435
2436 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002437 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002439 p=PyString_AS_STRING((PyStringObject *)k);
2440 while (--ssize >= 0)
2441 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002442 }
2443 }
2444
2445 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002446 ik = PyInt_AS_LONG((PyIntObject *)
2447 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002448 if (ik < 256) {
2449 *s++ = BINGET;
2450 *s++ = (int)(ik & 0xff);
2451 }
2452 else {
2453 *s++ = LONG_BINGET;
2454 *s++ = (int)(ik & 0xff);
2455 *s++ = (int)((ik >> 8) & 0xff);
2456 *s++ = (int)((ik >> 16) & 0xff);
2457 *s++ = (int)((ik >> 24) & 0xff);
2458 }
2459 }
2460
2461 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002462 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463
2464 if (have_get[ik]) { /* with matching get */
2465 if (ik < 256) {
2466 *s++ = BINPUT;
2467 *s++ = (int)(ik & 0xff);
2468 }
2469 else {
2470 *s++ = LONG_BINPUT;
2471 *s++ = (int)(ik & 0xff);
2472 *s++ = (int)((ik >> 8) & 0xff);
2473 *s++ = (int)((ik >> 16) & 0xff);
2474 *s++ = (int)((ik >> 24) & 0xff);
2475 }
2476 }
2477 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478 }
2479
2480 if (clear) {
2481 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002482 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002483 }
2484
2485 free(have_get);
2486 return r;
2487 err:
2488 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002489 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002490}
2491
2492static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002493Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494{
2495 PyObject *ob;
2496 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002497
Tim Peterscba30e22003-02-01 06:24:36 +00002498 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501 if (dump(self, ob) < 0)
2502 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 /* XXX Why does dump() return self? */
2507 Py_INCREF(self);
2508 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002509}
2510
2511
Tim Peterscba30e22003-02-01 06:24:36 +00002512static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513{
Neal Norwitzb0493252002-03-31 14:44:22 +00002514 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002515 PyDoc_STR("dump(object) -- "
2516 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002517 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002518 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002519 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002520 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002521 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002522};
2523
2524
2525static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002526newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527{
2528 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002529
Tim Peters5bd2a792003-02-01 16:45:06 +00002530 if (proto < 0)
2531 proto = CURRENT_PROTOCOL_NUMBER;
2532 if (proto > CURRENT_PROTOCOL_NUMBER) {
2533 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2534 "the highest available protocol is %d",
2535 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002537 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002538
Tim Peters5bd2a792003-02-01 16:45:06 +00002539 self = PyObject_New(Picklerobject, &Picklertype);
2540 if (self == NULL)
2541 return NULL;
2542 self->proto = proto;
2543 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002544 self->fp = NULL;
2545 self->write = NULL;
2546 self->memo = NULL;
2547 self->arg = NULL;
2548 self->pers_func = NULL;
2549 self->inst_pers_func = NULL;
2550 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002551 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002552 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002553 self->fast_container = 0;
2554 self->fast_memo = NULL;
2555 self->buf_size = 0;
2556 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002557
Tim Peters5bd2a792003-02-01 16:45:06 +00002558 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002559 if (file)
2560 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002561 else {
2562 file = Pdata_New();
2563 if (file == NULL)
2564 goto err;
2565 }
2566 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002567
Tim Peterscba30e22003-02-01 06:24:36 +00002568 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002569 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002571 if (PyFile_Check(file)) {
2572 self->fp = PyFile_AsFile(file);
2573 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002574 PyErr_SetString(PyExc_ValueError,
2575 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002576 goto err;
2577 }
2578 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002579 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 else if (PycStringIO_OutputCheck(file)) {
2581 self->write_func = write_cStringIO;
2582 }
2583 else if (file == Py_None) {
2584 self->write_func = write_none;
2585 }
2586 else {
2587 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589 if (! Pdata_Check(file)) {
2590 self->write = PyObject_GetAttr(file, write_str);
2591 if (!self->write) {
2592 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002593 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 "argument must have 'write' "
2595 "attribute");
2596 goto err;
2597 }
2598 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002599
Tim Peters5bd2a792003-02-01 16:45:06 +00002600 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2601 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 PyErr_NoMemory();
2603 goto err;
2604 }
2605 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 if (PyEval_GetRestricted()) {
2608 /* Restricted execution, get private tables */
2609 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2612 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2613 Py_DECREF(m);
2614 if (!( self->dispatch_table )) goto err;
2615 }
2616 else {
2617 self->dispatch_table=dispatch_table;
2618 Py_INCREF(dispatch_table);
2619 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002623 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002624 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002626}
2627
2628
2629static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002630get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631{
2632 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002633 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002634
Tim Peters5bd2a792003-02-01 16:45:06 +00002635 /* XXX What is this doing? The documented signature is
2636 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2637 * XXX Pickler(integer) too. The meaning then is clear as mud.
2638 * XXX Bug? Feature?
2639 */
2640 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002642 proto = 0;
2643 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 return NULL;
2645 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002646 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002647}
2648
2649
2650static void
Tim Peterscba30e22003-02-01 06:24:36 +00002651Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652{
2653 Py_XDECREF(self->write);
2654 Py_XDECREF(self->memo);
2655 Py_XDECREF(self->fast_memo);
2656 Py_XDECREF(self->arg);
2657 Py_XDECREF(self->file);
2658 Py_XDECREF(self->pers_func);
2659 Py_XDECREF(self->inst_pers_func);
2660 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002661 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002663}
2664
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002665static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002666Pickler_get_pers_func(Picklerobject *p)
2667{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 if (p->pers_func == NULL)
2669 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2670 else
2671 Py_INCREF(p->pers_func);
2672 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002673}
2674
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002675static int
2676Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2677{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 if (v == NULL) {
2679 PyErr_SetString(PyExc_TypeError,
2680 "attribute deletion is not supported");
2681 return -1;
2682 }
2683 Py_XDECREF(p->pers_func);
2684 Py_INCREF(v);
2685 p->pers_func = v;
2686 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002687}
2688
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002689static int
2690Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2691{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002692 if (v == NULL) {
2693 PyErr_SetString(PyExc_TypeError,
2694 "attribute deletion is not supported");
2695 return -1;
2696 }
2697 Py_XDECREF(p->inst_pers_func);
2698 Py_INCREF(v);
2699 p->inst_pers_func = v;
2700 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002701}
2702
2703static PyObject *
2704Pickler_get_memo(Picklerobject *p)
2705{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706 if (p->memo == NULL)
2707 PyErr_SetString(PyExc_AttributeError, "memo");
2708 else
2709 Py_INCREF(p->memo);
2710 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002711}
2712
2713static int
2714Pickler_set_memo(Picklerobject *p, PyObject *v)
2715{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716 if (v == NULL) {
2717 PyErr_SetString(PyExc_TypeError,
2718 "attribute deletion is not supported");
2719 return -1;
2720 }
2721 if (!PyDict_Check(v)) {
2722 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2723 return -1;
2724 }
2725 Py_XDECREF(p->memo);
2726 Py_INCREF(v);
2727 p->memo = v;
2728 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002729}
2730
2731static PyObject *
2732Pickler_get_error(Picklerobject *p)
2733{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 /* why is this an attribute on the Pickler? */
2735 Py_INCREF(PicklingError);
2736 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002737}
2738
2739static PyMemberDef Pickler_members[] = {
2740 {"binary", T_INT, offsetof(Picklerobject, bin)},
2741 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002742 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002743};
2744
2745static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002746 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002747 (setter)Pickler_set_pers_func},
2748 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2749 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002750 {"PicklingError", (getter)Pickler_get_error, NULL},
2751 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002752};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002753
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002754PyDoc_STRVAR(Picklertype__doc__,
2755"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002756
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002757static PyTypeObject Picklertype = {
2758 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002759 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002760 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002761 sizeof(Picklerobject), /*tp_basicsize*/
2762 0,
2763 (destructor)Pickler_dealloc, /* tp_dealloc */
2764 0, /* tp_print */
2765 0, /* tp_getattr */
2766 0, /* tp_setattr */
2767 0, /* tp_compare */
2768 0, /* tp_repr */
2769 0, /* tp_as_number */
2770 0, /* tp_as_sequence */
2771 0, /* tp_as_mapping */
2772 0, /* tp_hash */
2773 0, /* tp_call */
2774 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002775 PyObject_GenericGetAttr, /* tp_getattro */
2776 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002777 0, /* tp_as_buffer */
2778 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2779 Picklertype__doc__, /* tp_doc */
2780 0, /* tp_traverse */
2781 0, /* tp_clear */
2782 0, /* tp_richcompare */
2783 0, /* tp_weaklistoffset */
2784 0, /* tp_iter */
2785 0, /* tp_iternext */
2786 Pickler_methods, /* tp_methods */
2787 Pickler_members, /* tp_members */
2788 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002789};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002790
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002791static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002792find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793{
2794 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 if (fc) {
2797 if (fc==Py_None) {
2798 PyErr_SetString(UnpicklingError,
2799 "Global and instance pickles are not supported.");
2800 return NULL;
2801 }
Tim Peterscba30e22003-02-01 06:24:36 +00002802 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002803 py_global_name);
2804 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 module = PySys_GetObject("modules");
2807 if (module == NULL)
2808 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 module = PyDict_GetItem(module, py_module_name);
2811 if (module == NULL) {
2812 module = PyImport_Import(py_module_name);
2813 if (!module)
2814 return NULL;
2815 global = PyObject_GetAttr(module, py_global_name);
2816 Py_DECREF(module);
2817 }
2818 else
2819 global = PyObject_GetAttr(module, py_global_name);
2820 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002821}
2822
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002823static int
Tim Peterscba30e22003-02-01 06:24:36 +00002824marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825{
2826 if (self->num_marks < 1) {
2827 PyErr_SetString(UnpicklingError, "could not find MARK");
2828 return -1;
2829 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832}
2833
Tim Peters84e87f32001-03-17 04:50:51 +00002834
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835static int
Tim Peterscba30e22003-02-01 06:24:36 +00002836load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837{
2838 PDATA_APPEND(self->stack, Py_None, -1);
2839 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840}
2841
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002842static int
Tim Peterscba30e22003-02-01 06:24:36 +00002843bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844{
2845 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2846 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002847}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
2849static int
Tim Peterscba30e22003-02-01 06:24:36 +00002850load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851{
2852 PyObject *py_int = 0;
2853 char *endptr, *s;
2854 int len, res = -1;
2855 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Tim Peters0bc93f52003-02-02 18:29:33 +00002857 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 if (len < 2) return bad_readline();
2859 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 errno = 0;
2862 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2865 /* Hm, maybe we've got something long. Let's try reading
2866 it as a Python long object. */
2867 errno = 0;
2868 py_int = PyLong_FromString(s, NULL, 0);
2869 if (py_int == NULL) {
2870 PyErr_SetString(PyExc_ValueError,
2871 "could not convert string to int");
2872 goto finally;
2873 }
2874 }
2875 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002876 if (len == 3 && (l == 0 || l == 1)) {
2877 if (!( py_int = PyBool_FromLong(l))) goto finally;
2878 }
2879 else {
2880 if (!( py_int = PyInt_FromLong(l))) goto finally;
2881 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 free(s);
2885 PDATA_PUSH(self->stack, py_int, -1);
2886 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 finally:
2889 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002892}
2893
Tim Peters3c67d792003-02-02 17:59:11 +00002894static int
2895load_bool(Unpicklerobject *self, PyObject *boolean)
2896{
2897 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002898 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002899 return 0;
2900}
2901
Tim Petersee1a53c2003-02-02 02:57:53 +00002902/* s contains x bytes of a little-endian integer. Return its value as a
2903 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2904 * int, but when x is 4 it's a signed one. This is an historical source
2905 * of x-platform bugs.
2906 */
Tim Peters84e87f32001-03-17 04:50:51 +00002907static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002908calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002909{
2910 unsigned char c;
2911 int i;
2912 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 for (i = 0, l = 0L; i < x; i++) {
2915 c = (unsigned char)s[i];
2916 l |= (long)c << (i * 8);
2917 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002918#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2920 * is signed, so on a box with longs bigger than 4 bytes we need
2921 * to extend a BININT's sign bit to the full width.
2922 */
2923 if (x == 4 && l & (1L << 31))
2924 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002925#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927}
2928
2929
2930static int
Tim Peterscba30e22003-02-01 06:24:36 +00002931load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932{
2933 PyObject *py_int = 0;
2934 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Tim Peterscba30e22003-02-01 06:24:36 +00002938 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 PDATA_PUSH(self->stack, py_int, -1);
2942 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943}
2944
2945
2946static int
Tim Peterscba30e22003-02-01 06:24:36 +00002947load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948{
2949 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Tim Peters0bc93f52003-02-02 18:29:33 +00002951 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955}
2956
2957
2958static int
Tim Peterscba30e22003-02-01 06:24:36 +00002959load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960{
2961 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
Tim Peters0bc93f52003-02-02 18:29:33 +00002963 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967}
2968
2969
2970static int
Tim Peterscba30e22003-02-01 06:24:36 +00002971load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972{
2973 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974
Tim Peters0bc93f52003-02-02 18:29:33 +00002975 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979}
Tim Peters84e87f32001-03-17 04:50:51 +00002980
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981static int
Tim Peterscba30e22003-02-01 06:24:36 +00002982load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983{
2984 PyObject *l = 0;
2985 char *end, *s;
2986 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002987
Tim Peters0bc93f52003-02-02 18:29:33 +00002988 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 if (len < 2) return bad_readline();
2990 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002991
Tim Peterscba30e22003-02-01 06:24:36 +00002992 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 free(s);
2996 PDATA_PUSH(self->stack, l, -1);
2997 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 finally:
3000 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003}
3004
Tim Petersee1a53c2003-02-02 02:57:53 +00003005/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3006 * data following.
3007 */
3008static int
3009load_counted_long(Unpicklerobject *self, int size)
3010{
3011 int i;
3012 char *nbytes;
3013 unsigned char *pdata;
3014 PyObject *along;
3015
3016 assert(size == 1 || size == 4);
3017 i = self->read_func(self, &nbytes, size);
3018 if (i < 0) return -1;
3019
3020 size = calc_binint(nbytes, size);
3021 if (size < 0) {
3022 /* Corrupt or hostile pickle -- we never write one like
3023 * this.
3024 */
3025 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
3026 "byte count");
3027 return -1;
3028 }
3029
3030 if (size == 0)
3031 along = PyLong_FromLong(0L);
3032 else {
3033 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003034 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003035 if (i < 0) return -1;
3036 along = _PyLong_FromByteArray(pdata, (size_t)size,
3037 1 /* little endian */, 1 /* signed */);
3038 }
3039 if (along == NULL)
3040 return -1;
3041 PDATA_PUSH(self->stack, along, -1);
3042 return 0;
3043}
Tim Peters84e87f32001-03-17 04:50:51 +00003044
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045static int
Tim Peterscba30e22003-02-01 06:24:36 +00003046load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003047{
3048 PyObject *py_float = 0;
3049 char *endptr, *s;
3050 int len, res = -1;
3051 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003052
Tim Peters0bc93f52003-02-02 18:29:33 +00003053 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 if (len < 2) return bad_readline();
3055 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 errno = 0;
3058 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3061 PyErr_SetString(PyExc_ValueError,
3062 "could not convert string to float");
3063 goto finally;
3064 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065
Tim Peterscba30e22003-02-01 06:24:36 +00003066 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 free(s);
3070 PDATA_PUSH(self->stack, py_float, -1);
3071 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 finally:
3074 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077}
3078
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079static int
Tim Peterscba30e22003-02-01 06:24:36 +00003080load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081{
3082 PyObject *py_float = 0;
3083 int s, e;
3084 long fhi, flo;
3085 double x;
3086 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
Tim Peters0bc93f52003-02-02 18:29:33 +00003088 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 /* First byte */
3092 s = (*p>>7) & 1;
3093 e = (*p & 0x7F) << 4;
3094 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 /* Second byte */
3097 e |= (*p>>4) & 0xF;
3098 fhi = (*p & 0xF) << 24;
3099 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 /* Third byte */
3102 fhi |= (*p & 0xFF) << 16;
3103 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 /* Fourth byte */
3106 fhi |= (*p & 0xFF) << 8;
3107 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 /* Fifth byte */
3110 fhi |= *p & 0xFF;
3111 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 /* Sixth byte */
3114 flo = (*p & 0xFF) << 16;
3115 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117 /* Seventh byte */
3118 flo |= (*p & 0xFF) << 8;
3119 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 /* Eighth byte */
3122 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003124 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3125 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 /* XXX This sadly ignores Inf/NaN */
3128 if (e == 0)
3129 e = -1022;
3130 else {
3131 x += 1.0;
3132 e -= 1023;
3133 }
3134 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 if (s)
3137 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003141 PDATA_PUSH(self->stack, py_float, -1);
3142 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003143}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003144
3145static int
Tim Peterscba30e22003-02-01 06:24:36 +00003146load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147{
3148 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003149 int len, res = -1;
3150 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003151
Tim Peters0bc93f52003-02-02 18:29:33 +00003152 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 if (len < 2) return bad_readline();
3154 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003156
3157 /* Strip outermost quotes */
3158 while (s[len-1] <= ' ')
3159 len--;
3160 if(s[0]=='"' && s[len-1]=='"'){
3161 s[len-1] = '\0';
3162 p = s + 1 ;
3163 len -= 2;
3164 } else if(s[0]=='\'' && s[len-1]=='\''){
3165 s[len-1] = '\0';
3166 p = s + 1 ;
3167 len -= 2;
3168 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169 goto insecure;
3170 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003171
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003172 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3173 if (str) {
3174 PDATA_PUSH(self->stack, str, -1);
3175 res = 0;
3176 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 insecure:
3181 free(s);
3182 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3183 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003184}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
3186
3187static int
Tim Peterscba30e22003-02-01 06:24:36 +00003188load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003189{
3190 PyObject *py_string = 0;
3191 long l;
3192 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193
Tim Peters0bc93f52003-02-02 18:29:33 +00003194 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197
Tim Peters0bc93f52003-02-02 18:29:33 +00003198 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003199 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200
Tim Peterscba30e22003-02-01 06:24:36 +00003201 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 PDATA_PUSH(self->stack, py_string, -1);
3205 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206}
3207
3208
3209static int
Tim Peterscba30e22003-02-01 06:24:36 +00003210load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211{
3212 PyObject *py_string = 0;
3213 unsigned char l;
3214 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Tim Peters0bc93f52003-02-02 18:29:33 +00003216 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
Tim Peters0bc93f52003-02-02 18:29:33 +00003221 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 PDATA_PUSH(self->stack, py_string, -1);
3226 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003227}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003228
3229
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003230#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231static int
Tim Peterscba30e22003-02-01 06:24:36 +00003232load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233{
3234 PyObject *str = 0;
3235 int len, res = -1;
3236 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003237
Tim Peters0bc93f52003-02-02 18:29:33 +00003238 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003240
Tim Peterscba30e22003-02-01 06:24:36 +00003241 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244 PDATA_PUSH(self->stack, str, -1);
3245 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003247 finally:
3248 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003249}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003250#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003251
3252
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003253#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003254static int
Tim Peterscba30e22003-02-01 06:24:36 +00003255load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003256{
3257 PyObject *unicode;
3258 long l;
3259 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003260
Tim Peters0bc93f52003-02-02 18:29:33 +00003261 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003264
Tim Peters0bc93f52003-02-02 18:29:33 +00003265 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003266 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003267
Tim Peterscba30e22003-02-01 06:24:36 +00003268 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003269 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 PDATA_PUSH(self->stack, unicode, -1);
3272 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003273}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003274#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003275
3276
3277static int
Tim Peterscba30e22003-02-01 06:24:36 +00003278load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003279{
3280 PyObject *tup;
3281 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003283 if ((i = marker(self)) < 0) return -1;
3284 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3285 PDATA_PUSH(self->stack, tup, -1);
3286 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287}
3288
3289static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003290load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003292 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293
Tim Peters1d63c9f2003-02-02 20:29:39 +00003294 if (tup == NULL)
3295 return -1;
3296
3297 while (--len >= 0) {
3298 PyObject *element;
3299
3300 PDATA_POP(self->stack, element);
3301 if (element == NULL)
3302 return -1;
3303 PyTuple_SET_ITEM(tup, len, element);
3304 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003305 PDATA_PUSH(self->stack, tup, -1);
3306 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003307}
3308
3309static int
Tim Peterscba30e22003-02-01 06:24:36 +00003310load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003311{
3312 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003314 if (!( list=PyList_New(0))) return -1;
3315 PDATA_PUSH(self->stack, list, -1);
3316 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317}
3318
3319static int
Tim Peterscba30e22003-02-01 06:24:36 +00003320load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003321{
3322 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003324 if (!( dict=PyDict_New())) return -1;
3325 PDATA_PUSH(self->stack, dict, -1);
3326 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327}
3328
3329
3330static int
Tim Peterscba30e22003-02-01 06:24:36 +00003331load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003332{
3333 PyObject *list = 0;
3334 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 if ((i = marker(self)) < 0) return -1;
3337 if (!( list=Pdata_popList(self->stack, i))) return -1;
3338 PDATA_PUSH(self->stack, list, -1);
3339 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003340}
3341
3342static int
Tim Peterscba30e22003-02-01 06:24:36 +00003343load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344{
3345 PyObject *dict, *key, *value;
3346 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348 if ((i = marker(self)) < 0) return -1;
3349 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003351 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 for (k = i+1; k < j; k += 2) {
3354 key =self->stack->data[k-1];
3355 value=self->stack->data[k ];
3356 if (PyDict_SetItem(dict, key, value) < 0) {
3357 Py_DECREF(dict);
3358 return -1;
3359 }
3360 }
3361 Pdata_clear(self->stack, i);
3362 PDATA_PUSH(self->stack, dict, -1);
3363 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003364}
3365
3366static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003367Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003369 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371 if (PyClass_Check(cls)) {
3372 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003374 if ((l=PyObject_Size(args)) < 0) goto err;
3375 if (!( l )) {
3376 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003377
Tim Peterscba30e22003-02-01 06:24:36 +00003378 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 __getinitargs___str);
3380 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003381 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 so bypass usual construction */
3383 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003386 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387 goto err;
3388 return inst;
3389 }
3390 Py_DECREF(__getinitargs__);
3391 }
Tim Peters84e87f32001-03-17 04:50:51 +00003392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 if ((r=PyInstance_New(cls, args, NULL))) return r;
3394 else goto err;
3395 }
Tim Peters84e87f32001-03-17 04:50:51 +00003396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 if (args==Py_None) {
3398 /* Special case, call cls.__basicnew__() */
3399 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003401 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3402 if (!basicnew) return NULL;
3403 r=PyObject_CallObject(basicnew, NULL);
3404 Py_DECREF(basicnew);
3405 if (r) return r;
3406 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 err:
3411 {
3412 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 PyErr_Fetch(&tp, &v, &tb);
3415 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3416 Py_XDECREF(v);
3417 v=r;
3418 }
3419 PyErr_Restore(tp,v,tb);
3420 }
3421 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422}
Tim Peters84e87f32001-03-17 04:50:51 +00003423
Guido van Rossum60456fd1997-04-09 17:36:32 +00003424
3425static int
Tim Peterscba30e22003-02-01 06:24:36 +00003426load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427{
3428 PyObject *class, *tup, *obj=0;
3429 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003431 if ((i = marker(self)) < 0) return -1;
3432 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3433 PDATA_POP(self->stack, class);
3434 if (class) {
3435 obj = Instance_New(class, tup);
3436 Py_DECREF(class);
3437 }
3438 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 if (! obj) return -1;
3441 PDATA_PUSH(self->stack, obj, -1);
3442 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443}
3444
3445
3446static int
Tim Peterscba30e22003-02-01 06:24:36 +00003447load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448{
3449 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3450 int i, len;
3451 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003453 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003454
Tim Peters0bc93f52003-02-02 18:29:33 +00003455 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 if (len < 2) return bad_readline();
3457 module_name = PyString_FromStringAndSize(s, len - 1);
3458 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003459
Tim Peters0bc93f52003-02-02 18:29:33 +00003460 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461 if (len < 2) return bad_readline();
3462 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003463 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 self->find_class);
3465 Py_DECREF(class_name);
3466 }
3467 }
3468 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472 if ((tup=Pdata_popTuple(self->stack, i))) {
3473 obj = Instance_New(class, tup);
3474 Py_DECREF(tup);
3475 }
3476 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480 PDATA_PUSH(self->stack, obj, -1);
3481 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482}
3483
3484
3485static int
Tim Peterscba30e22003-02-01 06:24:36 +00003486load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487{
3488 PyObject *class = 0, *module_name = 0, *class_name = 0;
3489 int len;
3490 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003491
Tim Peters0bc93f52003-02-02 18:29:33 +00003492 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 if (len < 2) return bad_readline();
3494 module_name = PyString_FromStringAndSize(s, len - 1);
3495 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496
Tim Peters0bc93f52003-02-02 18:29:33 +00003497 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003498 if (len < 2) {
3499 Py_DECREF(module_name);
3500 return bad_readline();
3501 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003503 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504 self->find_class);
3505 Py_DECREF(class_name);
3506 }
3507 }
3508 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 if (! class) return -1;
3511 PDATA_PUSH(self->stack, class, -1);
3512 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003513}
3514
3515
3516static int
Tim Peterscba30e22003-02-01 06:24:36 +00003517load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518{
3519 PyObject *pid = 0;
3520 int len;
3521 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003524 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525 if (len < 2) return bad_readline();
3526
3527 pid = PyString_FromStringAndSize(s, len - 1);
3528 if (!pid) return -1;
3529
3530 if (PyList_Check(self->pers_func)) {
3531 if (PyList_Append(self->pers_func, pid) < 0) {
3532 Py_DECREF(pid);
3533 return -1;
3534 }
3535 }
3536 else {
3537 ARG_TUP(self, pid);
3538 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003539 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 NULL);
3541 FREE_ARG_TUP(self);
3542 }
3543 }
3544
3545 if (! pid) return -1;
3546
3547 PDATA_PUSH(self->stack, pid, -1);
3548 return 0;
3549 }
3550 else {
3551 PyErr_SetString(UnpicklingError,
3552 "A load persistent id instruction was encountered,\n"
3553 "but no persistent_load function was specified.");
3554 return -1;
3555 }
3556}
3557
3558static int
Tim Peterscba30e22003-02-01 06:24:36 +00003559load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560{
3561 PyObject *pid = 0;
3562
3563 if (self->pers_func) {
3564 PDATA_POP(self->stack, pid);
3565 if (! pid) return -1;
3566
3567 if (PyList_Check(self->pers_func)) {
3568 if (PyList_Append(self->pers_func, pid) < 0) {
3569 Py_DECREF(pid);
3570 return -1;
3571 }
3572 }
3573 else {
3574 ARG_TUP(self, pid);
3575 if (self->arg) {
3576 pid = PyObject_Call(self->pers_func, self->arg,
3577 NULL);
3578 FREE_ARG_TUP(self);
3579 }
3580 if (! pid) return -1;
3581 }
3582
3583 PDATA_PUSH(self->stack, pid, -1);
3584 return 0;
3585 }
3586 else {
3587 PyErr_SetString(UnpicklingError,
3588 "A load persistent id instruction was encountered,\n"
3589 "but no persistent_load function was specified.");
3590 return -1;
3591 }
3592}
3593
3594
3595static int
Tim Peterscba30e22003-02-01 06:24:36 +00003596load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597{
3598 int len;
3599
3600 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3601
3602 /* Note that we split the (pickle.py) stack into two stacks,
3603 an object stack and a mark stack. We have to be clever and
3604 pop the right one. We do this by looking at the top of the
3605 mark stack.
3606 */
3607
3608 if ((self->num_marks > 0) &&
3609 (self->marks[self->num_marks - 1] == len))
3610 self->num_marks--;
3611 else {
3612 len--;
3613 Py_DECREF(self->stack->data[len]);
3614 self->stack->length=len;
3615 }
3616
3617 return 0;
3618}
3619
3620
3621static int
Tim Peterscba30e22003-02-01 06:24:36 +00003622load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623{
3624 int i;
3625
3626 if ((i = marker(self)) < 0)
3627 return -1;
3628
3629 Pdata_clear(self->stack, i);
3630
3631 return 0;
3632}
3633
3634
3635static int
Tim Peterscba30e22003-02-01 06:24:36 +00003636load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637{
3638 PyObject *last;
3639 int len;
3640
3641 if ((len = self->stack->length) <= 0) return stackUnderflow();
3642 last=self->stack->data[len-1];
3643 Py_INCREF(last);
3644 PDATA_PUSH(self->stack, last, -1);
3645 return 0;
3646}
3647
3648
3649static int
Tim Peterscba30e22003-02-01 06:24:36 +00003650load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003651{
3652 PyObject *py_str = 0, *value = 0;
3653 int len;
3654 char *s;
3655 int rc;
3656
Tim Peters0bc93f52003-02-02 18:29:33 +00003657 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003658 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 value = PyDict_GetItem(self->memo, py_str);
3663 if (! value) {
3664 PyErr_SetObject(BadPickleGet, py_str);
3665 rc = -1;
3666 } else {
3667 PDATA_APPEND(self->stack, value, -1);
3668 rc = 0;
3669 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003671 Py_DECREF(py_str);
3672 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673}
3674
3675
3676static int
Tim Peterscba30e22003-02-01 06:24:36 +00003677load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678{
3679 PyObject *py_key = 0, *value = 0;
3680 unsigned char key;
3681 char *s;
3682 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683
Tim Peters0bc93f52003-02-02 18:29:33 +00003684 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003686 key = (unsigned char)s[0];
3687 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689 value = PyDict_GetItem(self->memo, py_key);
3690 if (! value) {
3691 PyErr_SetObject(BadPickleGet, py_key);
3692 rc = -1;
3693 } else {
3694 PDATA_APPEND(self->stack, value, -1);
3695 rc = 0;
3696 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 Py_DECREF(py_key);
3699 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003700}
3701
3702
3703static int
Tim Peterscba30e22003-02-01 06:24:36 +00003704load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705{
3706 PyObject *py_key = 0, *value = 0;
3707 unsigned char c;
3708 char *s;
3709 long key;
3710 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711
Tim Peters0bc93f52003-02-02 18:29:33 +00003712 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714 c = (unsigned char)s[0];
3715 key = (long)c;
3716 c = (unsigned char)s[1];
3717 key |= (long)c << 8;
3718 c = (unsigned char)s[2];
3719 key |= (long)c << 16;
3720 c = (unsigned char)s[3];
3721 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003723 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3724
3725 value = PyDict_GetItem(self->memo, py_key);
3726 if (! value) {
3727 PyErr_SetObject(BadPickleGet, py_key);
3728 rc = -1;
3729 } else {
3730 PDATA_APPEND(self->stack, value, -1);
3731 rc = 0;
3732 }
3733
3734 Py_DECREF(py_key);
3735 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736}
3737
3738
3739static int
Tim Peterscba30e22003-02-01 06:24:36 +00003740load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003741{
3742 PyObject *py_str = 0, *value = 0;
3743 int len, l;
3744 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003745
Tim Peters0bc93f52003-02-02 18:29:33 +00003746 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747 if (l < 2) return bad_readline();
3748 if (!( len=self->stack->length )) return stackUnderflow();
3749 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3750 value=self->stack->data[len-1];
3751 l=PyDict_SetItem(self->memo, py_str, value);
3752 Py_DECREF(py_str);
3753 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754}
3755
3756
3757static int
Tim Peterscba30e22003-02-01 06:24:36 +00003758load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003759{
3760 PyObject *py_key = 0, *value = 0;
3761 unsigned char key;
3762 char *s;
3763 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Tim Peters0bc93f52003-02-02 18:29:33 +00003765 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3771 value=self->stack->data[len-1];
3772 len=PyDict_SetItem(self->memo, py_key, value);
3773 Py_DECREF(py_key);
3774 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003775}
3776
3777
3778static int
Tim Peterscba30e22003-02-01 06:24:36 +00003779load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780{
3781 PyObject *py_key = 0, *value = 0;
3782 long key;
3783 unsigned char c;
3784 char *s;
3785 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Tim Peters0bc93f52003-02-02 18:29:33 +00003787 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003790 c = (unsigned char)s[0];
3791 key = (long)c;
3792 c = (unsigned char)s[1];
3793 key |= (long)c << 8;
3794 c = (unsigned char)s[2];
3795 key |= (long)c << 16;
3796 c = (unsigned char)s[3];
3797 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 if (!( py_key = PyInt_FromLong(key))) return -1;
3800 value=self->stack->data[len-1];
3801 len=PyDict_SetItem(self->memo, py_key, value);
3802 Py_DECREF(py_key);
3803 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804}
3805
3806
3807static int
Tim Peterscba30e22003-02-01 06:24:36 +00003808do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809{
3810 PyObject *value = 0, *list = 0, *append_method = 0;
3811 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003813 len=self->stack->length;
3814 if (!( len >= x && x > 0 )) return stackUnderflow();
3815 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003816 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820 if (PyList_Check(list)) {
3821 PyObject *slice;
3822 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 slice=Pdata_popList(self->stack, x);
3825 list_len = PyList_GET_SIZE(list);
3826 i=PyList_SetSlice(list, list_len, list_len, slice);
3827 Py_DECREF(slice);
3828 return i;
3829 }
3830 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003831
Tim Peterscba30e22003-02-01 06:24:36 +00003832 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003833 return -1;
3834
3835 for (i = x; i < len; i++) {
3836 PyObject *junk;
3837
3838 value=self->stack->data[i];
3839 junk=0;
3840 ARG_TUP(self, value);
3841 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003842 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003843 NULL);
3844 FREE_ARG_TUP(self);
3845 }
3846 if (! junk) {
3847 Pdata_clear(self->stack, i+1);
3848 self->stack->length=x;
3849 Py_DECREF(append_method);
3850 return -1;
3851 }
3852 Py_DECREF(junk);
3853 }
3854 self->stack->length=x;
3855 Py_DECREF(append_method);
3856 }
3857
3858 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859}
3860
3861
3862static int
Tim Peterscba30e22003-02-01 06:24:36 +00003863load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864{
3865 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866}
3867
3868
3869static int
Tim Peterscba30e22003-02-01 06:24:36 +00003870load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871{
3872 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873}
3874
3875
3876static int
Tim Peterscba30e22003-02-01 06:24:36 +00003877do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003878{
3879 PyObject *value = 0, *key = 0, *dict = 0;
3880 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882 if (!( (len=self->stack->length) >= x
3883 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003885 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003887 for (i = x+1; i < len; i += 2) {
3888 key =self->stack->data[i-1];
3889 value=self->stack->data[i ];
3890 if (PyObject_SetItem(dict, key, value) < 0) {
3891 r=-1;
3892 break;
3893 }
3894 }
3895
3896 Pdata_clear(self->stack, x);
3897
3898 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899}
3900
3901
Tim Peters84e87f32001-03-17 04:50:51 +00003902static int
Tim Peterscba30e22003-02-01 06:24:36 +00003903load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904{
3905 return do_setitems(self, self->stack->length - 2);
3906}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908static int
Tim Peterscba30e22003-02-01 06:24:36 +00003909load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003910{
3911 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003912}
3913
Tim Peters84e87f32001-03-17 04:50:51 +00003914
Guido van Rossum60456fd1997-04-09 17:36:32 +00003915static int
Tim Peterscba30e22003-02-01 06:24:36 +00003916load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917{
3918 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3919 *junk = 0, *__setstate__ = 0;
3920 int i, r = 0;
3921
3922 if (self->stack->length < 2) return stackUnderflow();
3923 PDATA_POP(self->stack, value);
3924 if (! value) return -1;
3925 inst=self->stack->data[self->stack->length-1];
3926
3927 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3928 ARG_TUP(self, value);
3929 if (self->arg) {
3930 junk = PyObject_Call(__setstate__, self->arg, NULL);
3931 FREE_ARG_TUP(self);
3932 }
3933 Py_DECREF(__setstate__);
3934 if (! junk) return -1;
3935 Py_DECREF(junk);
3936 return 0;
3937 }
3938
3939 PyErr_Clear();
3940 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3941 i = 0;
3942 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3943 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3944 r=-1;
3945 break;
3946 }
3947 }
3948 Py_DECREF(instdict);
3949 }
3950 else r=-1;
3951
3952 Py_XDECREF(value);
3953
3954 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955}
3956
3957
3958static int
Tim Peterscba30e22003-02-01 06:24:36 +00003959load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960{
3961 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 /* Note that we split the (pickle.py) stack into two stacks, an
3964 object stack and a mark stack. Here we push a mark onto the
3965 mark stack.
3966 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003968 if ((self->num_marks + 1) >= self->marks_size) {
3969 s=self->marks_size+20;
3970 if (s <= self->num_marks) s=self->num_marks + 1;
3971 if (self->marks == NULL)
3972 self->marks=(int *)malloc(s * sizeof(int));
3973 else
Tim Peterscba30e22003-02-01 06:24:36 +00003974 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 s * sizeof(int));
3976 if (! self->marks) {
3977 PyErr_NoMemory();
3978 return -1;
3979 }
3980 self->marks_size = s;
3981 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986}
3987
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988static int
Tim Peterscba30e22003-02-01 06:24:36 +00003989load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990{
3991 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 PDATA_POP(self->stack, arg_tup);
3994 if (! arg_tup) return -1;
3995 PDATA_POP(self->stack, callable);
3996 if (callable) {
3997 ob = Instance_New(callable, arg_tup);
3998 Py_DECREF(callable);
3999 }
4000 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 PDATA_PUSH(self->stack, ob, -1);
4005 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004006}
Tim Peters84e87f32001-03-17 04:50:51 +00004007
Tim Peters4190fb82003-02-02 16:09:05 +00004008/* Just raises an error if we don't know the protocol specified. PROTO
4009 * is the first opcode for protocols >= 2.
4010 */
4011static int
4012load_proto(Unpicklerobject *self)
4013{
4014 int i;
4015 char *protobyte;
4016
4017 i = self->read_func(self, &protobyte, 1);
4018 if (i < 0)
4019 return -1;
4020
4021 i = calc_binint(protobyte, 1);
4022 /* No point checking for < 0, since calc_binint returns an unsigned
4023 * int when chewing on 1 byte.
4024 */
4025 assert(i >= 0);
4026 if (i <= CURRENT_PROTOCOL_NUMBER)
4027 return 0;
4028
4029 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4030 return -1;
4031}
4032
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004034load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035{
4036 PyObject *err = 0, *val = 0;
4037 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 self->num_marks = 0;
4040 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004043 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 switch (s[0]) {
4047 case NONE:
4048 if (load_none(self) < 0)
4049 break;
4050 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 case BININT:
4053 if (load_binint(self) < 0)
4054 break;
4055 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 case BININT1:
4058 if (load_binint1(self) < 0)
4059 break;
4060 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 case BININT2:
4063 if (load_binint2(self) < 0)
4064 break;
4065 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 case INT:
4068 if (load_int(self) < 0)
4069 break;
4070 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 case LONG:
4073 if (load_long(self) < 0)
4074 break;
4075 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004076
Tim Petersee1a53c2003-02-02 02:57:53 +00004077 case LONG1:
4078 if (load_counted_long(self, 1) < 0)
4079 break;
4080 continue;
4081
4082 case LONG4:
4083 if (load_counted_long(self, 4) < 0)
4084 break;
4085 continue;
4086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 case FLOAT:
4088 if (load_float(self) < 0)
4089 break;
4090 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 case BINFLOAT:
4093 if (load_binfloat(self) < 0)
4094 break;
4095 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 case BINSTRING:
4098 if (load_binstring(self) < 0)
4099 break;
4100 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004102 case SHORT_BINSTRING:
4103 if (load_short_binstring(self) < 0)
4104 break;
4105 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 case STRING:
4108 if (load_string(self) < 0)
4109 break;
4110 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004111
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004112#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113 case UNICODE:
4114 if (load_unicode(self) < 0)
4115 break;
4116 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 case BINUNICODE:
4119 if (load_binunicode(self) < 0)
4120 break;
4121 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004122#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004125 if (load_counted_tuple(self, 0) < 0)
4126 break;
4127 continue;
4128
4129 case TUPLE1:
4130 if (load_counted_tuple(self, 1) < 0)
4131 break;
4132 continue;
4133
4134 case TUPLE2:
4135 if (load_counted_tuple(self, 2) < 0)
4136 break;
4137 continue;
4138
4139 case TUPLE3:
4140 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 break;
4142 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144 case TUPLE:
4145 if (load_tuple(self) < 0)
4146 break;
4147 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 case EMPTY_LIST:
4150 if (load_empty_list(self) < 0)
4151 break;
4152 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 case LIST:
4155 if (load_list(self) < 0)
4156 break;
4157 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 case EMPTY_DICT:
4160 if (load_empty_dict(self) < 0)
4161 break;
4162 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 case DICT:
4165 if (load_dict(self) < 0)
4166 break;
4167 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 case OBJ:
4170 if (load_obj(self) < 0)
4171 break;
4172 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 case INST:
4175 if (load_inst(self) < 0)
4176 break;
4177 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 case GLOBAL:
4180 if (load_global(self) < 0)
4181 break;
4182 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case APPEND:
4185 if (load_append(self) < 0)
4186 break;
4187 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case APPENDS:
4190 if (load_appends(self) < 0)
4191 break;
4192 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case BUILD:
4195 if (load_build(self) < 0)
4196 break;
4197 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case DUP:
4200 if (load_dup(self) < 0)
4201 break;
4202 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 case BINGET:
4205 if (load_binget(self) < 0)
4206 break;
4207 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 case LONG_BINGET:
4210 if (load_long_binget(self) < 0)
4211 break;
4212 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case GET:
4215 if (load_get(self) < 0)
4216 break;
4217 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case MARK:
4220 if (load_mark(self) < 0)
4221 break;
4222 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 case BINPUT:
4225 if (load_binput(self) < 0)
4226 break;
4227 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 case LONG_BINPUT:
4230 if (load_long_binput(self) < 0)
4231 break;
4232 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 case PUT:
4235 if (load_put(self) < 0)
4236 break;
4237 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 case POP:
4240 if (load_pop(self) < 0)
4241 break;
4242 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244 case POP_MARK:
4245 if (load_pop_mark(self) < 0)
4246 break;
4247 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004249 case SETITEM:
4250 if (load_setitem(self) < 0)
4251 break;
4252 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 case SETITEMS:
4255 if (load_setitems(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 STOP:
4260 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 case PERSID:
4263 if (load_persid(self) < 0)
4264 break;
4265 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 case BINPERSID:
4268 if (load_binpersid(self) < 0)
4269 break;
4270 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 case REDUCE:
4273 if (load_reduce(self) < 0)
4274 break;
4275 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276
Tim Peters4190fb82003-02-02 16:09:05 +00004277 case PROTO:
4278 if (load_proto(self) < 0)
4279 break;
4280 continue;
4281
Tim Peters3c67d792003-02-02 17:59:11 +00004282 case NEWTRUE:
4283 if (load_bool(self, Py_True) < 0)
4284 break;
4285 continue;
4286
4287 case NEWFALSE:
4288 if (load_bool(self, Py_False) < 0)
4289 break;
4290 continue;
4291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 case '\0':
4293 /* end of file */
4294 PyErr_SetNone(PyExc_EOFError);
4295 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004297 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004298 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 "invalid load key, '%s'.",
4300 "c", s[0]);
4301 return NULL;
4302 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 break;
4305 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004307 if ((err = PyErr_Occurred())) {
4308 if (err == PyExc_EOFError) {
4309 PyErr_SetNone(PyExc_EOFError);
4310 }
4311 return NULL;
4312 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 PDATA_POP(self->stack, val);
4315 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316}
Tim Peters84e87f32001-03-17 04:50:51 +00004317
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004319/* No-load functions to support noload, which is used to
4320 find persistent references. */
4321
4322static int
Tim Peterscba30e22003-02-01 06:24:36 +00004323noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324{
4325 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 if ((i = marker(self)) < 0) return -1;
4328 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004329}
4330
4331
4332static int
Tim Peterscba30e22003-02-01 06:24:36 +00004333noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334{
4335 int i;
4336 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 if ((i = marker(self)) < 0) return -1;
4339 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004340 if (self->readline_func(self, &s) < 0) return -1;
4341 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 PDATA_APPEND(self->stack, Py_None,-1);
4343 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004344}
4345
4346static int
Tim Peterscba30e22003-02-01 06:24:36 +00004347noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348{
4349 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004350
Tim Peters0bc93f52003-02-02 18:29:33 +00004351 if (self->readline_func(self, &s) < 0) return -1;
4352 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 PDATA_APPEND(self->stack, Py_None,-1);
4354 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004355}
4356
4357static int
Tim Peterscba30e22003-02-01 06:24:36 +00004358noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 if (self->stack->length < 2) return stackUnderflow();
4362 Pdata_clear(self->stack, self->stack->length-2);
4363 PDATA_APPEND(self->stack, Py_None,-1);
4364 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004365}
4366
4367static int
4368noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004369
Guido van Rossum053b8df1998-11-25 16:18:00 +00004370 if (self->stack->length < 1) return stackUnderflow();
4371 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004372 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004373}
4374
4375
4376static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004377noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378{
4379 PyObject *err = 0, *val = 0;
4380 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 self->num_marks = 0;
4383 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004386 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 switch (s[0]) {
4390 case NONE:
4391 if (load_none(self) < 0)
4392 break;
4393 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 case BININT:
4396 if (load_binint(self) < 0)
4397 break;
4398 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 case BININT1:
4401 if (load_binint1(self) < 0)
4402 break;
4403 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 case BININT2:
4406 if (load_binint2(self) < 0)
4407 break;
4408 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410 case INT:
4411 if (load_int(self) < 0)
4412 break;
4413 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 case LONG:
4416 if (load_long(self) < 0)
4417 break;
4418 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004419
Tim Peters4190fb82003-02-02 16:09:05 +00004420 case LONG1:
4421 if (load_counted_long(self, 1) < 0)
4422 break;
4423 continue;
4424
4425 case LONG4:
4426 if (load_counted_long(self, 4) < 0)
4427 break;
4428 continue;
4429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004430 case FLOAT:
4431 if (load_float(self) < 0)
4432 break;
4433 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435 case BINFLOAT:
4436 if (load_binfloat(self) < 0)
4437 break;
4438 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 case BINSTRING:
4441 if (load_binstring(self) < 0)
4442 break;
4443 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 case SHORT_BINSTRING:
4446 if (load_short_binstring(self) < 0)
4447 break;
4448 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 case STRING:
4451 if (load_string(self) < 0)
4452 break;
4453 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004454
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004455#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 case UNICODE:
4457 if (load_unicode(self) < 0)
4458 break;
4459 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 case BINUNICODE:
4462 if (load_binunicode(self) < 0)
4463 break;
4464 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004465#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004468 if (load_counted_tuple(self, 0) < 0)
4469 break;
4470 continue;
4471
4472 case TUPLE1:
4473 if (load_counted_tuple(self, 1) < 0)
4474 break;
4475 continue;
4476
4477 case TUPLE2:
4478 if (load_counted_tuple(self, 2) < 0)
4479 break;
4480 continue;
4481
4482 case TUPLE3:
4483 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 break;
4485 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004487 case TUPLE:
4488 if (load_tuple(self) < 0)
4489 break;
4490 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 case EMPTY_LIST:
4493 if (load_empty_list(self) < 0)
4494 break;
4495 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 case LIST:
4498 if (load_list(self) < 0)
4499 break;
4500 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 case EMPTY_DICT:
4503 if (load_empty_dict(self) < 0)
4504 break;
4505 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 case DICT:
4508 if (load_dict(self) < 0)
4509 break;
4510 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 case OBJ:
4513 if (noload_obj(self) < 0)
4514 break;
4515 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 case INST:
4518 if (noload_inst(self) < 0)
4519 break;
4520 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 case GLOBAL:
4523 if (noload_global(self) < 0)
4524 break;
4525 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 case APPEND:
4528 if (load_append(self) < 0)
4529 break;
4530 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 case APPENDS:
4533 if (load_appends(self) < 0)
4534 break;
4535 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 case BUILD:
4538 if (noload_build(self) < 0)
4539 break;
4540 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 case DUP:
4543 if (load_dup(self) < 0)
4544 break;
4545 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 case BINGET:
4548 if (load_binget(self) < 0)
4549 break;
4550 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 case LONG_BINGET:
4553 if (load_long_binget(self) < 0)
4554 break;
4555 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 case GET:
4558 if (load_get(self) < 0)
4559 break;
4560 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 case MARK:
4563 if (load_mark(self) < 0)
4564 break;
4565 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 case BINPUT:
4568 if (load_binput(self) < 0)
4569 break;
4570 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 case LONG_BINPUT:
4573 if (load_long_binput(self) < 0)
4574 break;
4575 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 case PUT:
4578 if (load_put(self) < 0)
4579 break;
4580 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 case POP:
4583 if (load_pop(self) < 0)
4584 break;
4585 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 case POP_MARK:
4588 if (load_pop_mark(self) < 0)
4589 break;
4590 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 case SETITEM:
4593 if (load_setitem(self) < 0)
4594 break;
4595 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 case SETITEMS:
4598 if (load_setitems(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 STOP:
4603 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 case PERSID:
4606 if (load_persid(self) < 0)
4607 break;
4608 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004610 case BINPERSID:
4611 if (load_binpersid(self) < 0)
4612 break;
4613 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615 case REDUCE:
4616 if (noload_reduce(self) < 0)
4617 break;
4618 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004619
Tim Peters4190fb82003-02-02 16:09:05 +00004620 case PROTO:
4621 if (load_proto(self) < 0)
4622 break;
4623 continue;
4624
Tim Peters3c67d792003-02-02 17:59:11 +00004625 case NEWTRUE:
4626 if (load_bool(self, Py_True) < 0)
4627 break;
4628 continue;
4629
4630 case NEWFALSE:
4631 if (load_bool(self, Py_False) < 0)
4632 break;
4633 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004635 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004636 "invalid load key, '%s'.",
4637 "c", s[0]);
4638 return NULL;
4639 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 break;
4642 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644 if ((err = PyErr_Occurred())) {
4645 if (err == PyExc_EOFError) {
4646 PyErr_SetNone(PyExc_EOFError);
4647 }
4648 return NULL;
4649 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651 PDATA_POP(self->stack, val);
4652 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653}
Tim Peters84e87f32001-03-17 04:50:51 +00004654
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655
Guido van Rossum60456fd1997-04-09 17:36:32 +00004656static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004657Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658{
Tim Peterscba30e22003-02-01 06:24:36 +00004659 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004662 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004663}
4664
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004665static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004666Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667{
Tim Peterscba30e22003-02-01 06:24:36 +00004668 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004672}
4673
Guido van Rossum60456fd1997-04-09 17:36:32 +00004674
4675static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004676 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004677 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004678 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004679 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004680 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004681 "noload() -- not load a pickle, but go through most of the motions\n"
4682 "\n"
4683 "This function can be used to read past a pickle without instantiating\n"
4684 "any objects or importing any modules. It can also be used to find all\n"
4685 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004686 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004687 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004688 {NULL, NULL} /* sentinel */
4689};
4690
4691
4692static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004693newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694{
4695 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696
Tim Peterscba30e22003-02-01 06:24:36 +00004697 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 self->file = NULL;
4701 self->arg = NULL;
4702 self->stack = (Pdata*)Pdata_New();
4703 self->pers_func = NULL;
4704 self->last_string = NULL;
4705 self->marks = NULL;
4706 self->num_marks = 0;
4707 self->marks_size = 0;
4708 self->buf_size = 0;
4709 self->read = NULL;
4710 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712
Tim Peterscba30e22003-02-01 06:24:36 +00004713 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 Py_INCREF(f);
4717 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 /* Set read, readline based on type of f */
4720 if (PyFile_Check(f)) {
4721 self->fp = PyFile_AsFile(f);
4722 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004723 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 "I/O operation on closed file");
4725 goto err;
4726 }
4727 self->read_func = read_file;
4728 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004729 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 else if (PycStringIO_InputCheck(f)) {
4731 self->fp = NULL;
4732 self->read_func = read_cStringIO;
4733 self->readline_func = readline_cStringIO;
4734 }
4735 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 self->fp = NULL;
4738 self->read_func = read_other;
4739 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4742 (self->read = PyObject_GetAttr(f, read_str)))) {
4743 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004744 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 "argument must have 'read' and "
4746 "'readline' attributes" );
4747 goto err;
4748 }
4749 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 err:
4754 Py_DECREF((PyObject *)self);
4755 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004756}
4757
4758
4759static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004760get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761{
4762 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004763
Tim Peterscba30e22003-02-01 06:24:36 +00004764 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 return NULL;
4766 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004767}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004768
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004769
Guido van Rossum60456fd1997-04-09 17:36:32 +00004770static void
Tim Peterscba30e22003-02-01 06:24:36 +00004771Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772{
4773 Py_XDECREF(self->readline);
4774 Py_XDECREF(self->read);
4775 Py_XDECREF(self->file);
4776 Py_XDECREF(self->memo);
4777 Py_XDECREF(self->stack);
4778 Py_XDECREF(self->pers_func);
4779 Py_XDECREF(self->arg);
4780 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 if (self->marks) {
4783 free(self->marks);
4784 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 if (self->buf_size) {
4787 free(self->buf);
4788 }
Tim Peters84e87f32001-03-17 04:50:51 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004791}
4792
4793
4794static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004795Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796{
4797 if (!strcmp(name, "persistent_load")) {
4798 if (!self->pers_func) {
4799 PyErr_SetString(PyExc_AttributeError, name);
4800 return NULL;
4801 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 Py_INCREF(self->pers_func);
4804 return self->pers_func;
4805 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 if (!strcmp(name, "find_global")) {
4808 if (!self->find_class) {
4809 PyErr_SetString(PyExc_AttributeError, name);
4810 return NULL;
4811 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 Py_INCREF(self->find_class);
4814 return self->find_class;
4815 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 if (!strcmp(name, "memo")) {
4818 if (!self->memo) {
4819 PyErr_SetString(PyExc_AttributeError, name);
4820 return NULL;
4821 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 Py_INCREF(self->memo);
4824 return self->memo;
4825 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 if (!strcmp(name, "UnpicklingError")) {
4828 Py_INCREF(UnpicklingError);
4829 return UnpicklingError;
4830 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004833}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004834
Guido van Rossum60456fd1997-04-09 17:36:32 +00004835
4836static int
Tim Peterscba30e22003-02-01 06:24:36 +00004837Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004840 if (!strcmp(name, "persistent_load")) {
4841 Py_XDECREF(self->pers_func);
4842 self->pers_func = value;
4843 Py_XINCREF(value);
4844 return 0;
4845 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004847 if (!strcmp(name, "find_global")) {
4848 Py_XDECREF(self->find_class);
4849 self->find_class = value;
4850 Py_XINCREF(value);
4851 return 0;
4852 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 if (! value) {
4855 PyErr_SetString(PyExc_TypeError,
4856 "attribute deletion is not supported");
4857 return -1;
4858 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004860 if (strcmp(name, "memo") == 0) {
4861 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004862 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004863 "memo must be a dictionary");
4864 return -1;
4865 }
4866 Py_XDECREF(self->memo);
4867 self->memo = value;
4868 Py_INCREF(value);
4869 return 0;
4870 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 PyErr_SetString(PyExc_AttributeError, name);
4873 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004874}
4875
Tim Peters5bd2a792003-02-01 16:45:06 +00004876/* ---------------------------------------------------------------------------
4877 * Module-level functions.
4878 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004879
Tim Peters5bd2a792003-02-01 16:45:06 +00004880/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004881static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004882cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883{
4884 PyObject *ob, *file, *res = NULL;
4885 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004886 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004887
Tim Peters5bd2a792003-02-01 16:45:06 +00004888 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004890
Tim Peters5bd2a792003-02-01 16:45:06 +00004891 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004894 if (dump(pickler, ob) < 0)
4895 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 Py_INCREF(Py_None);
4898 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004900 finally:
4901 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004903 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004904}
4905
4906
Tim Peters5bd2a792003-02-01 16:45:06 +00004907/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004908static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004909cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910{
4911 PyObject *ob, *file = 0, *res = NULL;
4912 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004913 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004914
Tim Peters5bd2a792003-02-01 16:45:06 +00004915 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004917
Tim Peterscba30e22003-02-01 06:24:36 +00004918 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004920
Tim Peters5bd2a792003-02-01 16:45:06 +00004921 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004924 if (dump(pickler, ob) < 0)
4925 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004927 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004929 finally:
4930 Py_XDECREF(pickler);
4931 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004934}
4935
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004936
Tim Peters5bd2a792003-02-01 16:45:06 +00004937/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004938static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004939cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004940{
4941 Unpicklerobject *unpickler = 0;
4942 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004943
Tim Peterscba30e22003-02-01 06:24:36 +00004944 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004945 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004946
Tim Peterscba30e22003-02-01 06:24:36 +00004947 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004950 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 finally:
4953 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004956}
4957
4958
Tim Peters5bd2a792003-02-01 16:45:06 +00004959/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004960static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004961cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962{
4963 PyObject *ob, *file = 0, *res = NULL;
4964 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004965
Tim Peterscba30e22003-02-01 06:24:36 +00004966 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004968
Tim Peterscba30e22003-02-01 06:24:36 +00004969 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004971
Tim Peterscba30e22003-02-01 06:24:36 +00004972 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004975 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004977 finally:
4978 Py_XDECREF(file);
4979 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004982}
4983
4984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004985PyDoc_STRVAR(Unpicklertype__doc__,
4986"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004987
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004988static PyTypeObject Unpicklertype = {
4989 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004990 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004991 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004992 sizeof(Unpicklerobject), /*tp_basicsize*/
4993 0, /*tp_itemsize*/
4994 /* methods */
4995 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4996 (printfunc)0, /*tp_print*/
4997 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4998 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4999 (cmpfunc)0, /*tp_compare*/
5000 (reprfunc)0, /*tp_repr*/
5001 0, /*tp_as_number*/
5002 0, /*tp_as_sequence*/
5003 0, /*tp_as_mapping*/
5004 (hashfunc)0, /*tp_hash*/
5005 (ternaryfunc)0, /*tp_call*/
5006 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005007
Guido van Rossum60456fd1997-04-09 17:36:32 +00005008 /* Space for future expansion */
5009 0L,0L,0L,0L,
5010 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005011};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005012
Guido van Rossum60456fd1997-04-09 17:36:32 +00005013static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005014 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005015 PyDoc_STR("dump(object, file, proto=0) -- "
5016 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005017 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005018 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005019 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005020
Neal Norwitzb0493252002-03-31 14:44:22 +00005021 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005022 PyDoc_STR("dumps(object, proto=0) -- "
5023 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005024 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005025 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005026 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005027
Neal Norwitzb0493252002-03-31 14:44:22 +00005028 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005029 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005030
Neal Norwitzb0493252002-03-31 14:44:22 +00005031 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005032 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005033
Neal Norwitzb0493252002-03-31 14:44:22 +00005034 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005035 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005036 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005037 "This takes a file-like object for writing a pickle data stream.\n"
5038 "The optional proto argument tells the pickler to use the given\n"
5039 "protocol; supported protocols are 0, 1, 2. The default\n"
5040 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5041 "only protocol that can be written to a file opened in text\n"
5042 "mode and read back successfully. When using a protocol higher\n"
5043 "than 0, make sure the file is opened in binary mode, both when\n"
5044 "pickling and unpickling.)\n"
5045 "\n"
5046 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5047 "more efficient than protocol 1.\n"
5048 "\n"
5049 "Specifying a negative protocol version selects the highest\n"
5050 "protocol version supported. The higher the protocol used, the\n"
5051 "more recent the version of Python needed to read the pickle\n"
5052 "produced.\n"
5053 "\n"
5054 "The file parameter must have a write() method that accepts a single\n"
5055 "string argument. It can thus be an open file object, a StringIO\n"
5056 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005057 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005058
Neal Norwitzb0493252002-03-31 14:44:22 +00005059 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005060 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5061
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005062 { NULL, NULL }
5063};
5064
Guido van Rossum60456fd1997-04-09 17:36:32 +00005065static int
Tim Peterscba30e22003-02-01 06:24:36 +00005066init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067{
5068 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005069
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005070#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 INIT_STR(__class__);
5073 INIT_STR(__getinitargs__);
5074 INIT_STR(__dict__);
5075 INIT_STR(__getstate__);
5076 INIT_STR(__setstate__);
5077 INIT_STR(__name__);
5078 INIT_STR(__main__);
5079 INIT_STR(__reduce__);
5080 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 INIT_STR(append);
5082 INIT_STR(read);
5083 INIT_STR(readline);
5084 INIT_STR(copy_reg);
5085 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005087
Tim Peterscba30e22003-02-01 06:24:36 +00005088 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005090
Tim Peters1f1b2d22003-02-01 02:16:37 +00005091 /* This is special because we want to use a different
5092 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005093 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00005094 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005097 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005098
Tim Peterscba30e22003-02-01 06:24:36 +00005099 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005102 /* Ugh */
5103 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5104 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5105 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 if (!( t=PyDict_New())) return -1;
5108 if (!( r=PyRun_String(
5109 "def __init__(self, *args): self.args=args\n\n"
5110 "def __str__(self):\n"
5111 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5112 Py_file_input,
5113 module_dict, t) )) return -1;
5114 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005116 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005117 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005118 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005120 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005121
Tim Peterscba30e22003-02-01 06:24:36 +00005122 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005123 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005124 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005127 if (!( t=PyDict_New())) return -1;
5128 if (!( r=PyRun_String(
5129 "def __init__(self, *args): self.args=args\n\n"
5130 "def __str__(self):\n"
5131 " a=self.args\n"
5132 " a=a and type(a[0]) or '(what)'\n"
5133 " return 'Cannot pickle %s objects' % a\n"
5134 , Py_file_input,
5135 module_dict, t) )) return -1;
5136 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005139 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005140 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005142 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005145 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005146 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005147
Martin v. Löwis658009a2002-09-16 17:26:24 +00005148 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5149 UnpicklingError, NULL)))
5150 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 if (PyDict_SetItemString(module_dict, "PickleError",
5153 PickleError) < 0)
5154 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005156 if (PyDict_SetItemString(module_dict, "PicklingError",
5157 PicklingError) < 0)
5158 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005160 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5161 UnpicklingError) < 0)
5162 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005164 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5165 UnpickleableError) < 0)
5166 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5169 BadPickleGet) < 0)
5170 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005172 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005175}
5176
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005177#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5178#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005179#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005180PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005181initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005182{
5183 PyObject *m, *d, *di, *v, *k;
5184 int i;
5185 char *rev="1.71";
5186 PyObject *format_version;
5187 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005189 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005190 Unpicklertype.ob_type = &PyType_Type;
5191 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005193 /* Initialize some pieces. We need to do this before module creation,
5194 so we're forced to use a temporary dictionary. :(
5195 */
5196 di=PyDict_New();
5197 if (!di) return;
5198 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 /* Create the module and add the functions */
5201 m = Py_InitModule4("cPickle", cPickle_methods,
5202 cPickle_module_documentation,
5203 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005205 /* Add some symbolic constants to the module */
5206 d = PyModule_GetDict(m);
5207 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5208 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005210 /* Copy data from di. Waaa. */
5211 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5212 if (PyObject_SetItem(d, k, v) < 0) {
5213 Py_DECREF(di);
5214 return;
5215 }
5216 }
5217 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 format_version = PyString_FromString("1.3");
5220 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005222 PyDict_SetItemString(d, "format_version", format_version);
5223 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5224 Py_XDECREF(format_version);
5225 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005226}