blob: 10f65d674d2a243697ff238774f6a227030bfb40 [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
Guido van Rossumd385d591997-04-09 17:47:47 +0000363static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000364PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000365cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
366{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000367 va_list va;
368 PyObject *args=0, *retval=0;
369 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000371 if (format) args = Py_VaBuildValue(format, va);
372 va_end(va);
373 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000374 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000375 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000377 if (retval) {
378 if (args) {
379 PyObject *v;
380 v=PyString_Format(retval, args);
381 Py_DECREF(retval);
382 Py_DECREF(args);
383 if (! v) return NULL;
384 retval=v;
385 }
386 }
387 else
388 if (args) retval=args;
389 else {
390 PyErr_SetObject(ErrType,Py_None);
391 return NULL;
392 }
393 PyErr_SetObject(ErrType,retval);
394 Py_DECREF(retval);
395 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000396}
397
Tim Peters84e87f32001-03-17 04:50:51 +0000398static int
Tim Peterscba30e22003-02-01 06:24:36 +0000399write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000400{
401 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000403 if (s == NULL) {
404 return 0;
405 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000407 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000408 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000409 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000410 if (nbyteswritten != (size_t)n) {
411 PyErr_SetFromErrno(PyExc_IOError);
412 return -1;
413 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000415 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Tim Peterscba30e22003-02-01 06:24:36 +0000419write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420{
421 if (s == NULL) {
422 return 0;
423 }
Tim Peterscba30e22003-02-01 06:24:36 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
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_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434{
435 if (s == NULL) return 0;
436 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000437}
438
Tim Peters84e87f32001-03-17 04:50:51 +0000439static int
Tim Peterscba30e22003-02-01 06:24:36 +0000440write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000441{
442 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444 if (s == NULL) {
445 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000446 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000448 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000449 return -1;
450 }
451 else {
452 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
453 if (write_other(self, NULL, 0) < 0)
454 return -1;
455 }
Tim Peterscba30e22003-02-01 06:24:36 +0000456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000457 if (n > WRITE_BUF_SIZE) {
458 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000459 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000460 return -1;
461 }
462 else {
463 memcpy(self->write_buf + self->buf_size, s, n);
464 self->buf_size += n;
465 return n;
466 }
467 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469 if (self->write) {
470 /* object with write method */
471 ARG_TUP(self, py_str);
472 if (self->arg) {
473 junk = PyObject_Call(self->write, self->arg, NULL);
474 FREE_ARG_TUP(self);
475 }
476 if (junk) Py_DECREF(junk);
477 else return -1;
478 }
479 else
480 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000482 self->buf_size = 0;
483 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000484}
485
486
Tim Peters84e87f32001-03-17 04:50:51 +0000487static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000488read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489{
490 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 if (self->buf_size == 0) {
493 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000495 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000496 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000497 PyErr_NoMemory();
498 return -1;
499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 self->buf_size = size;
502 }
503 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000504 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505 if (!self->buf) {
506 PyErr_NoMemory();
507 return -1;
508 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509 self->buf_size = n;
510 }
Tim Peters84e87f32001-03-17 04:50:51 +0000511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512 Py_BEGIN_ALLOW_THREADS
513 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
514 Py_END_ALLOW_THREADS
515 if (nbytesread != (size_t)n) {
516 if (feof(self->fp)) {
517 PyErr_SetNone(PyExc_EOFError);
518 return -1;
519 }
Tim Peterscba30e22003-02-01 06:24:36 +0000520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521 PyErr_SetFromErrno(PyExc_IOError);
522 return -1;
523 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000528}
529
530
Tim Peters84e87f32001-03-17 04:50:51 +0000531static int
Tim Peterscba30e22003-02-01 06:24:36 +0000532readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533{
534 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000536 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000537 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 self->buf_size = 40;
542 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000544 i = 0;
545 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000546 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000548 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000549 (self->buf[i] = getc(self->fp)) == '\n') {
550 self->buf[i + 1] = '\0';
551 *s = self->buf;
552 return i + 1;
553 }
554 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000555 bigger = self->buf_size << 1;
556 if (bigger <= 0) { /* overflow */
557 PyErr_NoMemory();
558 return -1;
559 }
560 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 if (!self->buf) {
562 PyErr_NoMemory();
563 return -1;
564 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000565 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 }
Tim Peters84e87f32001-03-17 04:50:51 +0000567}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000568
569
Tim Peters84e87f32001-03-17 04:50:51 +0000570static int
Tim Peterscba30e22003-02-01 06:24:36 +0000571read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000572{
573 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
576 PyErr_SetNone(PyExc_EOFError);
577 return -1;
578 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000583}
584
585
Tim Peters84e87f32001-03-17 04:50:51 +0000586static int
Tim Peterscba30e22003-02-01 06:24:36 +0000587readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588{
589 int n;
590 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000592 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
593 return -1;
594 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000599}
600
601
Tim Peters84e87f32001-03-17 04:50:51 +0000602static int
Tim Peterscba30e22003-02-01 06:24:36 +0000603read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604{
605 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 ARG_TUP(self, bytes);
610 if (self->arg) {
611 str = PyObject_Call(self->read, self->arg, NULL);
612 FREE_ARG_TUP(self);
613 }
614 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 Py_XDECREF(self->last_string);
617 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619 if (! (*s = PyString_AsString(str))) return -1;
620 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621}
622
623
Tim Peters84e87f32001-03-17 04:50:51 +0000624static int
Tim Peterscba30e22003-02-01 06:24:36 +0000625readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000626{
627 PyObject *str;
628 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
631 return -1;
632 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634 if ((str_size = PyString_Size(str)) < 0)
635 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 Py_XDECREF(self->last_string);
638 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640 if (! (*s = PyString_AsString(str)))
641 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000644}
645
Tim Petersee1a53c2003-02-02 02:57:53 +0000646/* Copy the first n bytes from s into newly malloc'ed memory, plus a
647 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
648 * The caller is responsible for free()'ing the return value.
649 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000651pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000652{
Tim Petersee1a53c2003-02-02 02:57:53 +0000653 char *r = (char *)malloc(n+1);
654 if (r == NULL)
655 return (char*)PyErr_NoMemory();
656 memcpy(r, s, n);
657 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659}
660
661
662static int
Tim Peterscba30e22003-02-01 06:24:36 +0000663get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000664{
665 PyObject *value, *mv;
666 long c_value;
667 char s[30];
668 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000670 if (!( mv = PyDict_GetItem(self->memo, id))) {
671 PyErr_SetObject(PyExc_KeyError, id);
672 return -1;
673 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Tim Peterscba30e22003-02-01 06:24:36 +0000675 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000676 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 if (!( PyInt_Check(value))) {
679 PyErr_SetString(PicklingError, "no int where int expected in memo");
680 return -1;
681 }
682 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684 if (!self->bin) {
685 s[0] = GET;
686 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
687 len = strlen(s);
688 }
689 else if (Pdata_Check(self->file)) {
690 if (write_other(self, NULL, 0) < 0) return -1;
691 PDATA_APPEND(self->file, mv, -1);
692 return 0;
693 }
694 else {
695 if (c_value < 256) {
696 s[0] = BINGET;
697 s[1] = (int)(c_value & 0xff);
698 len = 2;
699 }
700 else {
701 s[0] = LONG_BINGET;
702 s[1] = (int)(c_value & 0xff);
703 s[2] = (int)((c_value >> 8) & 0xff);
704 s[3] = (int)((c_value >> 16) & 0xff);
705 s[4] = (int)((c_value >> 24) & 0xff);
706 len = 5;
707 }
708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Tim Peters0bc93f52003-02-02 18:29:33 +0000710 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000712
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000713 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000714}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000715
Guido van Rossum60456fd1997-04-09 17:36:32 +0000716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000717static int
Tim Peterscba30e22003-02-01 06:24:36 +0000718put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719{
Tim Peterscba30e22003-02-01 06:24:36 +0000720 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000723 return put2(self, ob);
724}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000725
Guido van Rossum053b8df1998-11-25 16:18:00 +0000726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000727static int
Tim Peterscba30e22003-02-01 06:24:36 +0000728put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000729{
730 char c_str[30];
731 int p;
732 size_t len;
733 int res = -1;
734 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 if (self->fast)
737 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000739 if ((p = PyDict_Size(self->memo)) < 0)
740 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000742 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000743 /* XXX Why?
744 * XXX And does "positive" really mean non-negative?
745 * XXX pickle.py starts with PUT index 0, not 1. This makes for
746 * XXX gratuitous differences between the pickling modules.
747 */
Tim Peterscba30e22003-02-01 06:24:36 +0000748 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000749
Tim Peterscba30e22003-02-01 06:24:36 +0000750 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000752
Tim Peterscba30e22003-02-01 06:24:36 +0000753 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000755
Tim Peterscba30e22003-02-01 06:24:36 +0000756 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 PyTuple_SET_ITEM(t, 0, memo_len);
760 Py_INCREF(memo_len);
761 PyTuple_SET_ITEM(t, 1, ob);
762 Py_INCREF(ob);
763
764 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
765 goto finally;
766
767 if (!self->bin) {
768 c_str[0] = PUT;
769 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
770 len = strlen(c_str);
771 }
772 else if (Pdata_Check(self->file)) {
773 if (write_other(self, NULL, 0) < 0) return -1;
774 PDATA_APPEND(self->file, memo_len, -1);
775 res=0; /* Job well done ;) */
776 goto finally;
777 }
778 else {
779 if (p >= 256) {
780 c_str[0] = LONG_BINPUT;
781 c_str[1] = (int)(p & 0xff);
782 c_str[2] = (int)((p >> 8) & 0xff);
783 c_str[3] = (int)((p >> 16) & 0xff);
784 c_str[4] = (int)((p >> 24) & 0xff);
785 len = 5;
786 }
787 else {
788 c_str[0] = BINPUT;
789 c_str[1] = p;
790 len = 2;
791 }
792 }
793
Tim Peters0bc93f52003-02-02 18:29:33 +0000794 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 goto finally;
796
797 res = 0;
798
799 finally:
800 Py_XDECREF(py_ob_id);
801 Py_XDECREF(memo_len);
802 Py_XDECREF(t);
803
804 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000805}
806
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000807#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000808
809static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000810PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000811{
812 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
813 static PyObject *standard_builtins=0;
814 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000817 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000818 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000819 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000820 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000821 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 return NULL;
823 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825 if ((globals=PyEval_GetGlobals())) {
826 Py_INCREF(globals);
827 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000828 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000829 goto err;
830 }
831 else {
832 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000835 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000836 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 __builtins__=standard_builtins;
839 Py_INCREF(__builtins__);
840 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000841 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 goto err;
843 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 if (PyDict_Check(__builtins__)) {
846 __import__=PyObject_GetItem(__builtins__,__import___str);
847 if (!__import__) goto err;
848 }
849 else {
850 __import__=PyObject_GetAttr(__builtins__,__import___str);
851 if (!__import__) goto err;
852 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000854 r=PyObject_CallFunction(__import__,"OOOO",
855 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000856 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 Py_DECREF(globals);
860 Py_DECREF(__builtins__);
861 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 return r;
864 err:
865 Py_XDECREF(globals);
866 Py_XDECREF(__builtins__);
867 Py_XDECREF(__import__);
868 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000869}
870
871static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000872whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873{
874 int i, j;
875 PyObject *module = 0, *modules_dict = 0,
876 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 module = PyObject_GetAttrString(global, "__module__");
879 if (module) return module;
880 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000881
Tim Peterscba30e22003-02-01 06:24:36 +0000882 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 i = 0;
886 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000890 global_name_attr = PyObject_GetAttr(module, global_name);
891 if (!global_name_attr) {
892 PyErr_Clear();
893 continue;
894 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000896 if (global_name_attr != global) {
897 Py_DECREF(global_name_attr);
898 continue;
899 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 break;
904 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000906 /* The following implements the rule in pickle.py added in 1.5
907 that used __main__ if no module is found. I don't actually
908 like this rule. jlf
909 */
910 if (!j) {
911 j=1;
912 name=__main___str;
913 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 Py_INCREF(name);
916 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000917}
918
919
Guido van Rossum60456fd1997-04-09 17:36:32 +0000920static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000921fast_save_enter(Picklerobject *self, PyObject *obj)
922{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000923 /* if fast_container < 0, we're doing an error exit. */
924 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
925 PyObject *key = NULL;
926 if (self->fast_memo == NULL) {
927 self->fast_memo = PyDict_New();
928 if (self->fast_memo == NULL) {
929 self->fast_container = -1;
930 return 0;
931 }
932 }
933 key = PyLong_FromVoidPtr(obj);
934 if (key == NULL)
935 return 0;
936 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000937 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000938 PyErr_Format(PyExc_ValueError,
939 "fast mode: can't pickle cyclic objects including object type %s at %p",
940 obj->ob_type->tp_name, obj);
941 self->fast_container = -1;
942 return 0;
943 }
944 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000945 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 self->fast_container = -1;
947 return 0;
948 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000949 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000950 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000952}
953
Tim Peterscba30e22003-02-01 06:24:36 +0000954int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000955fast_save_leave(Picklerobject *self, PyObject *obj)
956{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
958 PyObject *key = PyLong_FromVoidPtr(obj);
959 if (key == NULL)
960 return 0;
961 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000962 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963 return 0;
964 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000965 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000966 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000967 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000968}
969
970static int
Tim Peterscba30e22003-02-01 06:24:36 +0000971save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000972{
973 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000974 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000975 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000978}
979
Guido van Rossum77f6a652002-04-03 22:41:51 +0000980static int
Tim Peterscba30e22003-02-01 06:24:36 +0000981save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000982{
Guido van Rossume2763392002-04-05 19:30:08 +0000983 static char *buf[2] = {FALSE, TRUE};
984 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000985 long l = PyInt_AS_LONG((PyIntObject *)args);
986
Tim Peters3c67d792003-02-02 17:59:11 +0000987 if (self->proto >= 2) {
988 char opcode = l ? NEWTRUE : NEWFALSE;
989 if (self->write_func(self, &opcode, 1) < 0)
990 return -1;
991 }
992 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000993 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000994 return 0;
995}
Tim Peters84e87f32001-03-17 04:50:51 +0000996
Guido van Rossum60456fd1997-04-09 17:36:32 +0000997static int
Tim Peterscba30e22003-02-01 06:24:36 +0000998save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000999{
1000 char c_str[32];
1001 long l = PyInt_AS_LONG((PyIntObject *)args);
1002 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001005#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001006 || l > 0x7fffffffL
1007 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001008#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001009 ) {
1010 /* Text-mode pickle, or long too big to fit in the 4-byte
1011 * signed BININT format: store as a string.
1012 */
1013 c_str[0] = INT;
1014 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001015 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001016 return -1;
1017 }
1018 else {
1019 /* Binary pickle and l fits in a signed 4-byte int. */
1020 c_str[1] = (int)( l & 0xff);
1021 c_str[2] = (int)((l >> 8) & 0xff);
1022 c_str[3] = (int)((l >> 16) & 0xff);
1023 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1026 if (c_str[2] == 0) {
1027 c_str[0] = BININT1;
1028 len = 2;
1029 }
1030 else {
1031 c_str[0] = BININT2;
1032 len = 3;
1033 }
1034 }
1035 else {
1036 c_str[0] = BININT;
1037 len = 5;
1038 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Tim Peters0bc93f52003-02-02 18:29:33 +00001040 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041 return -1;
1042 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001044 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001045}
1046
1047
1048static int
Tim Peterscba30e22003-02-01 06:24:36 +00001049save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050{
Tim Petersee1a53c2003-02-02 02:57:53 +00001051 int size;
1052 int res = -1;
1053 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001056
Tim Petersee1a53c2003-02-02 02:57:53 +00001057 if (self->proto >= 2) {
1058 /* Linear-time pickling. */
1059 size_t nbits;
1060 size_t nbytes;
1061 unsigned char *pdata;
1062 char c_str[5];
1063 int i;
1064 int sign = _PyLong_Sign(args);
1065
1066 if (sign == 0) {
1067 /* It's 0 -- an empty bytestring. */
1068 c_str[0] = LONG1;
1069 c_str[1] = 0;
1070 i = self->write_func(self, c_str, 2);
1071 if (i < 0) goto finally;
1072 res = 0;
1073 goto finally;
1074 }
1075 nbits = _PyLong_NumBits(args);
1076 if (nbits == (size_t)-1 && PyErr_Occurred())
1077 goto finally;
1078 /* How many bytes do we need? There are nbits >> 3 full
1079 * bytes of data, and nbits & 7 leftover bits. If there
1080 * are any leftover bits, then we clearly need another
1081 * byte. Wnat's not so obvious is that we *probably*
1082 * need another byte even if there aren't any leftovers:
1083 * the most-significant bit of the most-significant byte
1084 * acts like a sign bit, and it's usually got a sense
1085 * opposite of the one we need. The exception is longs
1086 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1087 * its own 256's-complement, so has the right sign bit
1088 * even without the extra byte. That's a pain to check
1089 * for in advance, though, so we always grab an extra
1090 * byte at the start, and cut it back later if possible.
1091 */
1092 nbytes = (nbits >> 3) + 1;
1093 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1094 PyErr_SetString(PyExc_OverflowError, "long too large "
1095 "to pickle");
1096 goto finally;
1097 }
1098 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1099 if (repr == NULL) goto finally;
1100 pdata = (unsigned char *)PyString_AS_STRING(repr);
1101 i = _PyLong_AsByteArray((PyLongObject *)args,
1102 pdata, nbytes,
1103 1 /* little endian */, 1 /* signed */);
1104 if (i < 0) goto finally;
1105 /* If the long is negative, this may be a byte more than
1106 * needed. This is so iff the MSB is all redundant sign
1107 * bits.
1108 */
1109 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1110 (pdata[nbytes - 2] & 0x80) != 0)
1111 --nbytes;
1112
1113 if (nbytes < 256) {
1114 c_str[0] = LONG1;
1115 c_str[1] = (char)nbytes;
1116 size = 2;
1117 }
1118 else {
1119 c_str[0] = LONG4;
1120 size = (int)nbytes;
1121 for (i = 1; i < 5; i++) {
1122 c_str[i] = (char)(size & 0xff);
1123 size >>= 8;
1124 }
1125 size = 5;
1126 }
1127 i = self->write_func(self, c_str, size);
1128 if (i < 0) goto finally;
1129 i = self->write_func(self, (char *)pdata, (int)nbytes);
1130 if (i < 0) goto finally;
1131 res = 0;
1132 goto finally;
1133 }
1134
1135 /* proto < 2: write the repr and newline. This is quadratic-time
1136 * (in the number of digits), in both directions.
1137 */
Tim Peterscba30e22003-02-01 06:24:36 +00001138 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 if ((size = PyString_Size(repr)) < 0)
1142 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Tim Peters0bc93f52003-02-02 18:29:33 +00001144 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Tim Peters0bc93f52003-02-02 18:29:33 +00001147 if (self->write_func(self,
1148 PyString_AS_STRING((PyStringObject *)repr),
1149 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Tim Peters0bc93f52003-02-02 18:29:33 +00001152 if (self->write_func(self, "\n", 1) < 0)
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 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 finally:
1158 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001160}
1161
1162
1163static int
Tim Peterscba30e22003-02-01 06:24:36 +00001164save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165{
1166 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 if (self->bin) {
1169 int s, e;
1170 double f;
1171 long fhi, flo;
1172 char str[9];
1173 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 *p = BINFLOAT;
1176 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001178 if (x < 0) {
1179 s = 1;
1180 x = -x;
1181 }
1182 else
1183 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 /* Normalize f to be in the range [1.0, 2.0) */
1188 if (0.5 <= f && f < 1.0) {
1189 f *= 2.0;
1190 e--;
1191 }
1192 else if (f == 0.0) {
1193 e = 0;
1194 }
1195 else {
1196 PyErr_SetString(PyExc_SystemError,
1197 "frexp() result out of range");
1198 return -1;
1199 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001201 if (e >= 1024) {
1202 /* XXX 1024 itself is reserved for Inf/NaN */
1203 PyErr_SetString(PyExc_OverflowError,
1204 "float too large to pack with d format");
1205 return -1;
1206 }
1207 else if (e < -1022) {
1208 /* Gradual underflow */
1209 f = ldexp(f, 1022 + e);
1210 e = 0;
1211 }
1212 else if (!(e == 0 && f == 0.0)) {
1213 e += 1023;
1214 f -= 1.0; /* Get rid of leading 1 */
1215 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Tim Peterscba30e22003-02-01 06:24:36 +00001217 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001218 flo the low 24 bits (== 52 bits) */
1219 f *= 268435456.0; /* 2**28 */
1220 fhi = (long) floor(f); /* Truncate */
1221 f -= (double)fhi;
1222 f *= 16777216.0; /* 2**24 */
1223 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 /* First byte */
1226 *p = (s<<7) | (e>>4);
1227 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 /* Second byte */
1230 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1231 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 /* Third byte */
1234 *p = (unsigned char) ((fhi>>16) & 0xFF);
1235 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001237 /* Fourth byte */
1238 *p = (unsigned char) ((fhi>>8) & 0xFF);
1239 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 /* Fifth byte */
1242 *p = (unsigned char) (fhi & 0xFF);
1243 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 /* Sixth byte */
1246 *p = (unsigned char) ((flo>>16) & 0xFF);
1247 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001249 /* Seventh byte */
1250 *p = (unsigned char) ((flo>>8) & 0xFF);
1251 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 /* Eighth byte */
1254 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001255
Tim Peters0bc93f52003-02-02 18:29:33 +00001256 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 return -1;
1258 }
1259 else {
1260 char c_str[250];
1261 c_str[0] = FLOAT;
1262 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001263
Tim Peters0bc93f52003-02-02 18:29:33 +00001264 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 return -1;
1266 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001269}
1270
1271
1272static int
Tim Peterscba30e22003-02-01 06:24:36 +00001273save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001274{
1275 int size, len;
1276 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if ((size = PyString_Size(args)) < 0)
1279 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if (!self->bin) {
1282 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001284 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001285
Tim Peterscba30e22003-02-01 06:24:36 +00001286 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001289 if ((len = PyString_Size(repr)) < 0)
1290 goto err;
1291 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001292
Tim Peters0bc93f52003-02-02 18:29:33 +00001293 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001295
Tim Peters0bc93f52003-02-02 18:29:33 +00001296 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298
Tim Peters0bc93f52003-02-02 18:29:33 +00001299 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 Py_XDECREF(repr);
1303 }
1304 else {
1305 int i;
1306 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 if ((size = PyString_Size(args)) < 0)
1309 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 if (size < 256) {
1312 c_str[0] = SHORT_BINSTRING;
1313 c_str[1] = size;
1314 len = 2;
1315 }
1316 else {
1317 c_str[0] = BINSTRING;
1318 for (i = 1; i < 5; i++)
1319 c_str[i] = (int)(size >> ((i - 1) * 8));
1320 len = 5;
1321 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001322
Tim Peters0bc93f52003-02-02 18:29:33 +00001323 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 if (size > 128 && Pdata_Check(self->file)) {
1327 if (write_other(self, NULL, 0) < 0) return -1;
1328 PDATA_APPEND(self->file, args, -1);
1329 }
1330 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001331 if (self->write_func(self,
1332 PyString_AS_STRING(
1333 (PyStringObject *)args),
1334 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 return -1;
1336 }
1337 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339 if (doput)
1340 if (put(self, args) < 0)
1341 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001343 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 err:
1346 Py_XDECREF(repr);
1347 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348}
1349
1350
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001351#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001352/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1353 backslash and newline characters to \uXXXX escapes. */
1354static PyObject *
1355modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1356{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 PyObject *repr;
1358 char *p;
1359 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 repr = PyString_FromStringAndSize(NULL, 6 * size);
1364 if (repr == NULL)
1365 return NULL;
1366 if (size == 0)
1367 return repr;
1368
1369 p = q = PyString_AS_STRING(repr);
1370 while (size-- > 0) {
1371 Py_UNICODE ch = *s++;
1372 /* Map 16-bit characters to '\uxxxx' */
1373 if (ch >= 256 || ch == '\\' || ch == '\n') {
1374 *p++ = '\\';
1375 *p++ = 'u';
1376 *p++ = hexdigit[(ch >> 12) & 0xf];
1377 *p++ = hexdigit[(ch >> 8) & 0xf];
1378 *p++ = hexdigit[(ch >> 4) & 0xf];
1379 *p++ = hexdigit[ch & 15];
1380 }
1381 /* Copy everything else as-is */
1382 else
1383 *p++ = (char) ch;
1384 }
1385 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001386 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001387 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001388}
1389
1390
Guido van Rossum60456fd1997-04-09 17:36:32 +00001391static int
Tim Peterscba30e22003-02-01 06:24:36 +00001392save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393{
1394 int size, len;
1395 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 if (!PyUnicode_Check(args))
1398 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001400 if (!self->bin) {
1401 char *repr_str;
1402 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404 repr = modified_EncodeRawUnicodeEscape(
1405 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001406 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 if ((len = PyString_Size(repr)) < 0)
1410 goto err;
1411 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001412
Tim Peters0bc93f52003-02-02 18:29:33 +00001413 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001415
Tim Peters0bc93f52003-02-02 18:29:33 +00001416 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Tim Peters0bc93f52003-02-02 18:29:33 +00001419 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 Py_XDECREF(repr);
1423 }
1424 else {
1425 int i;
1426 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001427
Tim Peterscba30e22003-02-01 06:24:36 +00001428 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001431 if ((size = PyString_Size(repr)) < 0)
1432 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 c_str[0] = BINUNICODE;
1435 for (i = 1; i < 5; i++)
1436 c_str[i] = (int)(size >> ((i - 1) * 8));
1437 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Tim Peters0bc93f52003-02-02 18:29:33 +00001439 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001442 if (size > 128 && Pdata_Check(self->file)) {
1443 if (write_other(self, NULL, 0) < 0)
1444 goto err;
1445 PDATA_APPEND(self->file, repr, -1);
1446 }
1447 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001448 if (self->write_func(self, PyString_AS_STRING(repr),
1449 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 goto err;
1451 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 Py_DECREF(repr);
1454 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 if (doput)
1457 if (put(self, args) < 0)
1458 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 err:
1463 Py_XDECREF(repr);
1464 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001465}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001466#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001467
Tim Peters1d63c9f2003-02-02 20:29:39 +00001468/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1469static int
1470store_tuple_elememts(Picklerobject *self, PyObject *t, int len)
1471{
1472 int i;
1473 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001474
Tim Peters1d63c9f2003-02-02 20:29:39 +00001475 assert(PyTuple_Size(t) == len);
1476
1477 for (i = 0; i < len; i++) {
1478 PyObject *element = PyTuple_GET_ITEM(t, i);
1479
1480 if (element == NULL)
1481 goto finally;
1482 if (save(self, element, 0) < 0)
1483 goto finally;
1484 }
1485 res = 0;
1486
1487 finally:
1488 return res;
1489}
1490
1491/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1492 * used across protocols to minimize the space needed to pickle them.
1493 * Tuples are also the only builtin immuatable type that can be recursive
1494 * (a tuple can be reached from itself), and that requires some subtle
1495 * magic so that it works in all cases. IOW, this is a long routine.
1496 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001497static int
Tim Peterscba30e22003-02-01 06:24:36 +00001498save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001500 PyObject *py_tuple_id = NULL;
1501 int len, i;
1502 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001505 static char pop = POP;
1506 static char pop_mark = POP_MARK;
1507 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if ((len = PyTuple_Size(args)) < 0)
1510 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511
Tim Peters1d63c9f2003-02-02 20:29:39 +00001512 if (len == 0) {
1513 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001514
Tim Peters1d63c9f2003-02-02 20:29:39 +00001515 if (self->proto) {
1516 c_str[0] = EMPTY_TUPLE;
1517 len = 1;
1518 }
1519 else {
1520 c_str[0] = MARK;
1521 c_str[1] = TUPLE;
1522 len = 2;
1523 }
1524 if (self->write_func(self, c_str, len) >= 0)
1525 res = 0;
1526 /* Don't memoize an empty tuple. */
1527 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001529
Tim Peters1d63c9f2003-02-02 20:29:39 +00001530 /* A non-empty tuple. */
1531
1532 /* id(tuple) isn't in the memo now. If it shows up there after
1533 * saving the tuple elements, the tuple must be recursive, in
1534 * which case we'll pop everything we put on the stack, and fetch
1535 * its value from the memo.
1536 */
1537 py_tuple_id = PyLong_FromVoidPtr(args);
1538 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001539 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001540
Tim Peters1d63c9f2003-02-02 20:29:39 +00001541 if (len <= 3 && self->proto >= 2) {
1542 /* Use TUPLE{1,2,3} opcodes. */
1543 if (store_tuple_elememts(self, args, len) < 0)
1544 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001546 /* pop the len elements */
1547 for (i = 0; i < len; ++i)
1548 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001549 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001550 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001551 if (get(self, py_tuple_id) < 0)
1552 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553 res = 0;
1554 goto finally;
1555 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001556 /* Not recursive. */
1557 if (self->write_func(self, len2opcode + len, 1) < 0)
1558 goto finally;
1559 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001560 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001561
Tim Peters1d63c9f2003-02-02 20:29:39 +00001562 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1563 * Generate MARK elt1 elt2 ... TUPLE
1564 */
1565 if (self->write_func(self, &MARKv, 1) < 0)
1566 goto finally;
1567
1568 if (store_tuple_elememts(self, args, len) < 0)
1569 goto finally;
1570
1571 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1572 /* pop the stack stuff we pushed */
1573 if (self->bin) {
1574 if (self->write_func(self, &pop_mark, 1) < 0)
1575 goto finally;
1576 }
1577 else {
1578 /* Note that we pop one more than len, to remove
1579 * the MARK too.
1580 */
1581 for (i = 0; i <= len; i++)
1582 if (self->write_func(self, &pop, 1) < 0)
1583 goto finally;
1584 }
1585 /* fetch from memo */
1586 if (get(self, py_tuple_id) >= 0)
1587 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001588 goto finally;
1589 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001590
Tim Peters1d63c9f2003-02-02 20:29:39 +00001591 /* Not recursive. */
1592 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001593 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001594
Tim Peters1d63c9f2003-02-02 20:29:39 +00001595 memoize:
1596 if (put(self, args) >= 0)
1597 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 finally:
1600 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001602}
1603
1604static int
Tim Peterscba30e22003-02-01 06:24:36 +00001605save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606{
1607 PyObject *element = 0;
1608 int s_len, len, i, using_appends, res = -1;
1609 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 if (self->fast && !fast_save_enter(self, args))
1614 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616 if (self->bin) {
1617 s[0] = EMPTY_LIST;
1618 s_len = 1;
1619 }
1620 else {
1621 s[0] = MARK;
1622 s[1] = LIST;
1623 s_len = 2;
1624 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if ((len = PyList_Size(args)) < 0)
1627 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Tim Peters0bc93f52003-02-02 18:29:33 +00001629 if (self->write_func(self, s, s_len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 if (len == 0) {
1633 if (put(self, args) < 0)
1634 goto finally;
1635 }
1636 else {
1637 if (put2(self, args) < 0)
1638 goto finally;
1639 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 if ((using_appends = (self->bin && (len > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001642 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001645 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001646 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001647 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001649 if (save(self, element, 0) < 0)
1650 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 if (!using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001653 if (self->write_func(self, &append, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 goto finally;
1655 }
1656 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001658 if (using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001659 if (self->write_func(self, &appends, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001660 goto finally;
1661 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 finally:
1666 if (self->fast && !fast_save_leave(self, args))
1667 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001670}
1671
1672
Guido van Rossum60456fd1997-04-09 17:36:32 +00001673static int
Tim Peterscba30e22003-02-01 06:24:36 +00001674save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675{
1676 PyObject *key = 0, *value = 0;
1677 int i, len, res = -1, using_setitems;
1678 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 if (self->fast && !fast_save_enter(self, args))
1683 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 if (self->bin) {
1686 s[0] = EMPTY_DICT;
1687 len = 1;
1688 }
1689 else {
1690 s[0] = MARK;
1691 s[1] = DICT;
1692 len = 2;
1693 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Tim Peters0bc93f52003-02-02 18:29:33 +00001695 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 if ((len = PyDict_Size(args)) < 0)
1699 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 if (len == 0) {
1702 if (put(self, args) < 0)
1703 goto finally;
1704 }
1705 else {
1706 if (put2(self, args) < 0)
1707 goto finally;
1708 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001710 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001711 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001714 i = 0;
1715 while (PyDict_Next(args, &i, &key, &value)) {
1716 if (save(self, key, 0) < 0)
1717 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 if (save(self, value, 0) < 0)
1720 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 if (!using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001723 if (self->write_func(self, &setitem, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 goto finally;
1725 }
1726 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001728 if (using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001729 if (self->write_func(self, &setitems, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 goto finally;
1731 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 finally:
1736 if (self->fast && !fast_save_leave(self, args))
1737 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001740}
1741
1742
Tim Peters84e87f32001-03-17 04:50:51 +00001743static int
Tim Peterscba30e22003-02-01 06:24:36 +00001744save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745{
1746 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1747 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1748 char *module_str, *name_str;
1749 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if (self->fast && !fast_save_enter(self, args))
1754 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001755
Tim Peters0bc93f52003-02-02 18:29:33 +00001756 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Tim Peterscba30e22003-02-01 06:24:36 +00001759 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 if (self->bin) {
1763 if (save(self, class, 0) < 0)
1764 goto finally;
1765 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1768 PyObject *element = 0;
1769 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001771 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001772 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 if ((len = PyObject_Size(class_args)) < 0)
1776 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001779 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 if (save(self, element, 0) < 0) {
1783 Py_DECREF(element);
1784 goto finally;
1785 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001787 Py_DECREF(element);
1788 }
1789 }
1790 else {
1791 PyErr_Clear();
1792 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001794 if (!self->bin) {
1795 if (!( name = ((PyClassObject *)class)->cl_name )) {
1796 PyErr_SetString(PicklingError, "class has no name");
1797 goto finally;
1798 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Tim Peterscba30e22003-02-01 06:24:36 +00001800 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001801 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001802
Tim Peters84e87f32001-03-17 04:50:51 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 if ((module_size = PyString_Size(module)) < 0 ||
1805 (name_size = PyString_Size(name)) < 0)
1806 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 module_str = PyString_AS_STRING((PyStringObject *)module);
1809 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Tim Peters0bc93f52003-02-02 18:29:33 +00001811 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Tim Peters0bc93f52003-02-02 18:29:33 +00001814 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001816
Tim Peters0bc93f52003-02-02 18:29:33 +00001817 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001819
Tim Peters0bc93f52003-02-02 18:29:33 +00001820 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001822
Tim Peters0bc93f52003-02-02 18:29:33 +00001823 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 goto finally;
1825 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001826 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 goto finally;
1828 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1831 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001832 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 goto finally;
1834 }
1835 else {
1836 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1839 PyErr_Clear();
1840 res = 0;
1841 goto finally;
1842 }
1843 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001845 if (!PyDict_Check(state)) {
1846 if (put2(self, args) < 0)
1847 goto finally;
1848 }
1849 else {
1850 if (put(self, args) < 0)
1851 goto finally;
1852 }
Tim Peters84e87f32001-03-17 04:50:51 +00001853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 if (save(self, state, 0) < 0)
1855 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001856
Tim Peters0bc93f52003-02-02 18:29:33 +00001857 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862 finally:
1863 if (self->fast && !fast_save_leave(self, args))
1864 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 Py_XDECREF(module);
1867 Py_XDECREF(class);
1868 Py_XDECREF(state);
1869 Py_XDECREF(getinitargs_func);
1870 Py_XDECREF(getstate_func);
1871 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001873 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001874}
1875
1876
Guido van Rossum60456fd1997-04-09 17:36:32 +00001877static int
Tim Peterscba30e22003-02-01 06:24:36 +00001878save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001880 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001881 char *name_str, *module_str;
1882 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 if (name) {
1887 global_name = name;
1888 Py_INCREF(global_name);
1889 }
1890 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001891 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 goto finally;
1893 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001894
Tim Peterscba30e22003-02-01 06:24:36 +00001895 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001896 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if ((module_size = PyString_Size(module)) < 0 ||
1899 (name_size = PyString_Size(global_name)) < 0)
1900 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 module_str = PyString_AS_STRING((PyStringObject *)module);
1903 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001904
Guido van Rossum75bfd052002-12-24 18:10:07 +00001905 /* XXX This can be doing a relative import. Clearly it shouldn't,
1906 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 mod = PyImport_ImportModule(module_str);
1908 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001909 cPickle_ErrFormat(PicklingError,
1910 "Can't pickle %s: it's not found as %s.%s",
1911 "OSS", args, module, global_name);
1912 goto finally;
1913 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001914 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 if (klass == NULL) {
1916 cPickle_ErrFormat(PicklingError,
1917 "Can't pickle %s: it's not found as %s.%s",
1918 "OSS", args, module, global_name);
1919 goto finally;
1920 }
1921 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001922 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 cPickle_ErrFormat(PicklingError,
1924 "Can't pickle %s: it's not the same object as %s.%s",
1925 "OSS", args, module, global_name);
1926 goto finally;
1927 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001928 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001929
Tim Peters0bc93f52003-02-02 18:29:33 +00001930 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001931 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Tim Peters0bc93f52003-02-02 18:29:33 +00001933 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Tim Peters0bc93f52003-02-02 18:29:33 +00001936 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Tim Peters0bc93f52003-02-02 18:29:33 +00001939 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Tim Peters0bc93f52003-02-02 18:29:33 +00001942 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if (put(self, args) < 0)
1946 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 finally:
1951 Py_XDECREF(module);
1952 Py_XDECREF(global_name);
1953 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956}
1957
Guido van Rossum60456fd1997-04-09 17:36:32 +00001958static int
Tim Peterscba30e22003-02-01 06:24:36 +00001959save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001960{
1961 PyObject *pid = 0;
1962 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 Py_INCREF(args);
1967 ARG_TUP(self, args);
1968 if (self->arg) {
1969 pid = PyObject_Call(f, self->arg, NULL);
1970 FREE_ARG_TUP(self);
1971 }
1972 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 if (pid != Py_None) {
1975 if (!self->bin) {
1976 if (!PyString_Check(pid)) {
1977 PyErr_SetString(PicklingError,
1978 "persistent id must be string");
1979 goto finally;
1980 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Tim Peters0bc93f52003-02-02 18:29:33 +00001982 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 if ((size = PyString_Size(pid)) < 0)
1986 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001987
Tim Peters0bc93f52003-02-02 18:29:33 +00001988 if (self->write_func(self,
1989 PyString_AS_STRING(
1990 (PyStringObject *)pid),
1991 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001993
Tim Peters0bc93f52003-02-02 18:29:33 +00001994 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001995 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 res = 1;
1998 goto finally;
1999 }
2000 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002001 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 res = -1;
2003 else
2004 res = 1;
2005 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 goto finally;
2008 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002010 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 finally:
2013 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002015 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002016}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002017
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002018
Tim Peters84e87f32001-03-17 04:50:51 +00002019static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002020save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002021 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002022{
2023 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 if (save(self, callable, 0) < 0)
2026 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002028 if (save(self, tup, 0) < 0)
2029 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002030
Tim Peters0bc93f52003-02-02 18:29:33 +00002031 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 if (ob != NULL) {
2035 if (state && !PyDict_Check(state)) {
2036 if (put2(self, ob) < 0)
2037 return -1;
2038 }
2039 else {
2040 if (put(self, ob) < 0)
2041 return -1;
2042 }
2043 }
Tim Peters84e87f32001-03-17 04:50:51 +00002044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 if (state) {
2046 if (save(self, state, 0) < 0)
2047 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002048
Tim Peters0bc93f52003-02-02 18:29:33 +00002049 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 return -1;
2051 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002054}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002055
Guido van Rossum60456fd1997-04-09 17:36:32 +00002056static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002057save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002058{
2059 PyTypeObject *type;
2060 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2061 *callable = 0, *state = 0;
2062 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002063
Martin v. Löwis5a395302002-08-04 08:20:23 +00002064 if (self->nesting++ > Py_GetRecursionLimit()){
2065 PyErr_SetString(PyExc_RuntimeError,
2066 "maximum recursion depth exceeded");
2067 goto finally;
2068 }
2069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002070 if (!pers_save && self->pers_func) {
2071 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2072 res = tmp;
2073 goto finally;
2074 }
2075 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 if (args == Py_None) {
2078 res = save_none(self, args);
2079 goto finally;
2080 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002085 case 'b':
2086 if (args == Py_False || args == Py_True) {
2087 res = save_bool(self, args);
2088 goto finally;
2089 }
2090 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002091 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002092 if (type == &PyInt_Type) {
2093 res = save_int(self, args);
2094 goto finally;
2095 }
2096 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002097
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 if (type == &PyLong_Type) {
2100 res = save_long(self, args);
2101 goto finally;
2102 }
2103 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002104
Guido van Rossum60456fd1997-04-09 17:36:32 +00002105 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002106 if (type == &PyFloat_Type) {
2107 res = save_float(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 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002113 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2114 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 goto finally;
2116 }
2117 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002118
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2121 res = save_string(self, args, 0);
2122 goto finally;
2123 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002124
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002125#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002126 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2128 res = save_unicode(self, args, 0);
2129 goto finally;
2130 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002131#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002135 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002136 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 if (PyDict_GetItem(self->memo, py_ob_id)) {
2139 if (get(self, py_ob_id) < 0)
2140 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142 res = 0;
2143 goto finally;
2144 }
2145 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002148 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002149 if (type == &PyString_Type) {
2150 res = save_string(self, args, 1);
2151 goto finally;
2152 }
2153 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002154
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002155#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002156 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002157 if (type == &PyUnicode_Type) {
2158 res = save_unicode(self, args, 1);
2159 goto finally;
2160 }
2161 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002162#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002163
Guido van Rossum60456fd1997-04-09 17:36:32 +00002164 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002165 if (type == &PyTuple_Type) {
2166 res = save_tuple(self, args);
2167 goto finally;
2168 }
2169 if (type == &PyType_Type) {
2170 res = save_global(self, args, NULL);
2171 goto finally;
2172 }
2173 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002174
Guido van Rossum60456fd1997-04-09 17:36:32 +00002175 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002176 if (type == &PyList_Type) {
2177 res = save_list(self, args);
2178 goto finally;
2179 }
2180 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002181
2182 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002183 if (type == &PyDict_Type) {
2184 res = save_dict(self, args);
2185 goto finally;
2186 }
2187 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002188
2189 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 if (type == &PyInstance_Type) {
2191 res = save_inst(self, args);
2192 goto finally;
2193 }
2194 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002195
2196 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002197 if (type == &PyClass_Type) {
2198 res = save_global(self, args, NULL);
2199 goto finally;
2200 }
2201 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002202
2203 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002204 if (type == &PyFunction_Type) {
2205 res = save_global(self, args, NULL);
2206 goto finally;
2207 }
2208 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002209
2210 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002211 if (type == &PyCFunction_Type) {
2212 res = save_global(self, args, NULL);
2213 goto finally;
2214 }
2215 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002217 if (!pers_save && self->inst_pers_func) {
2218 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2219 res = tmp;
2220 goto finally;
2221 }
2222 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002223
Jeremy Hylton39c61162002-07-16 19:47:43 +00002224 if (PyType_IsSubtype(type, &PyType_Type)) {
2225 res = save_global(self, args, NULL);
2226 goto finally;
2227 }
2228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002229 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2230 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 Py_INCREF(args);
2233 ARG_TUP(self, args);
2234 if (self->arg) {
2235 t = PyObject_Call(__reduce__, self->arg, NULL);
2236 FREE_ARG_TUP(self);
2237 }
2238 if (! t) goto finally;
2239 }
2240 else {
2241 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002243 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2244 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002245 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002246 goto finally;
2247 }
2248 else {
2249 PyErr_Clear();
2250 }
2251 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002253 if (t) {
2254 if (PyString_Check(t)) {
2255 res = save_global(self, args, t);
2256 goto finally;
2257 }
Tim Peters84e87f32001-03-17 04:50:51 +00002258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002259 if (!PyTuple_Check(t)) {
2260 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2261 "be a tuple", "O", __reduce__);
2262 goto finally;
2263 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002265 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267 if ((size != 3) && (size != 2)) {
2268 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2269 "contain only two or three elements", "O", __reduce__);
2270 goto finally;
2271 }
Tim Peters84e87f32001-03-17 04:50:51 +00002272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277 if (size > 2) {
2278 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002279 if (state == Py_None)
2280 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002283 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2284 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2285 "returned by %s must be a tuple", "O", __reduce__);
2286 goto finally;
2287 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 res = save_reduce(self, callable, arg_tup, state, args);
2290 goto finally;
2291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002296 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 Py_XDECREF(py_ob_id);
2298 Py_XDECREF(__reduce__);
2299 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002302}
2303
2304
2305static int
Tim Peterscba30e22003-02-01 06:24:36 +00002306dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307{
2308 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002309
Tim Peters4190fb82003-02-02 16:09:05 +00002310 if (self->proto >= 2) {
2311 char bytes[2];
2312
2313 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002314 assert(self->proto >= 0 && self->proto < 256);
2315 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002316 if (self->write_func(self, bytes, 2) < 0)
2317 return -1;
2318 }
2319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 if (save(self, args, 0) < 0)
2321 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002322
Tim Peters4190fb82003-02-02 16:09:05 +00002323 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002325
Tim Peters4190fb82003-02-02 16:09:05 +00002326 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330}
2331
2332static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002333Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334{
Tim Peterscba30e22003-02-01 06:24:36 +00002335 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 PyDict_Clear(self->memo);
2337 Py_INCREF(Py_None);
2338 return Py_None;
2339}
2340
2341static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002342Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343{
2344 int l, i, rsize, ssize, clear=1, lm;
2345 long ik;
2346 PyObject *k, *r;
2347 char *s, *p, *have_get;
2348 Pdata *data;
2349
2350 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002351 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002352 return NULL;
2353
2354 /* Check to make sure we are based on a list */
2355 if (! Pdata_Check(self->file)) {
2356 PyErr_SetString(PicklingError,
2357 "Attempt to getvalue() a non-list-based pickler");
2358 return NULL;
2359 }
2360
2361 /* flush write buffer */
2362 if (write_other(self, NULL, 0) < 0) return NULL;
2363
2364 data=(Pdata*)self->file;
2365 l=data->length;
2366
2367 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002368 lm = PyDict_Size(self->memo);
2369 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002371 have_get = malloc(lm);
2372 if (have_get == NULL) return PyErr_NoMemory();
2373 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374
2375 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002376 for (rsize = 0, i = l; --i >= 0; ) {
2377 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378
Tim Petersac5687a2003-02-02 18:08:34 +00002379 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381
2382 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002383 ik = PyInt_AS_LONG((PyIntObject*)k);
2384 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 PyErr_SetString(PicklingError,
2386 "Invalid get data");
2387 return NULL;
2388 }
Tim Petersac5687a2003-02-02 18:08:34 +00002389 if (have_get[ik]) /* with matching get */
2390 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 }
2392
2393 else if (! (PyTuple_Check(k) &&
2394 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002395 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396 ) {
2397 PyErr_SetString(PicklingError,
2398 "Unexpected data in internal list");
2399 return NULL;
2400 }
2401
2402 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002403 ik = PyInt_AS_LONG((PyIntObject *)k);
2404 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 PyErr_SetString(PicklingError,
2406 "Invalid get data");
2407 return NULL;
2408 }
Tim Petersac5687a2003-02-02 18:08:34 +00002409 have_get[ik] = 1;
2410 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002412 }
2413
2414 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002415 r = PyString_FromStringAndSize(NULL, rsize);
2416 if (r == NULL) goto err;
2417 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418
Tim Petersac5687a2003-02-02 18:08:34 +00002419 for (i = 0; i < l; i++) {
2420 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421
2422 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002423 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002425 p=PyString_AS_STRING((PyStringObject *)k);
2426 while (--ssize >= 0)
2427 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 }
2429 }
2430
2431 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002432 ik = PyInt_AS_LONG((PyIntObject *)
2433 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002434 if (ik < 256) {
2435 *s++ = BINGET;
2436 *s++ = (int)(ik & 0xff);
2437 }
2438 else {
2439 *s++ = LONG_BINGET;
2440 *s++ = (int)(ik & 0xff);
2441 *s++ = (int)((ik >> 8) & 0xff);
2442 *s++ = (int)((ik >> 16) & 0xff);
2443 *s++ = (int)((ik >> 24) & 0xff);
2444 }
2445 }
2446
2447 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002448 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449
2450 if (have_get[ik]) { /* with matching get */
2451 if (ik < 256) {
2452 *s++ = BINPUT;
2453 *s++ = (int)(ik & 0xff);
2454 }
2455 else {
2456 *s++ = LONG_BINPUT;
2457 *s++ = (int)(ik & 0xff);
2458 *s++ = (int)((ik >> 8) & 0xff);
2459 *s++ = (int)((ik >> 16) & 0xff);
2460 *s++ = (int)((ik >> 24) & 0xff);
2461 }
2462 }
2463 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 }
2465
2466 if (clear) {
2467 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002468 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002469 }
2470
2471 free(have_get);
2472 return r;
2473 err:
2474 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002475 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002476}
2477
2478static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002479Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002480{
2481 PyObject *ob;
2482 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002483
Tim Peterscba30e22003-02-01 06:24:36 +00002484 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (dump(self, ob) < 0)
2488 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002490 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492 /* XXX Why does dump() return self? */
2493 Py_INCREF(self);
2494 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002495}
2496
2497
Tim Peterscba30e22003-02-01 06:24:36 +00002498static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499{
Neal Norwitzb0493252002-03-31 14:44:22 +00002500 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002501 PyDoc_STR("dump(object) -- "
2502 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002503 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002504 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002505 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002506 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002507 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002508};
2509
2510
2511static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002512newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513{
2514 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002515
Tim Peters5bd2a792003-02-01 16:45:06 +00002516 if (proto < 0)
2517 proto = CURRENT_PROTOCOL_NUMBER;
2518 if (proto > CURRENT_PROTOCOL_NUMBER) {
2519 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2520 "the highest available protocol is %d",
2521 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002523 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002524
Tim Peters5bd2a792003-02-01 16:45:06 +00002525 self = PyObject_New(Picklerobject, &Picklertype);
2526 if (self == NULL)
2527 return NULL;
2528 self->proto = proto;
2529 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 self->fp = NULL;
2531 self->write = NULL;
2532 self->memo = NULL;
2533 self->arg = NULL;
2534 self->pers_func = NULL;
2535 self->inst_pers_func = NULL;
2536 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002538 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539 self->fast_container = 0;
2540 self->fast_memo = NULL;
2541 self->buf_size = 0;
2542 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002543
Tim Peters5bd2a792003-02-01 16:45:06 +00002544 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 if (file)
2546 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002547 else {
2548 file = Pdata_New();
2549 if (file == NULL)
2550 goto err;
2551 }
2552 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002553
Tim Peterscba30e22003-02-01 06:24:36 +00002554 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002557 if (PyFile_Check(file)) {
2558 self->fp = PyFile_AsFile(file);
2559 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002560 PyErr_SetString(PyExc_ValueError,
2561 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002562 goto err;
2563 }
2564 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002565 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 else if (PycStringIO_OutputCheck(file)) {
2567 self->write_func = write_cStringIO;
2568 }
2569 else if (file == Py_None) {
2570 self->write_func = write_none;
2571 }
2572 else {
2573 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 if (! Pdata_Check(file)) {
2576 self->write = PyObject_GetAttr(file, write_str);
2577 if (!self->write) {
2578 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002579 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 "argument must have 'write' "
2581 "attribute");
2582 goto err;
2583 }
2584 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002585
Tim Peters5bd2a792003-02-01 16:45:06 +00002586 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2587 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588 PyErr_NoMemory();
2589 goto err;
2590 }
2591 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 if (PyEval_GetRestricted()) {
2594 /* Restricted execution, get private tables */
2595 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2598 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2599 Py_DECREF(m);
2600 if (!( self->dispatch_table )) goto err;
2601 }
2602 else {
2603 self->dispatch_table=dispatch_table;
2604 Py_INCREF(dispatch_table);
2605 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002610 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002612}
2613
2614
2615static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002616get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617{
2618 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002619 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002620
Tim Peters5bd2a792003-02-01 16:45:06 +00002621 /* XXX What is this doing? The documented signature is
2622 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2623 * XXX Pickler(integer) too. The meaning then is clear as mud.
2624 * XXX Bug? Feature?
2625 */
2626 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002628 proto = 0;
2629 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630 return NULL;
2631 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002632 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002633}
2634
2635
2636static void
Tim Peterscba30e22003-02-01 06:24:36 +00002637Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002638{
2639 Py_XDECREF(self->write);
2640 Py_XDECREF(self->memo);
2641 Py_XDECREF(self->fast_memo);
2642 Py_XDECREF(self->arg);
2643 Py_XDECREF(self->file);
2644 Py_XDECREF(self->pers_func);
2645 Py_XDECREF(self->inst_pers_func);
2646 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002647 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002649}
2650
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002651static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002652Pickler_get_pers_func(Picklerobject *p)
2653{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 if (p->pers_func == NULL)
2655 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2656 else
2657 Py_INCREF(p->pers_func);
2658 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002659}
2660
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002661static int
2662Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2663{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002664 if (v == NULL) {
2665 PyErr_SetString(PyExc_TypeError,
2666 "attribute deletion is not supported");
2667 return -1;
2668 }
2669 Py_XDECREF(p->pers_func);
2670 Py_INCREF(v);
2671 p->pers_func = v;
2672 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002673}
2674
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002675static int
2676Pickler_set_inst_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->inst_pers_func);
2684 Py_INCREF(v);
2685 p->inst_pers_func = v;
2686 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002687}
2688
2689static PyObject *
2690Pickler_get_memo(Picklerobject *p)
2691{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002692 if (p->memo == NULL)
2693 PyErr_SetString(PyExc_AttributeError, "memo");
2694 else
2695 Py_INCREF(p->memo);
2696 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002697}
2698
2699static int
2700Pickler_set_memo(Picklerobject *p, PyObject *v)
2701{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 if (v == NULL) {
2703 PyErr_SetString(PyExc_TypeError,
2704 "attribute deletion is not supported");
2705 return -1;
2706 }
2707 if (!PyDict_Check(v)) {
2708 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2709 return -1;
2710 }
2711 Py_XDECREF(p->memo);
2712 Py_INCREF(v);
2713 p->memo = v;
2714 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002715}
2716
2717static PyObject *
2718Pickler_get_error(Picklerobject *p)
2719{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 /* why is this an attribute on the Pickler? */
2721 Py_INCREF(PicklingError);
2722 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002723}
2724
2725static PyMemberDef Pickler_members[] = {
2726 {"binary", T_INT, offsetof(Picklerobject, bin)},
2727 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002728 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002729};
2730
2731static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002732 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002733 (setter)Pickler_set_pers_func},
2734 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2735 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002736 {"PicklingError", (getter)Pickler_get_error, NULL},
2737 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002738};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002739
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002740PyDoc_STRVAR(Picklertype__doc__,
2741"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002742
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002743static PyTypeObject Picklertype = {
2744 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002745 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002746 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002747 sizeof(Picklerobject), /*tp_basicsize*/
2748 0,
2749 (destructor)Pickler_dealloc, /* tp_dealloc */
2750 0, /* tp_print */
2751 0, /* tp_getattr */
2752 0, /* tp_setattr */
2753 0, /* tp_compare */
2754 0, /* tp_repr */
2755 0, /* tp_as_number */
2756 0, /* tp_as_sequence */
2757 0, /* tp_as_mapping */
2758 0, /* tp_hash */
2759 0, /* tp_call */
2760 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002761 PyObject_GenericGetAttr, /* tp_getattro */
2762 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002763 0, /* tp_as_buffer */
2764 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2765 Picklertype__doc__, /* tp_doc */
2766 0, /* tp_traverse */
2767 0, /* tp_clear */
2768 0, /* tp_richcompare */
2769 0, /* tp_weaklistoffset */
2770 0, /* tp_iter */
2771 0, /* tp_iternext */
2772 Pickler_methods, /* tp_methods */
2773 Pickler_members, /* tp_members */
2774 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002775};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002776
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002777static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002778find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779{
2780 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 if (fc) {
2783 if (fc==Py_None) {
2784 PyErr_SetString(UnpicklingError,
2785 "Global and instance pickles are not supported.");
2786 return NULL;
2787 }
Tim Peterscba30e22003-02-01 06:24:36 +00002788 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 py_global_name);
2790 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792 module = PySys_GetObject("modules");
2793 if (module == NULL)
2794 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 module = PyDict_GetItem(module, py_module_name);
2797 if (module == NULL) {
2798 module = PyImport_Import(py_module_name);
2799 if (!module)
2800 return NULL;
2801 global = PyObject_GetAttr(module, py_global_name);
2802 Py_DECREF(module);
2803 }
2804 else
2805 global = PyObject_GetAttr(module, py_global_name);
2806 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002807}
2808
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002809static int
Tim Peterscba30e22003-02-01 06:24:36 +00002810marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811{
2812 if (self->num_marks < 1) {
2813 PyErr_SetString(UnpicklingError, "could not find MARK");
2814 return -1;
2815 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002818}
2819
Tim Peters84e87f32001-03-17 04:50:51 +00002820
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821static int
Tim Peterscba30e22003-02-01 06:24:36 +00002822load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823{
2824 PDATA_APPEND(self->stack, Py_None, -1);
2825 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826}
2827
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002828static int
Tim Peterscba30e22003-02-01 06:24:36 +00002829bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002830{
2831 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2832 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002833}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
2835static int
Tim Peterscba30e22003-02-01 06:24:36 +00002836load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837{
2838 PyObject *py_int = 0;
2839 char *endptr, *s;
2840 int len, res = -1;
2841 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002842
Tim Peters0bc93f52003-02-02 18:29:33 +00002843 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 if (len < 2) return bad_readline();
2845 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 errno = 0;
2848 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2851 /* Hm, maybe we've got something long. Let's try reading
2852 it as a Python long object. */
2853 errno = 0;
2854 py_int = PyLong_FromString(s, NULL, 0);
2855 if (py_int == NULL) {
2856 PyErr_SetString(PyExc_ValueError,
2857 "could not convert string to int");
2858 goto finally;
2859 }
2860 }
2861 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002862 if (len == 3 && (l == 0 || l == 1)) {
2863 if (!( py_int = PyBool_FromLong(l))) goto finally;
2864 }
2865 else {
2866 if (!( py_int = PyInt_FromLong(l))) goto finally;
2867 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 free(s);
2871 PDATA_PUSH(self->stack, py_int, -1);
2872 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874 finally:
2875 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878}
2879
Tim Peters3c67d792003-02-02 17:59:11 +00002880static int
2881load_bool(Unpicklerobject *self, PyObject *boolean)
2882{
2883 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002884 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002885 return 0;
2886}
2887
Tim Petersee1a53c2003-02-02 02:57:53 +00002888/* s contains x bytes of a little-endian integer. Return its value as a
2889 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2890 * int, but when x is 4 it's a signed one. This is an historical source
2891 * of x-platform bugs.
2892 */
Tim Peters84e87f32001-03-17 04:50:51 +00002893static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002894calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895{
2896 unsigned char c;
2897 int i;
2898 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 for (i = 0, l = 0L; i < x; i++) {
2901 c = (unsigned char)s[i];
2902 l |= (long)c << (i * 8);
2903 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002904#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002905 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2906 * is signed, so on a box with longs bigger than 4 bytes we need
2907 * to extend a BININT's sign bit to the full width.
2908 */
2909 if (x == 4 && l & (1L << 31))
2910 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002911#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913}
2914
2915
2916static int
Tim Peterscba30e22003-02-01 06:24:36 +00002917load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918{
2919 PyObject *py_int = 0;
2920 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002923
Tim Peterscba30e22003-02-01 06:24:36 +00002924 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002927 PDATA_PUSH(self->stack, py_int, -1);
2928 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929}
2930
2931
2932static int
Tim Peterscba30e22003-02-01 06:24:36 +00002933load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934{
2935 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936
Tim Peters0bc93f52003-02-02 18:29:33 +00002937 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941}
2942
2943
2944static int
Tim Peterscba30e22003-02-01 06:24:36 +00002945load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946{
2947 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
Tim Peters0bc93f52003-02-02 18:29:33 +00002949 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953}
2954
2955
2956static int
Tim Peterscba30e22003-02-01 06:24:36 +00002957load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958{
2959 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960
Tim Peters0bc93f52003-02-02 18:29:33 +00002961 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965}
Tim Peters84e87f32001-03-17 04:50:51 +00002966
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967static int
Tim Peterscba30e22003-02-01 06:24:36 +00002968load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002969{
2970 PyObject *l = 0;
2971 char *end, *s;
2972 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973
Tim Peters0bc93f52003-02-02 18:29:33 +00002974 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975 if (len < 2) return bad_readline();
2976 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977
Tim Peterscba30e22003-02-01 06:24:36 +00002978 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 free(s);
2982 PDATA_PUSH(self->stack, l, -1);
2983 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 finally:
2986 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989}
2990
Tim Petersee1a53c2003-02-02 02:57:53 +00002991/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2992 * data following.
2993 */
2994static int
2995load_counted_long(Unpicklerobject *self, int size)
2996{
2997 int i;
2998 char *nbytes;
2999 unsigned char *pdata;
3000 PyObject *along;
3001
3002 assert(size == 1 || size == 4);
3003 i = self->read_func(self, &nbytes, size);
3004 if (i < 0) return -1;
3005
3006 size = calc_binint(nbytes, size);
3007 if (size < 0) {
3008 /* Corrupt or hostile pickle -- we never write one like
3009 * this.
3010 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003011 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003012 "byte count");
3013 return -1;
3014 }
3015
3016 if (size == 0)
3017 along = PyLong_FromLong(0L);
3018 else {
3019 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003020 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003021 if (i < 0) return -1;
3022 along = _PyLong_FromByteArray(pdata, (size_t)size,
3023 1 /* little endian */, 1 /* signed */);
3024 }
3025 if (along == NULL)
3026 return -1;
3027 PDATA_PUSH(self->stack, along, -1);
3028 return 0;
3029}
Tim Peters84e87f32001-03-17 04:50:51 +00003030
Guido van Rossum60456fd1997-04-09 17:36:32 +00003031static int
Tim Peterscba30e22003-02-01 06:24:36 +00003032load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033{
3034 PyObject *py_float = 0;
3035 char *endptr, *s;
3036 int len, res = -1;
3037 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038
Tim Peters0bc93f52003-02-02 18:29:33 +00003039 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003040 if (len < 2) return bad_readline();
3041 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043 errno = 0;
3044 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3047 PyErr_SetString(PyExc_ValueError,
3048 "could not convert string to float");
3049 goto finally;
3050 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051
Tim Peterscba30e22003-02-01 06:24:36 +00003052 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 free(s);
3056 PDATA_PUSH(self->stack, py_float, -1);
3057 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 finally:
3060 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063}
3064
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065static int
Tim Peterscba30e22003-02-01 06:24:36 +00003066load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067{
3068 PyObject *py_float = 0;
3069 int s, e;
3070 long fhi, flo;
3071 double x;
3072 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073
Tim Peters0bc93f52003-02-02 18:29:33 +00003074 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 /* First byte */
3078 s = (*p>>7) & 1;
3079 e = (*p & 0x7F) << 4;
3080 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 /* Second byte */
3083 e |= (*p>>4) & 0xF;
3084 fhi = (*p & 0xF) << 24;
3085 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 /* Third byte */
3088 fhi |= (*p & 0xFF) << 16;
3089 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 /* Fourth byte */
3092 fhi |= (*p & 0xFF) << 8;
3093 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 /* Fifth byte */
3096 fhi |= *p & 0xFF;
3097 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 /* Sixth byte */
3100 flo = (*p & 0xFF) << 16;
3101 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 /* Seventh byte */
3104 flo |= (*p & 0xFF) << 8;
3105 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 /* Eighth byte */
3108 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3111 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 /* XXX This sadly ignores Inf/NaN */
3114 if (e == 0)
3115 e = -1022;
3116 else {
3117 x += 1.0;
3118 e -= 1023;
3119 }
3120 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 if (s)
3123 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 PDATA_PUSH(self->stack, py_float, -1);
3128 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003129}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
3131static int
Tim Peterscba30e22003-02-01 06:24:36 +00003132load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133{
3134 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003135 int len, res = -1;
3136 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Tim Peters0bc93f52003-02-02 18:29:33 +00003138 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 if (len < 2) return bad_readline();
3140 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003142
3143 /* Strip outermost quotes */
3144 while (s[len-1] <= ' ')
3145 len--;
3146 if(s[0]=='"' && s[len-1]=='"'){
3147 s[len-1] = '\0';
3148 p = s + 1 ;
3149 len -= 2;
3150 } else if(s[0]=='\'' && s[len-1]=='\''){
3151 s[len-1] = '\0';
3152 p = s + 1 ;
3153 len -= 2;
3154 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 goto insecure;
3156 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003157
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003158 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3159 if (str) {
3160 PDATA_PUSH(self->stack, str, -1);
3161 res = 0;
3162 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 insecure:
3167 free(s);
3168 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3169 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003170}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171
3172
3173static int
Tim Peterscba30e22003-02-01 06:24:36 +00003174load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175{
3176 PyObject *py_string = 0;
3177 long l;
3178 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179
Tim Peters0bc93f52003-02-02 18:29:33 +00003180 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003182 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003183
Tim Peters0bc93f52003-02-02 18:29:33 +00003184 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003186
Tim Peterscba30e22003-02-01 06:24:36 +00003187 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190 PDATA_PUSH(self->stack, py_string, -1);
3191 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192}
3193
3194
3195static int
Tim Peterscba30e22003-02-01 06:24:36 +00003196load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197{
3198 PyObject *py_string = 0;
3199 unsigned char l;
3200 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201
Tim Peters0bc93f52003-02-02 18:29:33 +00003202 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206
Tim Peters0bc93f52003-02-02 18:29:33 +00003207 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 PDATA_PUSH(self->stack, py_string, -1);
3212 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003213}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
3215
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003216#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217static int
Tim Peterscba30e22003-02-01 06:24:36 +00003218load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219{
3220 PyObject *str = 0;
3221 int len, res = -1;
3222 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003223
Tim Peters0bc93f52003-02-02 18:29:33 +00003224 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003226
Tim Peterscba30e22003-02-01 06:24:36 +00003227 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 PDATA_PUSH(self->stack, str, -1);
3231 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 finally:
3234 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003235}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003236#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003237
3238
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003239#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003240static int
Tim Peterscba30e22003-02-01 06:24:36 +00003241load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242{
3243 PyObject *unicode;
3244 long l;
3245 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003246
Tim Peters0bc93f52003-02-02 18:29:33 +00003247 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003250
Tim Peters0bc93f52003-02-02 18:29:33 +00003251 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003252 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003253
Tim Peterscba30e22003-02-01 06:24:36 +00003254 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003257 PDATA_PUSH(self->stack, unicode, -1);
3258 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003259}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003260#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003261
3262
3263static int
Tim Peterscba30e22003-02-01 06:24:36 +00003264load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265{
3266 PyObject *tup;
3267 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003269 if ((i = marker(self)) < 0) return -1;
3270 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3271 PDATA_PUSH(self->stack, tup, -1);
3272 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273}
3274
3275static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003276load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003278 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Tim Peters1d63c9f2003-02-02 20:29:39 +00003280 if (tup == NULL)
3281 return -1;
3282
3283 while (--len >= 0) {
3284 PyObject *element;
3285
3286 PDATA_POP(self->stack, element);
3287 if (element == NULL)
3288 return -1;
3289 PyTuple_SET_ITEM(tup, len, element);
3290 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291 PDATA_PUSH(self->stack, tup, -1);
3292 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293}
3294
3295static int
Tim Peterscba30e22003-02-01 06:24:36 +00003296load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003297{
3298 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 if (!( list=PyList_New(0))) return -1;
3301 PDATA_PUSH(self->stack, list, -1);
3302 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003303}
3304
3305static int
Tim Peterscba30e22003-02-01 06:24:36 +00003306load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003307{
3308 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310 if (!( dict=PyDict_New())) return -1;
3311 PDATA_PUSH(self->stack, dict, -1);
3312 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313}
3314
3315
3316static int
Tim Peterscba30e22003-02-01 06:24:36 +00003317load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003318{
3319 PyObject *list = 0;
3320 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 if ((i = marker(self)) < 0) return -1;
3323 if (!( list=Pdata_popList(self->stack, i))) return -1;
3324 PDATA_PUSH(self->stack, list, -1);
3325 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326}
3327
3328static int
Tim Peterscba30e22003-02-01 06:24:36 +00003329load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003330{
3331 PyObject *dict, *key, *value;
3332 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 if ((i = marker(self)) < 0) return -1;
3335 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003337 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 for (k = i+1; k < j; k += 2) {
3340 key =self->stack->data[k-1];
3341 value=self->stack->data[k ];
3342 if (PyDict_SetItem(dict, key, value) < 0) {
3343 Py_DECREF(dict);
3344 return -1;
3345 }
3346 }
3347 Pdata_clear(self->stack, i);
3348 PDATA_PUSH(self->stack, dict, -1);
3349 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003350}
3351
3352static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003353Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003354{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003355 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003357 if (PyClass_Check(cls)) {
3358 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 if ((l=PyObject_Size(args)) < 0) goto err;
3361 if (!( l )) {
3362 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003363
Tim Peterscba30e22003-02-01 06:24:36 +00003364 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003365 __getinitargs___str);
3366 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003367 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368 so bypass usual construction */
3369 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003372 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003373 goto err;
3374 return inst;
3375 }
3376 Py_DECREF(__getinitargs__);
3377 }
Tim Peters84e87f32001-03-17 04:50:51 +00003378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 if ((r=PyInstance_New(cls, args, NULL))) return r;
3380 else goto err;
3381 }
Tim Peters84e87f32001-03-17 04:50:51 +00003382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383 if (args==Py_None) {
3384 /* Special case, call cls.__basicnew__() */
3385 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3388 if (!basicnew) return NULL;
3389 r=PyObject_CallObject(basicnew, NULL);
3390 Py_DECREF(basicnew);
3391 if (r) return r;
3392 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 err:
3397 {
3398 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400 PyErr_Fetch(&tp, &v, &tb);
3401 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3402 Py_XDECREF(v);
3403 v=r;
3404 }
3405 PyErr_Restore(tp,v,tb);
3406 }
3407 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003408}
Tim Peters84e87f32001-03-17 04:50:51 +00003409
Guido van Rossum60456fd1997-04-09 17:36:32 +00003410
3411static int
Tim Peterscba30e22003-02-01 06:24:36 +00003412load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413{
3414 PyObject *class, *tup, *obj=0;
3415 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 if ((i = marker(self)) < 0) return -1;
3418 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3419 PDATA_POP(self->stack, class);
3420 if (class) {
3421 obj = Instance_New(class, tup);
3422 Py_DECREF(class);
3423 }
3424 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426 if (! obj) return -1;
3427 PDATA_PUSH(self->stack, obj, -1);
3428 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003429}
3430
3431
3432static int
Tim Peterscba30e22003-02-01 06:24:36 +00003433load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434{
3435 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3436 int i, len;
3437 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003440
Tim Peters0bc93f52003-02-02 18:29:33 +00003441 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 if (len < 2) return bad_readline();
3443 module_name = PyString_FromStringAndSize(s, len - 1);
3444 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003445
Tim Peters0bc93f52003-02-02 18:29:33 +00003446 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 if (len < 2) return bad_readline();
3448 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003449 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450 self->find_class);
3451 Py_DECREF(class_name);
3452 }
3453 }
3454 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458 if ((tup=Pdata_popTuple(self->stack, i))) {
3459 obj = Instance_New(class, tup);
3460 Py_DECREF(tup);
3461 }
3462 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003466 PDATA_PUSH(self->stack, obj, -1);
3467 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468}
3469
3470
3471static int
Tim Peterscba30e22003-02-01 06:24:36 +00003472load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473{
3474 PyObject *class = 0, *module_name = 0, *class_name = 0;
3475 int len;
3476 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477
Tim Peters0bc93f52003-02-02 18:29:33 +00003478 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479 if (len < 2) return bad_readline();
3480 module_name = PyString_FromStringAndSize(s, len - 1);
3481 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482
Tim Peters0bc93f52003-02-02 18:29:33 +00003483 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003484 if (len < 2) {
3485 Py_DECREF(module_name);
3486 return bad_readline();
3487 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003489 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 self->find_class);
3491 Py_DECREF(class_name);
3492 }
3493 }
3494 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 if (! class) return -1;
3497 PDATA_PUSH(self->stack, class, -1);
3498 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499}
3500
3501
3502static int
Tim Peterscba30e22003-02-01 06:24:36 +00003503load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504{
3505 PyObject *pid = 0;
3506 int len;
3507 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003510 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 if (len < 2) return bad_readline();
3512
3513 pid = PyString_FromStringAndSize(s, len - 1);
3514 if (!pid) return -1;
3515
3516 if (PyList_Check(self->pers_func)) {
3517 if (PyList_Append(self->pers_func, pid) < 0) {
3518 Py_DECREF(pid);
3519 return -1;
3520 }
3521 }
3522 else {
3523 ARG_TUP(self, pid);
3524 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003525 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003526 NULL);
3527 FREE_ARG_TUP(self);
3528 }
3529 }
3530
3531 if (! pid) return -1;
3532
3533 PDATA_PUSH(self->stack, pid, -1);
3534 return 0;
3535 }
3536 else {
3537 PyErr_SetString(UnpicklingError,
3538 "A load persistent id instruction was encountered,\n"
3539 "but no persistent_load function was specified.");
3540 return -1;
3541 }
3542}
3543
3544static int
Tim Peterscba30e22003-02-01 06:24:36 +00003545load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546{
3547 PyObject *pid = 0;
3548
3549 if (self->pers_func) {
3550 PDATA_POP(self->stack, pid);
3551 if (! pid) return -1;
3552
3553 if (PyList_Check(self->pers_func)) {
3554 if (PyList_Append(self->pers_func, pid) < 0) {
3555 Py_DECREF(pid);
3556 return -1;
3557 }
3558 }
3559 else {
3560 ARG_TUP(self, pid);
3561 if (self->arg) {
3562 pid = PyObject_Call(self->pers_func, self->arg,
3563 NULL);
3564 FREE_ARG_TUP(self);
3565 }
3566 if (! pid) return -1;
3567 }
3568
3569 PDATA_PUSH(self->stack, pid, -1);
3570 return 0;
3571 }
3572 else {
3573 PyErr_SetString(UnpicklingError,
3574 "A load persistent id instruction was encountered,\n"
3575 "but no persistent_load function was specified.");
3576 return -1;
3577 }
3578}
3579
3580
3581static int
Tim Peterscba30e22003-02-01 06:24:36 +00003582load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003583{
3584 int len;
3585
3586 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3587
3588 /* Note that we split the (pickle.py) stack into two stacks,
3589 an object stack and a mark stack. We have to be clever and
3590 pop the right one. We do this by looking at the top of the
3591 mark stack.
3592 */
3593
3594 if ((self->num_marks > 0) &&
3595 (self->marks[self->num_marks - 1] == len))
3596 self->num_marks--;
3597 else {
3598 len--;
3599 Py_DECREF(self->stack->data[len]);
3600 self->stack->length=len;
3601 }
3602
3603 return 0;
3604}
3605
3606
3607static int
Tim Peterscba30e22003-02-01 06:24:36 +00003608load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609{
3610 int i;
3611
3612 if ((i = marker(self)) < 0)
3613 return -1;
3614
3615 Pdata_clear(self->stack, i);
3616
3617 return 0;
3618}
3619
3620
3621static int
Tim Peterscba30e22003-02-01 06:24:36 +00003622load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623{
3624 PyObject *last;
3625 int len;
3626
3627 if ((len = self->stack->length) <= 0) return stackUnderflow();
3628 last=self->stack->data[len-1];
3629 Py_INCREF(last);
3630 PDATA_PUSH(self->stack, last, -1);
3631 return 0;
3632}
3633
3634
3635static int
Tim Peterscba30e22003-02-01 06:24:36 +00003636load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637{
3638 PyObject *py_str = 0, *value = 0;
3639 int len;
3640 char *s;
3641 int rc;
3642
Tim Peters0bc93f52003-02-02 18:29:33 +00003643 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003644 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003646 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648 value = PyDict_GetItem(self->memo, py_str);
3649 if (! value) {
3650 PyErr_SetObject(BadPickleGet, py_str);
3651 rc = -1;
3652 } else {
3653 PDATA_APPEND(self->stack, value, -1);
3654 rc = 0;
3655 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657 Py_DECREF(py_str);
3658 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003659}
3660
3661
3662static int
Tim Peterscba30e22003-02-01 06:24:36 +00003663load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003664{
3665 PyObject *py_key = 0, *value = 0;
3666 unsigned char key;
3667 char *s;
3668 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669
Tim Peters0bc93f52003-02-02 18:29:33 +00003670 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003672 key = (unsigned char)s[0];
3673 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003675 value = PyDict_GetItem(self->memo, py_key);
3676 if (! value) {
3677 PyErr_SetObject(BadPickleGet, py_key);
3678 rc = -1;
3679 } else {
3680 PDATA_APPEND(self->stack, value, -1);
3681 rc = 0;
3682 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684 Py_DECREF(py_key);
3685 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686}
3687
3688
3689static int
Tim Peterscba30e22003-02-01 06:24:36 +00003690load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691{
3692 PyObject *py_key = 0, *value = 0;
3693 unsigned char c;
3694 char *s;
3695 long key;
3696 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697
Tim Peters0bc93f52003-02-02 18:29:33 +00003698 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003700 c = (unsigned char)s[0];
3701 key = (long)c;
3702 c = (unsigned char)s[1];
3703 key |= (long)c << 8;
3704 c = (unsigned char)s[2];
3705 key |= (long)c << 16;
3706 c = (unsigned char)s[3];
3707 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3710
3711 value = PyDict_GetItem(self->memo, py_key);
3712 if (! value) {
3713 PyErr_SetObject(BadPickleGet, py_key);
3714 rc = -1;
3715 } else {
3716 PDATA_APPEND(self->stack, value, -1);
3717 rc = 0;
3718 }
3719
3720 Py_DECREF(py_key);
3721 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003722}
3723
3724
3725static int
Tim Peterscba30e22003-02-01 06:24:36 +00003726load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727{
3728 PyObject *py_str = 0, *value = 0;
3729 int len, l;
3730 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731
Tim Peters0bc93f52003-02-02 18:29:33 +00003732 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003733 if (l < 2) return bad_readline();
3734 if (!( len=self->stack->length )) return stackUnderflow();
3735 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3736 value=self->stack->data[len-1];
3737 l=PyDict_SetItem(self->memo, py_str, value);
3738 Py_DECREF(py_str);
3739 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003740}
3741
3742
3743static int
Tim Peterscba30e22003-02-01 06:24:36 +00003744load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745{
3746 PyObject *py_key = 0, *value = 0;
3747 unsigned char key;
3748 char *s;
3749 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003750
Tim Peters0bc93f52003-02-02 18:29:33 +00003751 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3757 value=self->stack->data[len-1];
3758 len=PyDict_SetItem(self->memo, py_key, value);
3759 Py_DECREF(py_key);
3760 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761}
3762
3763
3764static int
Tim Peterscba30e22003-02-01 06:24:36 +00003765load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766{
3767 PyObject *py_key = 0, *value = 0;
3768 long key;
3769 unsigned char c;
3770 char *s;
3771 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003772
Tim Peters0bc93f52003-02-02 18:29:33 +00003773 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003776 c = (unsigned char)s[0];
3777 key = (long)c;
3778 c = (unsigned char)s[1];
3779 key |= (long)c << 8;
3780 c = (unsigned char)s[2];
3781 key |= (long)c << 16;
3782 c = (unsigned char)s[3];
3783 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 if (!( py_key = PyInt_FromLong(key))) return -1;
3786 value=self->stack->data[len-1];
3787 len=PyDict_SetItem(self->memo, py_key, value);
3788 Py_DECREF(py_key);
3789 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790}
3791
3792
3793static int
Tim Peterscba30e22003-02-01 06:24:36 +00003794do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795{
3796 PyObject *value = 0, *list = 0, *append_method = 0;
3797 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 len=self->stack->length;
3800 if (!( len >= x && x > 0 )) return stackUnderflow();
3801 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003802 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003806 if (PyList_Check(list)) {
3807 PyObject *slice;
3808 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 slice=Pdata_popList(self->stack, x);
3811 list_len = PyList_GET_SIZE(list);
3812 i=PyList_SetSlice(list, list_len, list_len, slice);
3813 Py_DECREF(slice);
3814 return i;
3815 }
3816 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817
Tim Peterscba30e22003-02-01 06:24:36 +00003818 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 return -1;
3820
3821 for (i = x; i < len; i++) {
3822 PyObject *junk;
3823
3824 value=self->stack->data[i];
3825 junk=0;
3826 ARG_TUP(self, value);
3827 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003828 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 NULL);
3830 FREE_ARG_TUP(self);
3831 }
3832 if (! junk) {
3833 Pdata_clear(self->stack, i+1);
3834 self->stack->length=x;
3835 Py_DECREF(append_method);
3836 return -1;
3837 }
3838 Py_DECREF(junk);
3839 }
3840 self->stack->length=x;
3841 Py_DECREF(append_method);
3842 }
3843
3844 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003845}
3846
3847
3848static int
Tim Peterscba30e22003-02-01 06:24:36 +00003849load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850{
3851 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003852}
3853
3854
3855static int
Tim Peterscba30e22003-02-01 06:24:36 +00003856load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003857{
3858 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859}
3860
3861
3862static int
Tim Peterscba30e22003-02-01 06:24:36 +00003863do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864{
3865 PyObject *value = 0, *key = 0, *dict = 0;
3866 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868 if (!( (len=self->stack->length) >= x
3869 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003873 for (i = x+1; i < len; i += 2) {
3874 key =self->stack->data[i-1];
3875 value=self->stack->data[i ];
3876 if (PyObject_SetItem(dict, key, value) < 0) {
3877 r=-1;
3878 break;
3879 }
3880 }
3881
3882 Pdata_clear(self->stack, x);
3883
3884 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003885}
3886
3887
Tim Peters84e87f32001-03-17 04:50:51 +00003888static int
Tim Peterscba30e22003-02-01 06:24:36 +00003889load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890{
3891 return do_setitems(self, self->stack->length - 2);
3892}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894static int
Tim Peterscba30e22003-02-01 06:24:36 +00003895load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896{
3897 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898}
3899
Tim Peters84e87f32001-03-17 04:50:51 +00003900
Guido van Rossum60456fd1997-04-09 17:36:32 +00003901static int
Tim Peterscba30e22003-02-01 06:24:36 +00003902load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003903{
3904 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3905 *junk = 0, *__setstate__ = 0;
3906 int i, r = 0;
3907
3908 if (self->stack->length < 2) return stackUnderflow();
3909 PDATA_POP(self->stack, value);
3910 if (! value) return -1;
3911 inst=self->stack->data[self->stack->length-1];
3912
3913 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3914 ARG_TUP(self, value);
3915 if (self->arg) {
3916 junk = PyObject_Call(__setstate__, self->arg, NULL);
3917 FREE_ARG_TUP(self);
3918 }
3919 Py_DECREF(__setstate__);
3920 if (! junk) return -1;
3921 Py_DECREF(junk);
3922 return 0;
3923 }
3924
3925 PyErr_Clear();
3926 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3927 i = 0;
3928 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3929 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3930 r=-1;
3931 break;
3932 }
3933 }
3934 Py_DECREF(instdict);
3935 }
3936 else r=-1;
3937
3938 Py_XDECREF(value);
3939
3940 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941}
3942
3943
3944static int
Tim Peterscba30e22003-02-01 06:24:36 +00003945load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946{
3947 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 /* Note that we split the (pickle.py) stack into two stacks, an
3950 object stack and a mark stack. Here we push a mark onto the
3951 mark stack.
3952 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 if ((self->num_marks + 1) >= self->marks_size) {
3955 s=self->marks_size+20;
3956 if (s <= self->num_marks) s=self->num_marks + 1;
3957 if (self->marks == NULL)
3958 self->marks=(int *)malloc(s * sizeof(int));
3959 else
Tim Peterscba30e22003-02-01 06:24:36 +00003960 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 s * sizeof(int));
3962 if (! self->marks) {
3963 PyErr_NoMemory();
3964 return -1;
3965 }
3966 self->marks_size = s;
3967 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003969 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972}
3973
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974static int
Tim Peterscba30e22003-02-01 06:24:36 +00003975load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976{
3977 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003979 PDATA_POP(self->stack, arg_tup);
3980 if (! arg_tup) return -1;
3981 PDATA_POP(self->stack, callable);
3982 if (callable) {
3983 ob = Instance_New(callable, arg_tup);
3984 Py_DECREF(callable);
3985 }
3986 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 PDATA_PUSH(self->stack, ob, -1);
3991 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003992}
Tim Peters84e87f32001-03-17 04:50:51 +00003993
Tim Peters4190fb82003-02-02 16:09:05 +00003994/* Just raises an error if we don't know the protocol specified. PROTO
3995 * is the first opcode for protocols >= 2.
3996 */
3997static int
3998load_proto(Unpicklerobject *self)
3999{
4000 int i;
4001 char *protobyte;
4002
4003 i = self->read_func(self, &protobyte, 1);
4004 if (i < 0)
4005 return -1;
4006
4007 i = calc_binint(protobyte, 1);
4008 /* No point checking for < 0, since calc_binint returns an unsigned
4009 * int when chewing on 1 byte.
4010 */
4011 assert(i >= 0);
4012 if (i <= CURRENT_PROTOCOL_NUMBER)
4013 return 0;
4014
4015 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4016 return -1;
4017}
4018
Guido van Rossum60456fd1997-04-09 17:36:32 +00004019static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004020load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021{
4022 PyObject *err = 0, *val = 0;
4023 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004025 self->num_marks = 0;
4026 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004028 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004029 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004030 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004032 switch (s[0]) {
4033 case NONE:
4034 if (load_none(self) < 0)
4035 break;
4036 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038 case BININT:
4039 if (load_binint(self) < 0)
4040 break;
4041 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043 case BININT1:
4044 if (load_binint1(self) < 0)
4045 break;
4046 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048 case BININT2:
4049 if (load_binint2(self) < 0)
4050 break;
4051 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004053 case INT:
4054 if (load_int(self) < 0)
4055 break;
4056 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004058 case LONG:
4059 if (load_long(self) < 0)
4060 break;
4061 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004062
Tim Petersee1a53c2003-02-02 02:57:53 +00004063 case LONG1:
4064 if (load_counted_long(self, 1) < 0)
4065 break;
4066 continue;
4067
4068 case LONG4:
4069 if (load_counted_long(self, 4) < 0)
4070 break;
4071 continue;
4072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 case FLOAT:
4074 if (load_float(self) < 0)
4075 break;
4076 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078 case BINFLOAT:
4079 if (load_binfloat(self) < 0)
4080 break;
4081 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004083 case BINSTRING:
4084 if (load_binstring(self) < 0)
4085 break;
4086 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 case SHORT_BINSTRING:
4089 if (load_short_binstring(self) < 0)
4090 break;
4091 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 case STRING:
4094 if (load_string(self) < 0)
4095 break;
4096 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004097
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004098#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 case UNICODE:
4100 if (load_unicode(self) < 0)
4101 break;
4102 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 case BINUNICODE:
4105 if (load_binunicode(self) < 0)
4106 break;
4107 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004108#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004111 if (load_counted_tuple(self, 0) < 0)
4112 break;
4113 continue;
4114
4115 case TUPLE1:
4116 if (load_counted_tuple(self, 1) < 0)
4117 break;
4118 continue;
4119
4120 case TUPLE2:
4121 if (load_counted_tuple(self, 2) < 0)
4122 break;
4123 continue;
4124
4125 case TUPLE3:
4126 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 break;
4128 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 case TUPLE:
4131 if (load_tuple(self) < 0)
4132 break;
4133 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004135 case EMPTY_LIST:
4136 if (load_empty_list(self) < 0)
4137 break;
4138 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 case LIST:
4141 if (load_list(self) < 0)
4142 break;
4143 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 case EMPTY_DICT:
4146 if (load_empty_dict(self) < 0)
4147 break;
4148 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004150 case DICT:
4151 if (load_dict(self) < 0)
4152 break;
4153 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 case OBJ:
4156 if (load_obj(self) < 0)
4157 break;
4158 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 case INST:
4161 if (load_inst(self) < 0)
4162 break;
4163 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004165 case GLOBAL:
4166 if (load_global(self) < 0)
4167 break;
4168 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 case APPEND:
4171 if (load_append(self) < 0)
4172 break;
4173 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175 case APPENDS:
4176 if (load_appends(self) < 0)
4177 break;
4178 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 case BUILD:
4181 if (load_build(self) < 0)
4182 break;
4183 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 case DUP:
4186 if (load_dup(self) < 0)
4187 break;
4188 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 case BINGET:
4191 if (load_binget(self) < 0)
4192 break;
4193 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 case LONG_BINGET:
4196 if (load_long_binget(self) < 0)
4197 break;
4198 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 case GET:
4201 if (load_get(self) < 0)
4202 break;
4203 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205 case MARK:
4206 if (load_mark(self) < 0)
4207 break;
4208 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 case BINPUT:
4211 if (load_binput(self) < 0)
4212 break;
4213 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 case LONG_BINPUT:
4216 if (load_long_binput(self) < 0)
4217 break;
4218 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220 case PUT:
4221 if (load_put(self) < 0)
4222 break;
4223 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 case POP:
4226 if (load_pop(self) < 0)
4227 break;
4228 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 case POP_MARK:
4231 if (load_pop_mark(self) < 0)
4232 break;
4233 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case SETITEM:
4236 if (load_setitem(self) < 0)
4237 break;
4238 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case SETITEMS:
4241 if (load_setitems(self) < 0)
4242 break;
4243 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case STOP:
4246 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248 case PERSID:
4249 if (load_persid(self) < 0)
4250 break;
4251 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 case BINPERSID:
4254 if (load_binpersid(self) < 0)
4255 break;
4256 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 case REDUCE:
4259 if (load_reduce(self) < 0)
4260 break;
4261 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262
Tim Peters4190fb82003-02-02 16:09:05 +00004263 case PROTO:
4264 if (load_proto(self) < 0)
4265 break;
4266 continue;
4267
Tim Peters3c67d792003-02-02 17:59:11 +00004268 case NEWTRUE:
4269 if (load_bool(self, Py_True) < 0)
4270 break;
4271 continue;
4272
4273 case NEWFALSE:
4274 if (load_bool(self, Py_False) < 0)
4275 break;
4276 continue;
4277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 case '\0':
4279 /* end of file */
4280 PyErr_SetNone(PyExc_EOFError);
4281 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004284 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 "invalid load key, '%s'.",
4286 "c", s[0]);
4287 return NULL;
4288 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 break;
4291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 if ((err = PyErr_Occurred())) {
4294 if (err == PyExc_EOFError) {
4295 PyErr_SetNone(PyExc_EOFError);
4296 }
4297 return NULL;
4298 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 PDATA_POP(self->stack, val);
4301 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302}
Tim Peters84e87f32001-03-17 04:50:51 +00004303
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004305/* No-load functions to support noload, which is used to
4306 find persistent references. */
4307
4308static int
Tim Peterscba30e22003-02-01 06:24:36 +00004309noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310{
4311 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 if ((i = marker(self)) < 0) return -1;
4314 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004315}
4316
4317
4318static int
Tim Peterscba30e22003-02-01 06:24:36 +00004319noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320{
4321 int i;
4322 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324 if ((i = marker(self)) < 0) return -1;
4325 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004326 if (self->readline_func(self, &s) < 0) return -1;
4327 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328 PDATA_APPEND(self->stack, Py_None,-1);
4329 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004330}
4331
4332static int
Tim Peterscba30e22003-02-01 06:24:36 +00004333noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334{
4335 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004336
Tim Peters0bc93f52003-02-02 18:29:33 +00004337 if (self->readline_func(self, &s) < 0) return -1;
4338 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004339 PDATA_APPEND(self->stack, Py_None,-1);
4340 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004341}
4342
4343static int
Tim Peterscba30e22003-02-01 06:24:36 +00004344noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 if (self->stack->length < 2) return stackUnderflow();
4348 Pdata_clear(self->stack, self->stack->length-2);
4349 PDATA_APPEND(self->stack, Py_None,-1);
4350 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004351}
4352
4353static int
4354noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004355
Guido van Rossum053b8df1998-11-25 16:18:00 +00004356 if (self->stack->length < 1) return stackUnderflow();
4357 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004358 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004359}
4360
4361
4362static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004363noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364{
4365 PyObject *err = 0, *val = 0;
4366 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 self->num_marks = 0;
4369 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004372 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 switch (s[0]) {
4376 case NONE:
4377 if (load_none(self) < 0)
4378 break;
4379 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 case BININT:
4382 if (load_binint(self) < 0)
4383 break;
4384 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 case BININT1:
4387 if (load_binint1(self) < 0)
4388 break;
4389 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 case BININT2:
4392 if (load_binint2(self) < 0)
4393 break;
4394 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 case INT:
4397 if (load_int(self) < 0)
4398 break;
4399 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 case LONG:
4402 if (load_long(self) < 0)
4403 break;
4404 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004405
Tim Peters4190fb82003-02-02 16:09:05 +00004406 case LONG1:
4407 if (load_counted_long(self, 1) < 0)
4408 break;
4409 continue;
4410
4411 case LONG4:
4412 if (load_counted_long(self, 4) < 0)
4413 break;
4414 continue;
4415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 case FLOAT:
4417 if (load_float(self) < 0)
4418 break;
4419 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 case BINFLOAT:
4422 if (load_binfloat(self) < 0)
4423 break;
4424 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426 case BINSTRING:
4427 if (load_binstring(self) < 0)
4428 break;
4429 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 case SHORT_BINSTRING:
4432 if (load_short_binstring(self) < 0)
4433 break;
4434 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436 case STRING:
4437 if (load_string(self) < 0)
4438 break;
4439 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004440
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004441#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 case UNICODE:
4443 if (load_unicode(self) < 0)
4444 break;
4445 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 case BINUNICODE:
4448 if (load_binunicode(self) < 0)
4449 break;
4450 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004451#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004454 if (load_counted_tuple(self, 0) < 0)
4455 break;
4456 continue;
4457
4458 case TUPLE1:
4459 if (load_counted_tuple(self, 1) < 0)
4460 break;
4461 continue;
4462
4463 case TUPLE2:
4464 if (load_counted_tuple(self, 2) < 0)
4465 break;
4466 continue;
4467
4468 case TUPLE3:
4469 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 break;
4471 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 case TUPLE:
4474 if (load_tuple(self) < 0)
4475 break;
4476 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 case EMPTY_LIST:
4479 if (load_empty_list(self) < 0)
4480 break;
4481 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004483 case LIST:
4484 if (load_list(self) < 0)
4485 break;
4486 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488 case EMPTY_DICT:
4489 if (load_empty_dict(self) < 0)
4490 break;
4491 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493 case DICT:
4494 if (load_dict(self) < 0)
4495 break;
4496 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004498 case OBJ:
4499 if (noload_obj(self) < 0)
4500 break;
4501 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 case INST:
4504 if (noload_inst(self) < 0)
4505 break;
4506 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004508 case GLOBAL:
4509 if (noload_global(self) < 0)
4510 break;
4511 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 case APPEND:
4514 if (load_append(self) < 0)
4515 break;
4516 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 case APPENDS:
4519 if (load_appends(self) < 0)
4520 break;
4521 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 case BUILD:
4524 if (noload_build(self) < 0)
4525 break;
4526 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 case DUP:
4529 if (load_dup(self) < 0)
4530 break;
4531 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 case BINGET:
4534 if (load_binget(self) < 0)
4535 break;
4536 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 case LONG_BINGET:
4539 if (load_long_binget(self) < 0)
4540 break;
4541 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543 case GET:
4544 if (load_get(self) < 0)
4545 break;
4546 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 case MARK:
4549 if (load_mark(self) < 0)
4550 break;
4551 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 case BINPUT:
4554 if (load_binput(self) < 0)
4555 break;
4556 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 case LONG_BINPUT:
4559 if (load_long_binput(self) < 0)
4560 break;
4561 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 case PUT:
4564 if (load_put(self) < 0)
4565 break;
4566 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568 case POP:
4569 if (load_pop(self) < 0)
4570 break;
4571 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004573 case POP_MARK:
4574 if (load_pop_mark(self) < 0)
4575 break;
4576 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 case SETITEM:
4579 if (load_setitem(self) < 0)
4580 break;
4581 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 case SETITEMS:
4584 if (load_setitems(self) < 0)
4585 break;
4586 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 case STOP:
4589 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 case PERSID:
4592 if (load_persid(self) < 0)
4593 break;
4594 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 case BINPERSID:
4597 if (load_binpersid(self) < 0)
4598 break;
4599 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 case REDUCE:
4602 if (noload_reduce(self) < 0)
4603 break;
4604 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004605
Tim Peters4190fb82003-02-02 16:09:05 +00004606 case PROTO:
4607 if (load_proto(self) < 0)
4608 break;
4609 continue;
4610
Tim Peters3c67d792003-02-02 17:59:11 +00004611 case NEWTRUE:
4612 if (load_bool(self, Py_True) < 0)
4613 break;
4614 continue;
4615
4616 case NEWFALSE:
4617 if (load_bool(self, Py_False) < 0)
4618 break;
4619 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004620 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004621 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 "invalid load key, '%s'.",
4623 "c", s[0]);
4624 return NULL;
4625 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 break;
4628 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630 if ((err = PyErr_Occurred())) {
4631 if (err == PyExc_EOFError) {
4632 PyErr_SetNone(PyExc_EOFError);
4633 }
4634 return NULL;
4635 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 PDATA_POP(self->stack, val);
4638 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004639}
Tim Peters84e87f32001-03-17 04:50:51 +00004640
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004641
Guido van Rossum60456fd1997-04-09 17:36:32 +00004642static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004643Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644{
Tim Peterscba30e22003-02-01 06:24:36 +00004645 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004649}
4650
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004652Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004653{
Tim Peterscba30e22003-02-01 06:24:36 +00004654 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004655 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004657 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004658}
4659
Guido van Rossum60456fd1997-04-09 17:36:32 +00004660
4661static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004662 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004663 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004664 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004665 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004666 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004667 "noload() -- not load a pickle, but go through most of the motions\n"
4668 "\n"
4669 "This function can be used to read past a pickle without instantiating\n"
4670 "any objects or importing any modules. It can also be used to find all\n"
4671 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004672 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004674 {NULL, NULL} /* sentinel */
4675};
4676
4677
4678static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004679newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680{
4681 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Tim Peterscba30e22003-02-01 06:24:36 +00004683 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 self->file = NULL;
4687 self->arg = NULL;
4688 self->stack = (Pdata*)Pdata_New();
4689 self->pers_func = NULL;
4690 self->last_string = NULL;
4691 self->marks = NULL;
4692 self->num_marks = 0;
4693 self->marks_size = 0;
4694 self->buf_size = 0;
4695 self->read = NULL;
4696 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004698
Tim Peterscba30e22003-02-01 06:24:36 +00004699 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 Py_INCREF(f);
4703 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 /* Set read, readline based on type of f */
4706 if (PyFile_Check(f)) {
4707 self->fp = PyFile_AsFile(f);
4708 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004709 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 "I/O operation on closed file");
4711 goto err;
4712 }
4713 self->read_func = read_file;
4714 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004715 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 else if (PycStringIO_InputCheck(f)) {
4717 self->fp = NULL;
4718 self->read_func = read_cStringIO;
4719 self->readline_func = readline_cStringIO;
4720 }
4721 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 self->fp = NULL;
4724 self->read_func = read_other;
4725 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4728 (self->read = PyObject_GetAttr(f, read_str)))) {
4729 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004730 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 "argument must have 'read' and "
4732 "'readline' attributes" );
4733 goto err;
4734 }
4735 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 err:
4740 Py_DECREF((PyObject *)self);
4741 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004742}
4743
4744
4745static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004746get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747{
4748 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004749
Tim Peterscba30e22003-02-01 06:24:36 +00004750 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 return NULL;
4752 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004753}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004754
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004755
Guido van Rossum60456fd1997-04-09 17:36:32 +00004756static void
Tim Peterscba30e22003-02-01 06:24:36 +00004757Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758{
4759 Py_XDECREF(self->readline);
4760 Py_XDECREF(self->read);
4761 Py_XDECREF(self->file);
4762 Py_XDECREF(self->memo);
4763 Py_XDECREF(self->stack);
4764 Py_XDECREF(self->pers_func);
4765 Py_XDECREF(self->arg);
4766 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 if (self->marks) {
4769 free(self->marks);
4770 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 if (self->buf_size) {
4773 free(self->buf);
4774 }
Tim Peters84e87f32001-03-17 04:50:51 +00004775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004777}
4778
4779
4780static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004781Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782{
4783 if (!strcmp(name, "persistent_load")) {
4784 if (!self->pers_func) {
4785 PyErr_SetString(PyExc_AttributeError, name);
4786 return NULL;
4787 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 Py_INCREF(self->pers_func);
4790 return self->pers_func;
4791 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 if (!strcmp(name, "find_global")) {
4794 if (!self->find_class) {
4795 PyErr_SetString(PyExc_AttributeError, name);
4796 return NULL;
4797 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 Py_INCREF(self->find_class);
4800 return self->find_class;
4801 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 if (!strcmp(name, "memo")) {
4804 if (!self->memo) {
4805 PyErr_SetString(PyExc_AttributeError, name);
4806 return NULL;
4807 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 Py_INCREF(self->memo);
4810 return self->memo;
4811 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 if (!strcmp(name, "UnpicklingError")) {
4814 Py_INCREF(UnpicklingError);
4815 return UnpicklingError;
4816 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004819}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004820
Guido van Rossum60456fd1997-04-09 17:36:32 +00004821
4822static int
Tim Peterscba30e22003-02-01 06:24:36 +00004823Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004826 if (!strcmp(name, "persistent_load")) {
4827 Py_XDECREF(self->pers_func);
4828 self->pers_func = value;
4829 Py_XINCREF(value);
4830 return 0;
4831 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 if (!strcmp(name, "find_global")) {
4834 Py_XDECREF(self->find_class);
4835 self->find_class = value;
4836 Py_XINCREF(value);
4837 return 0;
4838 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004840 if (! value) {
4841 PyErr_SetString(PyExc_TypeError,
4842 "attribute deletion is not supported");
4843 return -1;
4844 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004846 if (strcmp(name, "memo") == 0) {
4847 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004848 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 "memo must be a dictionary");
4850 return -1;
4851 }
4852 Py_XDECREF(self->memo);
4853 self->memo = value;
4854 Py_INCREF(value);
4855 return 0;
4856 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 PyErr_SetString(PyExc_AttributeError, name);
4859 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004860}
4861
Tim Peters5bd2a792003-02-01 16:45:06 +00004862/* ---------------------------------------------------------------------------
4863 * Module-level functions.
4864 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004865
Tim Peters5bd2a792003-02-01 16:45:06 +00004866/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004867static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004868cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869{
4870 PyObject *ob, *file, *res = NULL;
4871 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004872 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004873
Tim Peters5bd2a792003-02-01 16:45:06 +00004874 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004875 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004876
Tim Peters5bd2a792003-02-01 16:45:06 +00004877 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004880 if (dump(pickler, ob) < 0)
4881 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 Py_INCREF(Py_None);
4884 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004886 finally:
4887 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004890}
4891
4892
Tim Peters5bd2a792003-02-01 16:45:06 +00004893/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004894static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004895cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004896{
4897 PyObject *ob, *file = 0, *res = NULL;
4898 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004899 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004900
Tim Peters5bd2a792003-02-01 16:45:06 +00004901 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004903
Tim Peterscba30e22003-02-01 06:24:36 +00004904 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004905 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004906
Tim Peters5bd2a792003-02-01 16:45:06 +00004907 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910 if (dump(pickler, ob) < 0)
4911 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004913 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915 finally:
4916 Py_XDECREF(pickler);
4917 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004920}
4921
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004922
Tim Peters5bd2a792003-02-01 16:45:06 +00004923/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004924static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004925cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926{
4927 Unpicklerobject *unpickler = 0;
4928 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004929
Tim Peterscba30e22003-02-01 06:24:36 +00004930 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004931 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004932
Tim Peterscba30e22003-02-01 06:24:36 +00004933 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004936 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938 finally:
4939 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004942}
4943
4944
Tim Peters5bd2a792003-02-01 16:45:06 +00004945/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004946static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004947cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948{
4949 PyObject *ob, *file = 0, *res = NULL;
4950 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004951
Tim Peterscba30e22003-02-01 06:24:36 +00004952 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004954
Tim Peterscba30e22003-02-01 06:24:36 +00004955 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004957
Tim Peterscba30e22003-02-01 06:24:36 +00004958 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004961 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 finally:
4964 Py_XDECREF(file);
4965 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004968}
4969
4970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004971PyDoc_STRVAR(Unpicklertype__doc__,
4972"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004973
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004974static PyTypeObject Unpicklertype = {
4975 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004976 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004977 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004978 sizeof(Unpicklerobject), /*tp_basicsize*/
4979 0, /*tp_itemsize*/
4980 /* methods */
4981 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4982 (printfunc)0, /*tp_print*/
4983 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4984 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4985 (cmpfunc)0, /*tp_compare*/
4986 (reprfunc)0, /*tp_repr*/
4987 0, /*tp_as_number*/
4988 0, /*tp_as_sequence*/
4989 0, /*tp_as_mapping*/
4990 (hashfunc)0, /*tp_hash*/
4991 (ternaryfunc)0, /*tp_call*/
4992 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004993
Guido van Rossum60456fd1997-04-09 17:36:32 +00004994 /* Space for future expansion */
4995 0L,0L,0L,0L,
4996 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004997};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004998
Guido van Rossum60456fd1997-04-09 17:36:32 +00004999static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005000 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005001 PyDoc_STR("dump(object, file, proto=0) -- "
5002 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005003 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005004 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005005 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005006
Neal Norwitzb0493252002-03-31 14:44:22 +00005007 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005008 PyDoc_STR("dumps(object, proto=0) -- "
5009 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005010 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005011 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005012 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005013
Neal Norwitzb0493252002-03-31 14:44:22 +00005014 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005015 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005016
Neal Norwitzb0493252002-03-31 14:44:22 +00005017 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005018 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005019
Neal Norwitzb0493252002-03-31 14:44:22 +00005020 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005021 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005022 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005023 "This takes a file-like object for writing a pickle data stream.\n"
5024 "The optional proto argument tells the pickler to use the given\n"
5025 "protocol; supported protocols are 0, 1, 2. The default\n"
5026 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5027 "only protocol that can be written to a file opened in text\n"
5028 "mode and read back successfully. When using a protocol higher\n"
5029 "than 0, make sure the file is opened in binary mode, both when\n"
5030 "pickling and unpickling.)\n"
5031 "\n"
5032 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5033 "more efficient than protocol 1.\n"
5034 "\n"
5035 "Specifying a negative protocol version selects the highest\n"
5036 "protocol version supported. The higher the protocol used, the\n"
5037 "more recent the version of Python needed to read the pickle\n"
5038 "produced.\n"
5039 "\n"
5040 "The file parameter must have a write() method that accepts a single\n"
5041 "string argument. It can thus be an open file object, a StringIO\n"
5042 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005043 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005044
Neal Norwitzb0493252002-03-31 14:44:22 +00005045 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005046 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5047
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005048 { NULL, NULL }
5049};
5050
Guido van Rossum60456fd1997-04-09 17:36:32 +00005051static int
Tim Peterscba30e22003-02-01 06:24:36 +00005052init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053{
5054 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005055
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005056#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058 INIT_STR(__class__);
5059 INIT_STR(__getinitargs__);
5060 INIT_STR(__dict__);
5061 INIT_STR(__getstate__);
5062 INIT_STR(__setstate__);
5063 INIT_STR(__name__);
5064 INIT_STR(__main__);
5065 INIT_STR(__reduce__);
5066 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067 INIT_STR(append);
5068 INIT_STR(read);
5069 INIT_STR(readline);
5070 INIT_STR(copy_reg);
5071 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005073
Tim Peterscba30e22003-02-01 06:24:36 +00005074 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005075 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005076
Tim Peters1f1b2d22003-02-01 02:16:37 +00005077 /* This is special because we want to use a different
5078 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005079 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00005080 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005083 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005084
Tim Peterscba30e22003-02-01 06:24:36 +00005085 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005088 /* Ugh */
5089 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5090 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5091 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005093 if (!( t=PyDict_New())) return -1;
5094 if (!( r=PyRun_String(
5095 "def __init__(self, *args): self.args=args\n\n"
5096 "def __str__(self):\n"
5097 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5098 Py_file_input,
5099 module_dict, t) )) return -1;
5100 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005102 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005103 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005104 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005106 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005107
Tim Peterscba30e22003-02-01 06:24:36 +00005108 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005109 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005110 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005111 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005113 if (!( t=PyDict_New())) return -1;
5114 if (!( r=PyRun_String(
5115 "def __init__(self, *args): self.args=args\n\n"
5116 "def __str__(self):\n"
5117 " a=self.args\n"
5118 " a=a and type(a[0]) or '(what)'\n"
5119 " return 'Cannot pickle %s objects' % a\n"
5120 , Py_file_input,
5121 module_dict, t) )) return -1;
5122 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005124 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005125 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005130 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005131 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005133
Martin v. Löwis658009a2002-09-16 17:26:24 +00005134 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5135 UnpicklingError, NULL)))
5136 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 if (PyDict_SetItemString(module_dict, "PickleError",
5139 PickleError) < 0)
5140 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005142 if (PyDict_SetItemString(module_dict, "PicklingError",
5143 PicklingError) < 0)
5144 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005146 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5147 UnpicklingError) < 0)
5148 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005150 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5151 UnpickleableError) < 0)
5152 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5155 BadPickleGet) < 0)
5156 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005158 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005160 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005161}
5162
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005163#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5164#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005165#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005166PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005167initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168{
5169 PyObject *m, *d, *di, *v, *k;
5170 int i;
5171 char *rev="1.71";
5172 PyObject *format_version;
5173 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005176 Unpicklertype.ob_type = &PyType_Type;
5177 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 /* Initialize some pieces. We need to do this before module creation,
5180 so we're forced to use a temporary dictionary. :(
5181 */
5182 di=PyDict_New();
5183 if (!di) return;
5184 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005186 /* Create the module and add the functions */
5187 m = Py_InitModule4("cPickle", cPickle_methods,
5188 cPickle_module_documentation,
5189 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005191 /* Add some symbolic constants to the module */
5192 d = PyModule_GetDict(m);
5193 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5194 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005196 /* Copy data from di. Waaa. */
5197 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5198 if (PyObject_SetItem(d, k, v) < 0) {
5199 Py_DECREF(di);
5200 return;
5201 }
5202 }
5203 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005205 format_version = PyString_FromString("1.3");
5206 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 PyDict_SetItemString(d, "format_version", format_version);
5209 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5210 Py_XDECREF(format_version);
5211 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005212}