blob: bb0d281f0fe6d013a7c2f2630bfc03a6f380ba15 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001/*
Guido van Rossum2f80d961999-07-13 15:18:58 +00002 * cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp
Tim Peters84e87f32001-03-17 04:50:51 +00003 *
4 * Copyright (c) 1996-1998, Digital Creations, Fredericksburg, VA, USA.
Guido van Rossum053b8df1998-11-25 16:18:00 +00005 * All rights reserved.
Tim Peters84e87f32001-03-17 04:50:51 +00006 *
Guido van Rossum053b8df1998-11-25 16:18:00 +00007 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
Tim Peters84e87f32001-03-17 04:50:51 +000010 *
Guido van Rossum053b8df1998-11-25 16:18:00 +000011 * o Redistributions of source code must retain the above copyright
12 * notice, this list of conditions, and the disclaimer that follows.
Tim Peters84e87f32001-03-17 04:50:51 +000013 *
Guido van Rossum053b8df1998-11-25 16:18:00 +000014 * o Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions, and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
Tim Peters84e87f32001-03-17 04:50:51 +000018 *
Guido van Rossum053b8df1998-11-25 16:18:00 +000019 * o Neither the name of Digital Creations nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
Tim Peters84e87f32001-03-17 04:50:51 +000022 *
23 *
Guido van Rossum053b8df1998-11-25 16:18:00 +000024 * THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *AS
25 * IS* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL
28 * CREATIONS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
31 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
33 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
34 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
35 * DAMAGE.
Tim Peters84e87f32001-03-17 04:50:51 +000036 *
37 #
Guido van Rossum053b8df1998-11-25 16:18:00 +000038 # If you have questions regarding this software, contact:
39 #
40 # Digital Creations, L.C.
41 # 910 Princess Ann Street
42 # Fredericksburge, Virginia 22401
43 #
44 # info@digicool.com
45 #
46 # (540) 371-6909
47 */
Guido van Rossum2f4caa41997-01-06 22:59:08 +000048
Tim Peters84e87f32001-03-17 04:50:51 +000049static char cPickle_module_documentation[] =
Guido van Rossum142eeb81997-08-13 03:14:41 +000050"C implementation and optimization of the Python pickle module\n"
51"\n"
Guido van Rossum2f80d961999-07-13 15:18:58 +000052"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000053;
54
55#include "Python.h"
56#include "cStringIO.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000057
Guido van Rossum142eeb81997-08-13 03:14:41 +000058#ifndef Py_eval_input
59#include <graminit.h>
60#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000061#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000062
Guido van Rossum2f4caa41997-01-06 22:59:08 +000063#include <errno.h>
64
Guido van Rossum2f4caa41997-01-06 22:59:08 +000065#define UNLESS(E) if (!(E))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000066
Guido van Rossum60456fd1997-04-09 17:36:32 +000067#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000068
Guido van Rossum60456fd1997-04-09 17:36:32 +000069#define WRITE_BUF_SIZE 256
70
Tim Peters3906eb82001-04-10 04:22:00 +000071/* --------------------------------------------------------------------------
72NOTES on format codes.
73XXX much more is needed here
74
75Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000076BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000077BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000078BININT 32-bit signed integer; followed by 4 bytes, little-endian.
79INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000080 CAUTION: INT-reading code can't assume that what follows
81 fits in a Python int, because the size of Python ints varies
82 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000083LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000084-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000085
86#define MARK '('
87#define STOP '.'
88#define POP '0'
89#define POP_MARK '1'
90#define DUP '2'
91#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000092#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000093#define INT 'I'
94#define BININT 'J'
95#define BININT1 'K'
96#define LONG 'L'
97#define BININT2 'M'
98#define NONE 'N'
99#define PERSID 'P'
100#define BINPERSID 'Q'
101#define REDUCE 'R'
102#define STRING 'S'
103#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000104#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +0000105#define UNICODE 'V'
106#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +0000107#define APPEND 'a'
108#define BUILD 'b'
109#define GLOBAL 'c'
110#define DICT 'd'
111#define EMPTY_DICT '}'
112#define APPENDS 'e'
113#define GET 'g'
114#define BINGET 'h'
115#define INST 'i'
116#define LONG_BINGET 'j'
117#define LIST 'l'
118#define EMPTY_LIST ']'
119#define OBJ 'o'
120#define PUT 'p'
121#define BINPUT 'q'
122#define LONG_BINPUT 'r'
123#define SETITEM 's'
124#define TUPLE 't'
125#define EMPTY_TUPLE ')'
126#define SETITEMS 'u'
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000127
Guido van Rossum60456fd1997-04-09 17:36:32 +0000128static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000129
Guido van Rossumc03158b1999-06-09 15:23:31 +0000130static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000131static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000132static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000133static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000134static PyObject *BadPickleGet;
135
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000136
Guido van Rossum60456fd1997-04-09 17:36:32 +0000137static PyObject *dispatch_table;
138static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000139static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000140
Guido van Rossum60456fd1997-04-09 17:36:32 +0000141static PyObject *__class___str, *__getinitargs___str, *__dict___str,
142 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
143 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000144 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000145 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000146
Guido van Rossum053b8df1998-11-25 16:18:00 +0000147#ifndef PyList_SET_ITEM
148#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))
149#endif
150#ifndef PyList_GET_SIZE
151#define PyList_GET_SIZE(op) (((PyListObject *)(op))->ob_size)
152#endif
153#ifndef PyTuple_SET_ITEM
154#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = (v))
155#endif
156#ifndef PyTuple_GET_SIZE
157#define PyTuple_GET_SIZE(op) (((PyTupleObject *)(op))->ob_size)
158#endif
159#ifndef PyString_GET_SIZE
160#define PyString_GET_SIZE(op) (((PyStringObject *)(op))->ob_size)
161#endif
162
163/*************************************************************************
164 Internal Data type for pickle data. */
165
166typedef struct {
167 PyObject_HEAD
168 int length, size;
169 PyObject **data;
170} Pdata;
171
Tim Peters84e87f32001-03-17 04:50:51 +0000172static void
Guido van Rossum053b8df1998-11-25 16:18:00 +0000173Pdata_dealloc(Pdata *self) {
174 int i;
175 PyObject **p;
176
177 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
178
179 if (self->data) free(self->data);
180
Guido van Rossumb18618d2000-05-03 23:44:39 +0000181 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
184static PyTypeObject PdataType = {
185 PyObject_HEAD_INIT(NULL) 0, "Pdata", sizeof(Pdata), 0,
186 (destructor)Pdata_dealloc,
187 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
188};
189
190#define Pdata_Check(O) ((O)->ob_type == &PdataType)
191
192static PyObject *
Thomas Wouters58d05102000-07-24 14:43:35 +0000193Pdata_New(void) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000194 Pdata *self;
195
Guido van Rossumb18618d2000-05-03 23:44:39 +0000196 UNLESS (self = PyObject_New(Pdata, &PdataType)) return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000197 self->size=8;
198 self->length=0;
199 self->data=malloc(self->size * sizeof(PyObject*));
200 if (self->data) return (PyObject*)self;
201 Py_DECREF(self);
202 return PyErr_NoMemory();
203}
204
Tim Peters84e87f32001-03-17 04:50:51 +0000205static int
Thomas Wouters58d05102000-07-24 14:43:35 +0000206stackUnderflow(void) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000207 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
208 return -1;
209}
210
211static int
212Pdata_clear(Pdata *self, int clearto) {
213 int i;
214 PyObject **p;
215
216 if (clearto < 0) return stackUnderflow();
217 if (clearto >= self->length) return 0;
218
219 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
220 Py_DECREF(*p);
221 self->length=clearto;
222
223 return 0;
224}
225
226
Tim Peters84e87f32001-03-17 04:50:51 +0000227static int
Guido van Rossum053b8df1998-11-25 16:18:00 +0000228Pdata_grow(Pdata *self) {
229 if (! self->size) {
230 PyErr_NoMemory();
231 return -1;
232 }
Tim Peters84e87f32001-03-17 04:50:51 +0000233 self->size *= 2;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000234 self->data = realloc(self->data, self->size*sizeof(PyObject*));
235 if (! self->data) {
Tim Peters84e87f32001-03-17 04:50:51 +0000236 self->size = 0;
237 PyErr_NoMemory();
238 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000239 }
240 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000241}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000242
243#define PDATA_POP(D,V) { \
244 if ((D)->length) V=D->data[--((D)->length)]; \
245 else { \
246 PyErr_SetString(UnpicklingError, "bad pickle data"); \
247 V=NULL; \
248 } \
249}
250
251
252static PyObject *
253Pdata_popTuple(Pdata *self, int start) {
254 PyObject *r;
255 int i, j, l;
256
257 l=self->length-start;
258 UNLESS (r=PyTuple_New(l)) return NULL;
Guido van Rossumea2b7152000-05-09 18:14:50 +0000259 for (i=start, j=0 ; j < l; i++, j++)
260 PyTuple_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000261
262 self->length=start;
263 return r;
264}
265
266static PyObject *
267Pdata_popList(Pdata *self, int start) {
268 PyObject *r;
269 int i, j, l;
270
271 l=self->length-start;
272 UNLESS (r=PyList_New(l)) return NULL;
Guido van Rossumea2b7152000-05-09 18:14:50 +0000273 for (i=start, j=0 ; j < l; i++, j++)
274 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000275
276 self->length=start;
277 return r;
278}
279
280#define PDATA_APPEND_(D,O,ER) { \
281 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
282}
283
284#define PDATA_APPEND(D,O,ER) { \
285 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
286 Pdata_grow((Pdata*)(D)) < 0) \
287 return ER; \
288 Py_INCREF(O); \
289 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
290}
291
292#define PDATA_PUSH(D,O,ER) { \
293 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
294 Pdata_grow((Pdata*)(D)) < 0) { \
295 Py_DECREF(O); \
296 return ER; \
297 } \
298 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
299}
300
301/*************************************************************************/
302
303#define ARG_TUP(self, o) { \
304 if (self->arg || (self->arg=PyTuple_New(1))) { \
305 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
306 PyTuple_SET_ITEM(self->arg,0,o); \
307 } \
308 else { \
309 Py_DECREF(o); \
310 } \
311}
312
313#define FREE_ARG_TUP(self) { \
314 if (self->arg->ob_refcnt > 1) { \
315 Py_DECREF(self->arg); \
316 self->arg=NULL; \
317 } \
318 }
319
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000320typedef struct Picklerobject {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000321 PyObject_HEAD
322 FILE *fp;
323 PyObject *write;
324 PyObject *file;
325 PyObject *memo;
326 PyObject *arg;
327 PyObject *pers_func;
328 PyObject *inst_pers_func;
329 int bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000330 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000331 int (*write_func)(struct Picklerobject *, char *, int);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000332 char *write_buf;
333 int buf_size;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000334 PyObject *dispatch_table;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000335} Picklerobject;
336
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000337staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000338
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000339typedef struct Unpicklerobject {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000340 PyObject_HEAD
341 FILE *fp;
342 PyObject *file;
343 PyObject *readline;
344 PyObject *read;
345 PyObject *memo;
346 PyObject *arg;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000347 Pdata *stack;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000348 PyObject *mark;
349 PyObject *pers_func;
350 PyObject *last_string;
351 int *marks;
352 int num_marks;
353 int marks_size;
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000354 int (*read_func)(struct Unpicklerobject *, char **, int);
355 int (*readline_func)(struct Unpicklerobject *, char **);
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000356 int buf_size;
357 char *buf;
358 PyObject *safe_constructors;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +0000359 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000360} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000361
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000362staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000363
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000364/* Forward decls that need the above structs */
365static int save(Picklerobject *, PyObject *, int);
366static int put2(Picklerobject *, PyObject *);
367
Tim Peters84e87f32001-03-17 04:50:51 +0000368int
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000369cPickle_PyMapping_HasKey(PyObject *o, PyObject *key) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000370 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000371
Guido van Rossum053b8df1998-11-25 16:18:00 +0000372 if ((v = PyObject_GetItem(o,key))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000373 Py_DECREF(v);
374 return 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000375 }
376
Guido van Rossum60456fd1997-04-09 17:36:32 +0000377 PyErr_Clear();
378 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000379}
380
Guido van Rossumd385d591997-04-09 17:47:47 +0000381static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000382PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000383cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
384{
Guido van Rossum60456fd1997-04-09 17:36:32 +0000385 va_list va;
386 PyObject *args=0, *retval=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000387 va_start(va, format);
Tim Peters84e87f32001-03-17 04:50:51 +0000388
Guido van Rossum053b8df1998-11-25 16:18:00 +0000389 if (format) args = Py_VaBuildValue(format, va);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000390 va_end(va);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000391 if (format && ! args) return NULL;
392 if (stringformat && !(retval=PyString_FromString(stringformat))) return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393
Guido van Rossum053b8df1998-11-25 16:18:00 +0000394 if (retval) {
395 if (args) {
396 PyObject *v;
397 v=PyString_Format(retval, args);
398 Py_DECREF(retval);
399 Py_DECREF(args);
400 if (! v) return NULL;
401 retval=v;
402 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000403 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000404 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000405 if (args) retval=args;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000406 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000407 PyErr_SetObject(ErrType,Py_None);
408 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000409 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000410 PyErr_SetObject(ErrType,retval);
411 Py_DECREF(retval);
412 return NULL;
413}
414
Tim Peters84e87f32001-03-17 04:50:51 +0000415static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000416write_file(Picklerobject *self, char *s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000417 size_t nbyteswritten;
418
Guido van Rossum60456fd1997-04-09 17:36:32 +0000419 if (s == NULL) {
420 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000421 }
422
Tim Peters84e87f32001-03-17 04:50:51 +0000423 Py_BEGIN_ALLOW_THREADS
424 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
425 Py_END_ALLOW_THREADS
426 if (nbyteswritten != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000427 PyErr_SetFromErrno(PyExc_IOError);
428 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000430
431 return n;
432}
433
Tim Peters84e87f32001-03-17 04:50:51 +0000434static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000435write_cStringIO(Picklerobject *self, char *s, int n) {
436 if (s == NULL) {
437 return 0;
438 }
439
440 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
441 return -1;
442 }
443
444 return n;
445}
446
Tim Peters84e87f32001-03-17 04:50:51 +0000447static int
Guido van Rossum142eeb81997-08-13 03:14:41 +0000448write_none(Picklerobject *self, char *s, int n) {
449 if (s == NULL) return 0;
450 return n;
451}
452
Tim Peters84e87f32001-03-17 04:50:51 +0000453static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000454write_other(Picklerobject *self, char *s, int n) {
455 PyObject *py_str = 0, *junk = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000456
457 if (s == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000458 UNLESS (self->buf_size) return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000459 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460 PyString_FromStringAndSize(self->write_buf, self->buf_size))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000461 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000462 }
463 else {
464 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
465 if (write_other(self, NULL, 0) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000466 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000467 }
468
Tim Peters84e87f32001-03-17 04:50:51 +0000469 if (n > WRITE_BUF_SIZE) {
470 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000471 PyString_FromStringAndSize(s, n))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000472 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473 }
474 else {
475 memcpy(self->write_buf + self->buf_size, s, n);
476 self->buf_size += n;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000477 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000478 }
479 }
480
Guido van Rossum053b8df1998-11-25 16:18:00 +0000481 if (self->write) {
482 /* object with write method */
483 ARG_TUP(self, py_str);
484 if (self->arg) {
485 junk = PyObject_CallObject(self->write, self->arg);
486 FREE_ARG_TUP(self);
487 }
488 if (junk) Py_DECREF(junk);
489 else return -1;
490 }
Tim Peters84e87f32001-03-17 04:50:51 +0000491 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000492 PDATA_PUSH(self->file, py_str, -1);
Tim Peters84e87f32001-03-17 04:50:51 +0000493
494 self->buf_size = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000495 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000496}
497
498
Tim Peters84e87f32001-03-17 04:50:51 +0000499static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500read_file(Unpicklerobject *self, char **s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000501 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000502
503 if (self->buf_size == 0) {
504 int size;
505
Tim Peters84e87f32001-03-17 04:50:51 +0000506 size = ((n < 32) ? 32 : n);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000507 UNLESS (self->buf = (char *)malloc(size * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508 PyErr_NoMemory();
509 return -1;
510 }
511
512 self->buf_size = size;
513 }
514 else if (n > self->buf_size) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000515 UNLESS (self->buf = (char *)realloc(self->buf, n * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516 PyErr_NoMemory();
517 return -1;
518 }
Tim Peters84e87f32001-03-17 04:50:51 +0000519
Guido van Rossum60456fd1997-04-09 17:36:32 +0000520 self->buf_size = n;
521 }
Tim Peters84e87f32001-03-17 04:50:51 +0000522
523 Py_BEGIN_ALLOW_THREADS
524 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
525 Py_END_ALLOW_THREADS
526 if (nbytesread != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000527 if (feof(self->fp)) {
528 PyErr_SetNone(PyExc_EOFError);
529 return -1;
530 }
531
532 PyErr_SetFromErrno(PyExc_IOError);
533 return -1;
534 }
535
536 *s = self->buf;
537
538 return n;
539}
540
541
Tim Peters84e87f32001-03-17 04:50:51 +0000542static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000543readline_file(Unpicklerobject *self, char **s) {
544 int i;
545
546 if (self->buf_size == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000547 UNLESS (self->buf = (char *)malloc(40 * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000548 PyErr_NoMemory();
549 return -1;
550 }
Tim Peters84e87f32001-03-17 04:50:51 +0000551
Guido van Rossum60456fd1997-04-09 17:36:32 +0000552 self->buf_size = 40;
553 }
554
555 i = 0;
556 while (1) {
557 for (; i < (self->buf_size - 1); i++) {
558 if (feof(self->fp) || (self->buf[i] = getc(self->fp)) == '\n') {
559 self->buf[i + 1] = '\0';
560 *s = self->buf;
561 return i + 1;
562 }
563 }
564
Tim Peters84e87f32001-03-17 04:50:51 +0000565 UNLESS (self->buf = (char *)realloc(self->buf,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566 (self->buf_size * 2) * sizeof(char))) {
567 PyErr_NoMemory();
568 return -1;
569 }
570
571 self->buf_size *= 2;
572 }
573
Tim Peters84e87f32001-03-17 04:50:51 +0000574}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000575
576
Tim Peters84e87f32001-03-17 04:50:51 +0000577static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578read_cStringIO(Unpicklerobject *self, char **s, int n) {
579 char *ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000580
Guido van Rossum60456fd1997-04-09 17:36:32 +0000581 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
582 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000583 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000584 }
585
Guido van Rossum60456fd1997-04-09 17:36:32 +0000586 *s = ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000587
Guido van Rossum60456fd1997-04-09 17:36:32 +0000588 return n;
589}
590
591
Tim Peters84e87f32001-03-17 04:50:51 +0000592static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593readline_cStringIO(Unpicklerobject *self, char **s) {
594 int n;
595 char *ptr;
596
597 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
598 return -1;
599 }
600
601 *s = ptr;
602
603 return n;
604}
605
606
Tim Peters84e87f32001-03-17 04:50:51 +0000607static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608read_other(Unpicklerobject *self, char **s, int n) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000609 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Guido van Rossum053b8df1998-11-25 16:18:00 +0000611 UNLESS (bytes = PyInt_FromLong(n)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Guido van Rossum053b8df1998-11-25 16:18:00 +0000613 ARG_TUP(self, bytes);
614 if (self->arg) {
615 str = PyObject_CallObject(self->read, self->arg);
616 FREE_ARG_TUP(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000617 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000618 if (! str) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000619
620 Py_XDECREF(self->last_string);
621 self->last_string = str;
622
Guido van Rossum053b8df1998-11-25 16:18:00 +0000623 if (! (*s = PyString_AsString(str))) return -1;
624 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000625}
626
627
Tim Peters84e87f32001-03-17 04:50:51 +0000628static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629readline_other(Unpicklerobject *self, char **s) {
630 PyObject *str;
631 int str_size;
632
Guido van Rossum053b8df1998-11-25 16:18:00 +0000633 UNLESS (str = PyObject_CallObject(self->readline, empty_tuple)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634 return -1;
635 }
636
Guido van Rossum053b8df1998-11-25 16:18:00 +0000637 if ((str_size = PyString_Size(str)) < 0)
638 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000639
640 Py_XDECREF(self->last_string);
641 self->last_string = str;
642
Guido van Rossum053b8df1998-11-25 16:18:00 +0000643 if (! (*s = PyString_AsString(str)))
644 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000645
646 return str_size;
647}
648
649
650static char *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000651pystrndup(char *s, int l) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000652 char *r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000653 UNLESS (r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory();
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654 memcpy(r,s,l);
655 r[l]=0;
656 return r;
657}
658
659
660static int
661get(Picklerobject *self, PyObject *id) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000662 PyObject *value, *mv;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000663 long c_value;
664 char s[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000665 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000666
Guido van Rossum053b8df1998-11-25 16:18:00 +0000667 UNLESS (mv = PyDict_GetItem(self->memo, id)) {
668 PyErr_SetObject(PyExc_KeyError, id);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000669 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000670 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Guido van Rossum053b8df1998-11-25 16:18:00 +0000672 UNLESS (value = PyTuple_GetItem(mv, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000674
Guido van Rossum053b8df1998-11-25 16:18:00 +0000675 UNLESS (PyInt_Check(value)) {
676 PyErr_SetString(PicklingError, "no int where int expected in memo");
677 return -1;
678 }
679 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680
681 if (!self->bin) {
682 s[0] = GET;
683 sprintf(s + 1, "%ld\n", c_value);
684 len = strlen(s);
685 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000686 else if (Pdata_Check(self->file)) {
687 if (write_other(self, NULL, 0) < 0) return -1;
688 PDATA_APPEND(self->file, mv, -1);
689 return 0;
690 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000691 else {
692 if (c_value < 256) {
693 s[0] = BINGET;
694 s[1] = (int)(c_value & 0xff);
695 len = 2;
696 }
697 else {
698 s[0] = LONG_BINGET;
699 s[1] = (int)(c_value & 0xff);
700 s[2] = (int)((c_value >> 8) & 0xff);
701 s[3] = (int)((c_value >> 16) & 0xff);
702 s[4] = (int)((c_value >> 24) & 0xff);
703 len = 5;
704 }
705 }
706
707 if ((*self->write_func)(self, s, len) < 0)
708 return -1;
709
710 return 0;
711}
Tim Peters84e87f32001-03-17 04:50:51 +0000712
Guido van Rossum60456fd1997-04-09 17:36:32 +0000713
714static int
715put(Picklerobject *self, PyObject *ob) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000716 if (ob->ob_refcnt < 2 || self->fast)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717 return 0;
718
719 return put2(self, ob);
720}
721
Tim Peters84e87f32001-03-17 04:50:51 +0000722
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723static int
724put2(Picklerobject *self, PyObject *ob) {
725 char c_str[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000726 int p;
727 size_t len;
728 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000730
731 if (self->fast) return 0;
732
Guido van Rossum60456fd1997-04-09 17:36:32 +0000733 if ((p = PyDict_Size(self->memo)) < 0)
734 goto finally;
735
Guido van Rossum053b8df1998-11-25 16:18:00 +0000736 p++; /* Make sure memo keys are positive! */
737
Guido van Rossum534b7c52000-06-28 22:23:56 +0000738 UNLESS (py_ob_id = PyLong_FromVoidPtr(ob))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000739 goto finally;
740
741 UNLESS (memo_len = PyInt_FromLong(p))
742 goto finally;
743
744 UNLESS (t = PyTuple_New(2))
745 goto finally;
746
747 PyTuple_SET_ITEM(t, 0, memo_len);
748 Py_INCREF(memo_len);
749 PyTuple_SET_ITEM(t, 1, ob);
750 Py_INCREF(ob);
751
752 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
753 goto finally;
754
Guido van Rossum60456fd1997-04-09 17:36:32 +0000755 if (!self->bin) {
756 c_str[0] = PUT;
757 sprintf(c_str + 1, "%d\n", p);
758 len = strlen(c_str);
759 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000760 else if (Pdata_Check(self->file)) {
761 if (write_other(self, NULL, 0) < 0) return -1;
762 PDATA_APPEND(self->file, memo_len, -1);
763 res=0; /* Job well done ;) */
764 goto finally;
765 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000766 else {
767 if (p >= 256) {
768 c_str[0] = LONG_BINPUT;
769 c_str[1] = (int)(p & 0xff);
770 c_str[2] = (int)((p >> 8) & 0xff);
771 c_str[3] = (int)((p >> 16) & 0xff);
772 c_str[4] = (int)((p >> 24) & 0xff);
773 len = 5;
774 }
775 else {
776 c_str[0] = BINPUT;
777 c_str[1] = p;
Tim Peters84e87f32001-03-17 04:50:51 +0000778 len = 2;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000779 }
780 }
781
782 if ((*self->write_func)(self, c_str, len) < 0)
783 goto finally;
784
Guido van Rossum60456fd1997-04-09 17:36:32 +0000785 res = 0;
786
787finally:
788 Py_XDECREF(py_ob_id);
789 Py_XDECREF(memo_len);
790 Py_XDECREF(t);
791
792 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000793}
794
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000795#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000796
797static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000798PyImport_Import(PyObject *module_name) {
799 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
800 static PyObject *standard_builtins=0;
801 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
802
Guido van Rossum053b8df1998-11-25 16:18:00 +0000803 UNLESS (silly_list) {
804 UNLESS (__import___str=PyString_FromString("__import__"))
805 return NULL;
806 UNLESS (__builtins___str=PyString_FromString("__builtins__"))
807 return NULL;
808 UNLESS (silly_list=Py_BuildValue("[s]","__doc__"))
809 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000810 }
811
Guido van Rossum053b8df1998-11-25 16:18:00 +0000812 if ((globals=PyEval_GetGlobals())) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000813 Py_INCREF(globals);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000814 UNLESS (__builtins__=PyObject_GetItem(globals,__builtins___str))
815 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000816 }
817 else {
818 PyErr_Clear();
819
Guido van Rossum053b8df1998-11-25 16:18:00 +0000820 UNLESS (standard_builtins ||
821 (standard_builtins=PyImport_ImportModule("__builtin__")))
822 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000823
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000824 __builtins__=standard_builtins;
825 Py_INCREF(__builtins__);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000826 UNLESS (globals = Py_BuildValue("{sO}", "__builtins__", __builtins__))
827 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000828 }
829
Guido van Rossum053b8df1998-11-25 16:18:00 +0000830 if (PyDict_Check(__builtins__)) {
831 UNLESS (__import__=PyObject_GetItem(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000832 }
833 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000834 UNLESS (__import__=PyObject_GetAttr(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000835 }
836
Guido van Rossum053b8df1998-11-25 16:18:00 +0000837 UNLESS (r=PyObject_CallFunction(__import__,"OOOO",
838 module_name, globals, globals, silly_list))
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000839 goto err;
840
841 Py_DECREF(globals);
842 Py_DECREF(__builtins__);
843 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000844
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000845 return r;
846err:
847 Py_XDECREF(globals);
848 Py_XDECREF(__builtins__);
849 Py_XDECREF(__import__);
850 return NULL;
851}
852
853static PyObject *
Guido van Rossume2d81cd1998-08-08 19:40:10 +0000854whichmodule(PyObject *global, PyObject *global_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000855 int i, j;
856 PyObject *module = 0, *modules_dict = 0,
857 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000858
Guido van Rossum45188231997-09-28 05:38:51 +0000859 module = PyObject_GetAttrString(global, "__module__");
860 if (module) return module;
861 PyErr_Clear();
862
Guido van Rossum053b8df1998-11-25 16:18:00 +0000863 UNLESS (modules_dict = PySys_GetObject("modules"))
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000864 return NULL;
865
Guido van Rossum60456fd1997-04-09 17:36:32 +0000866 i = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000867 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
868
Guido van Rossum053b8df1998-11-25 16:18:00 +0000869 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000870
Guido van Rossum053b8df1998-11-25 16:18:00 +0000871 UNLESS (global_name_attr = PyObject_GetAttr(module, global_name)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000872 PyErr_Clear();
873 continue;
874 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000875
Guido van Rossum60456fd1997-04-09 17:36:32 +0000876 if (global_name_attr != global) {
877 Py_DECREF(global_name_attr);
878 continue;
879 }
880
881 Py_DECREF(global_name_attr);
882
883 break;
884 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000885
886 /* The following implements the rule in pickle.py added in 1.5
887 that used __main__ if no module is found. I don't actually
888 like this rule. jlf
889 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000890 if (!j) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000891 j=1;
892 name=__main___str;
893 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000894
895 Py_INCREF(name);
896 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000897}
898
899
Guido van Rossum60456fd1997-04-09 17:36:32 +0000900static int
901save_none(Picklerobject *self, PyObject *args) {
902 static char none = NONE;
Tim Peters84e87f32001-03-17 04:50:51 +0000903 if ((*self->write_func)(self, &none, 1) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000904 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000905
Guido van Rossum60456fd1997-04-09 17:36:32 +0000906 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000907}
908
Tim Peters84e87f32001-03-17 04:50:51 +0000909
Guido van Rossum60456fd1997-04-09 17:36:32 +0000910static int
911save_int(Picklerobject *self, PyObject *args) {
912 char c_str[32];
913 long l = PyInt_AS_LONG((PyIntObject *)args);
914 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000915
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000916 if (!self->bin
917#if SIZEOF_LONG > 4
Tim Peters3906eb82001-04-10 04:22:00 +0000918 || l > 0x7fffffffL
919 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000920#endif
Tim Peters3906eb82001-04-10 04:22:00 +0000921 ) {
922 /* Text-mode pickle, or long too big to fit in the 4-byte
923 * signed BININT format: store as a string.
924 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000925 c_str[0] = INT;
926 sprintf(c_str + 1, "%ld\n", l);
927 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
928 return -1;
929 }
930 else {
Tim Petersd8ae7c22001-04-10 04:35:28 +0000931 /* Binary pickle and l fits in a signed 4-byte int. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000932 c_str[1] = (int)( l & 0xff);
933 c_str[2] = (int)((l >> 8) & 0xff);
934 c_str[3] = (int)((l >> 16) & 0xff);
935 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000936
Guido van Rossum60456fd1997-04-09 17:36:32 +0000937 if ((c_str[4] == 0) && (c_str[3] == 0)) {
938 if (c_str[2] == 0) {
939 c_str[0] = BININT1;
940 len = 2;
941 }
942 else {
943 c_str[0] = BININT2;
944 len = 3;
945 }
946 }
947 else {
948 c_str[0] = BININT;
949 len = 5;
950 }
951
952 if ((*self->write_func)(self, c_str, len) < 0)
953 return -1;
954 }
955
956 return 0;
957}
958
959
960static int
961save_long(Picklerobject *self, PyObject *args) {
962 int size, res = -1;
963 PyObject *repr = 0;
964
965 static char l = LONG;
966
Guido van Rossum053b8df1998-11-25 16:18:00 +0000967 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000968 goto finally;
969
970 if ((size = PyString_Size(repr)) < 0)
971 goto finally;
972
973 if ((*self->write_func)(self, &l, 1) < 0)
974 goto finally;
975
Tim Peters84e87f32001-03-17 04:50:51 +0000976 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000977 PyString_AS_STRING((PyStringObject *)repr), size) < 0)
978 goto finally;
979
980 if ((*self->write_func)(self, "\n", 1) < 0)
981 goto finally;
982
983 res = 0;
984
985finally:
986 Py_XDECREF(repr);
987
988 return res;
989}
990
991
992static int
993save_float(Picklerobject *self, PyObject *args) {
994 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
995
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996 if (self->bin) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000997 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000998 double f;
999 long fhi, flo;
Fred Drake2c7a6852001-07-17 18:34:03 +00001000 char str[9];
1001 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001002
1003 *p = BINFLOAT;
1004 p++;
1005
1006 if (x < 0) {
1007 s = 1;
1008 x = -x;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001009 }
1010 else
Guido van Rossum60456fd1997-04-09 17:36:32 +00001011 s = 0;
1012
1013 f = frexp(x, &e);
1014
1015 /* Normalize f to be in the range [1.0, 2.0) */
1016 if (0.5 <= f && f < 1.0) {
1017 f *= 2.0;
1018 e--;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001019 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020 else if (f == 0.0) {
1021 e = 0;
1022 }
1023 else {
1024 PyErr_SetString(PyExc_SystemError,
1025 "frexp() result out of range");
1026 return -1;
1027 }
1028
1029 if (e >= 1024) {
1030 /* XXX 1024 itself is reserved for Inf/NaN */
1031 PyErr_SetString(PyExc_OverflowError,
1032 "float too large to pack with d format");
1033 return -1;
1034 }
1035 else if (e < -1022) {
1036 /* Gradual underflow */
1037 f = ldexp(f, 1022 + e);
1038 e = 0;
1039 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001040 else if (!(e == 0 && f == 0.0)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041 e += 1023;
1042 f -= 1.0; /* Get rid of leading 1 */
1043 }
1044
1045 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
1046 f *= 268435456.0; /* 2**28 */
1047 fhi = (long) floor(f); /* Truncate */
1048 f -= (double)fhi;
1049 f *= 16777216.0; /* 2**24 */
1050 flo = (long) floor(f + 0.5); /* Round */
1051
1052 /* First byte */
1053 *p = (s<<7) | (e>>4);
1054 p++;
1055
1056 /* Second byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001057 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058 p++;
1059
1060 /* Third byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001061 *p = (unsigned char) ((fhi>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001062 p++;
1063
1064 /* Fourth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001065 *p = (unsigned char) ((fhi>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001066 p++;
1067
1068 /* Fifth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001069 *p = (unsigned char) (fhi & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001070 p++;
1071
1072 /* Sixth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001073 *p = (unsigned char) ((flo>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001074 p++;
1075
1076 /* Seventh byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001077 *p = (unsigned char) ((flo>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078 p++;
1079
1080 /* Eighth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001081 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001082
1083 if ((*self->write_func)(self, str, 9) < 0)
1084 return -1;
1085 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001086 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087 char c_str[250];
1088 c_str[0] = FLOAT;
Guido van Rossum104be4a1998-04-03 21:13:02 +00001089 sprintf(c_str + 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001090
1091 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1092 return -1;
1093 }
1094
1095 return 0;
1096}
1097
1098
1099static int
Guido van Rossum142eeb81997-08-13 03:14:41 +00001100save_string(Picklerobject *self, PyObject *args, int doput) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001101 int size, len;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001102 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001103
Guido van Rossum053b8df1998-11-25 16:18:00 +00001104 if ((size = PyString_Size(args)) < 0)
1105 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106
1107 if (!self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108 char *repr_str;
1109
1110 static char string = STRING;
1111
Guido van Rossum053b8df1998-11-25 16:18:00 +00001112 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001113 return -1;
1114
Guido van Rossum053b8df1998-11-25 16:18:00 +00001115 if ((len = PyString_Size(repr)) < 0)
1116 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001117 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
1119 if ((*self->write_func)(self, &string, 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001120 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001121
1122 if ((*self->write_func)(self, repr_str, len) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001123 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
1125 if ((*self->write_func)(self, "\n", 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001126 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
1128 Py_XDECREF(repr);
1129 }
1130 else {
1131 int i;
1132 char c_str[5];
1133
Guido van Rossum053b8df1998-11-25 16:18:00 +00001134 if ((size = PyString_Size(args)) < 0)
1135 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
1137 if (size < 256) {
1138 c_str[0] = SHORT_BINSTRING;
1139 c_str[1] = size;
1140 len = 2;
1141 }
1142 else {
1143 c_str[0] = BINSTRING;
1144 for (i = 1; i < 5; i++)
1145 c_str[i] = (int)(size >> ((i - 1) * 8));
1146 len = 5;
1147 }
1148
1149 if ((*self->write_func)(self, c_str, len) < 0)
1150 return -1;
1151
Guido van Rossum053b8df1998-11-25 16:18:00 +00001152 if (size > 128 && Pdata_Check(self->file)) {
1153 if (write_other(self, NULL, 0) < 0) return -1;
1154 PDATA_APPEND(self->file, args, -1);
1155 }
1156 else {
Tim Peters84e87f32001-03-17 04:50:51 +00001157 if ((*self->write_func)(self,
Guido van Rossum053b8df1998-11-25 16:18:00 +00001158 PyString_AS_STRING((PyStringObject *)args), size) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001160 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161 }
1162
Guido van Rossum142eeb81997-08-13 03:14:41 +00001163 if (doput)
1164 if (put(self, args) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001165 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
1167 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001168
1169err:
1170 Py_XDECREF(repr);
1171 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172}
1173
1174
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001175#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001176/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1177 backslash and newline characters to \uXXXX escapes. */
1178static PyObject *
1179modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1180{
1181 PyObject *repr;
1182 char *p;
1183 char *q;
1184
1185 static const char *hexdigit = "0123456789ABCDEF";
1186
1187 repr = PyString_FromStringAndSize(NULL, 6 * size);
1188 if (repr == NULL)
1189 return NULL;
1190 if (size == 0)
1191 return repr;
1192
1193 p = q = PyString_AS_STRING(repr);
1194 while (size-- > 0) {
1195 Py_UNICODE ch = *s++;
1196 /* Map 16-bit characters to '\uxxxx' */
1197 if (ch >= 256 || ch == '\\' || ch == '\n') {
1198 *p++ = '\\';
1199 *p++ = 'u';
1200 *p++ = hexdigit[(ch >> 12) & 0xf];
1201 *p++ = hexdigit[(ch >> 8) & 0xf];
1202 *p++ = hexdigit[(ch >> 4) & 0xf];
1203 *p++ = hexdigit[ch & 15];
1204 }
1205 /* Copy everything else as-is */
1206 else
1207 *p++ = (char) ch;
1208 }
1209 *p = '\0';
1210 if (_PyString_Resize(&repr, p - q))
1211 goto onError;
1212
1213 return repr;
1214
1215 onError:
1216 Py_DECREF(repr);
1217 return NULL;
1218}
1219
1220
Guido van Rossum60456fd1997-04-09 17:36:32 +00001221static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001222save_unicode(Picklerobject *self, PyObject *args, int doput) {
1223 int size, len;
1224 PyObject *repr=0;
1225
1226 if (!PyUnicode_Check(args))
1227 return -1;
1228
1229 if (!self->bin) {
1230 char *repr_str;
1231 static char string = UNICODE;
1232
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001233 UNLESS(repr = modified_EncodeRawUnicodeEscape(
1234 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)))
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001235 return -1;
1236
1237 if ((len = PyString_Size(repr)) < 0)
1238 goto err;
1239 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1240
1241 if ((*self->write_func)(self, &string, 1) < 0)
1242 goto err;
1243
1244 if ((*self->write_func)(self, repr_str, len) < 0)
1245 goto err;
1246
1247 if ((*self->write_func)(self, "\n", 1) < 0)
1248 goto err;
1249
1250 Py_XDECREF(repr);
1251 }
1252 else {
1253 int i;
1254 char c_str[5];
1255
1256 UNLESS (repr = PyUnicode_AsUTF8String(args))
1257 return -1;
1258
1259 if ((size = PyString_Size(repr)) < 0)
1260 goto err;
1261
1262 c_str[0] = BINUNICODE;
1263 for (i = 1; i < 5; i++)
1264 c_str[i] = (int)(size >> ((i - 1) * 8));
1265 len = 5;
1266
1267 if ((*self->write_func)(self, c_str, len) < 0)
1268 goto err;
1269
1270 if (size > 128 && Pdata_Check(self->file)) {
1271 if (write_other(self, NULL, 0) < 0)
1272 goto err;
1273 PDATA_APPEND(self->file, repr, -1);
1274 }
1275 else {
1276 if ((*self->write_func)(self, PyString_AS_STRING(repr), size) < 0)
1277 goto err;
1278 }
1279
1280 Py_DECREF(repr);
1281 }
1282
1283 if (doput)
1284 if (put(self, args) < 0)
1285 return -1;
1286
1287 return 0;
1288
1289err:
1290 Py_XDECREF(repr);
1291 return -1;
1292}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001293#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001294
1295
1296static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001297save_tuple(Picklerobject *self, PyObject *args) {
1298 PyObject *element = 0, *py_tuple_id = 0;
1299 int len, i, has_key, res = -1;
1300
1301 static char tuple = TUPLE;
1302
1303 if ((*self->write_func)(self, &MARKv, 1) < 0)
1304 goto finally;
1305
Tim Peters84e87f32001-03-17 04:50:51 +00001306 if ((len = PyTuple_Size(args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001307 goto finally;
1308
1309 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001310 UNLESS (element = PyTuple_GET_ITEM((PyTupleObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001311 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001312
Guido van Rossum60456fd1997-04-09 17:36:32 +00001313 if (save(self, element, 0) < 0)
1314 goto finally;
1315 }
1316
Guido van Rossum534b7c52000-06-28 22:23:56 +00001317 UNLESS (py_tuple_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001318 goto finally;
1319
1320 if (len) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001321 if ((has_key = cPickle_PyMapping_HasKey(self->memo, py_tuple_id)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001322 goto finally;
1323
1324 if (has_key) {
1325 if (self->bin) {
1326 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001327
Guido van Rossum60456fd1997-04-09 17:36:32 +00001328 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1329 goto finally;
1330 }
1331 else {
1332 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001333
Guido van Rossum60456fd1997-04-09 17:36:32 +00001334 for (i = 0; i <= len; i++) {
1335 if ((*self->write_func)(self, &pop, 1) < 0)
1336 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001337 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001338 }
Tim Peters84e87f32001-03-17 04:50:51 +00001339
Guido van Rossum60456fd1997-04-09 17:36:32 +00001340 if (get(self, py_tuple_id) < 0)
1341 goto finally;
1342
1343 res = 0;
1344 goto finally;
1345 }
1346 }
1347
1348 if ((*self->write_func)(self, &tuple, 1) < 0) {
1349 goto finally;
1350 }
1351
1352 if (put(self, args) < 0)
1353 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001354
Guido van Rossum60456fd1997-04-09 17:36:32 +00001355 res = 0;
1356
1357finally:
1358 Py_XDECREF(py_tuple_id);
1359
1360 return res;
1361}
1362
1363static int
1364save_empty_tuple(Picklerobject *self, PyObject *args) {
1365 static char tuple = EMPTY_TUPLE;
1366
1367 return (*self->write_func)(self, &tuple, 1);
1368}
1369
1370
1371static int
1372save_list(Picklerobject *self, PyObject *args) {
1373 PyObject *element = 0;
1374 int s_len, len, i, using_appends, res = -1;
1375 char s[3];
1376
1377 static char append = APPEND, appends = APPENDS;
1378
Guido van Rossum053b8df1998-11-25 16:18:00 +00001379 if (self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001380 s[0] = EMPTY_LIST;
1381 s_len = 1;
Tim Peters84e87f32001-03-17 04:50:51 +00001382 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001383 else {
1384 s[0] = MARK;
1385 s[1] = LIST;
1386 s_len = 2;
1387 }
1388
1389 if ((len = PyList_Size(args)) < 0)
1390 goto finally;
1391
1392 if ((*self->write_func)(self, s, s_len) < 0)
1393 goto finally;
1394
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001395 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396 if (put(self, args) < 0)
1397 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001398 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001399 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400 if (put2(self, args) < 0)
1401 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001402 }
1403
Guido van Rossum142eeb81997-08-13 03:14:41 +00001404 if ((using_appends = (self->bin && (len > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405 if ((*self->write_func)(self, &MARKv, 1) < 0)
1406 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001407
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001409 UNLESS (element = PyList_GET_ITEM((PyListObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410 goto finally;
1411
Tim Peters84e87f32001-03-17 04:50:51 +00001412 if (save(self, element, 0) < 0)
1413 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001414
1415 if (!using_appends) {
1416 if ((*self->write_func)(self, &append, 1) < 0)
1417 goto finally;
1418 }
1419 }
1420
1421 if (using_appends) {
1422 if ((*self->write_func)(self, &appends, 1) < 0)
1423 goto finally;
1424 }
1425
1426 res = 0;
1427
1428finally:
1429
1430 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001431}
1432
1433
Guido van Rossum60456fd1997-04-09 17:36:32 +00001434static int
1435save_dict(Picklerobject *self, PyObject *args) {
1436 PyObject *key = 0, *value = 0;
1437 int i, len, res = -1, using_setitems;
1438 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001439
Guido van Rossum60456fd1997-04-09 17:36:32 +00001440 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001441
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442 if (self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001443 s[0] = EMPTY_DICT;
1444 len = 1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445 }
1446 else {
1447 s[0] = MARK;
1448 s[1] = DICT;
1449 len = 2;
1450 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001451
Guido van Rossum60456fd1997-04-09 17:36:32 +00001452 if ((*self->write_func)(self, s, len) < 0)
1453 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001454
Guido van Rossum60456fd1997-04-09 17:36:32 +00001455 if ((len = PyDict_Size(args)) < 0)
1456 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001457
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001458 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459 if (put(self, args) < 0)
1460 goto finally;
1461 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001462 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001463 if (put2(self, args) < 0)
1464 goto finally;
1465 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001466
Guido van Rossum142eeb81997-08-13 03:14:41 +00001467 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468 if ((*self->write_func)(self, &MARKv, 1) < 0)
1469 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001470
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471 i = 0;
1472 while (PyDict_Next(args, &i, &key, &value)) {
1473 if (save(self, key, 0) < 0)
1474 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001475
Guido van Rossum60456fd1997-04-09 17:36:32 +00001476 if (save(self, value, 0) < 0)
1477 goto finally;
1478
1479 if (!using_setitems) {
1480 if ((*self->write_func)(self, &setitem, 1) < 0)
1481 goto finally;
1482 }
1483 }
1484
1485 if (using_setitems) {
1486 if ((*self->write_func)(self, &setitems, 1) < 0)
1487 goto finally;
1488 }
1489
1490 res = 0;
1491
1492finally:
1493
1494 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001495}
1496
1497
Tim Peters84e87f32001-03-17 04:50:51 +00001498static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001499save_inst(Picklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00001500 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001501 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1502 char *module_str, *name_str;
1503 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001504
Guido van Rossum60456fd1997-04-09 17:36:32 +00001505 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001506
Guido van Rossum60456fd1997-04-09 17:36:32 +00001507 if ((*self->write_func)(self, &MARKv, 1) < 0)
1508 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001509
Guido van Rossum053b8df1998-11-25 16:18:00 +00001510 UNLESS (class = PyObject_GetAttr(args, __class___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001512
Guido van Rossum60456fd1997-04-09 17:36:32 +00001513 if (self->bin) {
1514 if (save(self, class, 0) < 0)
1515 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001516 }
1517
Guido van Rossum142eeb81997-08-13 03:14:41 +00001518 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001519 PyObject *element = 0;
1520 int i, len;
1521
Tim Peters84e87f32001-03-17 04:50:51 +00001522 UNLESS (class_args =
Guido van Rossum60456fd1997-04-09 17:36:32 +00001523 PyObject_CallObject(getinitargs_func, empty_tuple))
1524 goto finally;
1525
Tim Peters84e87f32001-03-17 04:50:51 +00001526 if ((len = PyObject_Size(class_args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001527 goto finally;
1528
1529 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001530 UNLESS (element = PySequence_GetItem(class_args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001531 goto finally;
1532
1533 if (save(self, element, 0) < 0) {
1534 Py_DECREF(element);
1535 goto finally;
1536 }
1537
1538 Py_DECREF(element);
1539 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541 else {
1542 PyErr_Clear();
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001543 }
1544
Guido van Rossum60456fd1997-04-09 17:36:32 +00001545 if (!self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001546 UNLESS (name = ((PyClassObject *)class)->cl_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547 PyErr_SetString(PicklingError, "class has no name");
1548 goto finally;
1549 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001550
Guido van Rossum053b8df1998-11-25 16:18:00 +00001551 UNLESS (module = whichmodule(class, name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001552 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001553
Tim Peters84e87f32001-03-17 04:50:51 +00001554
Guido van Rossum053b8df1998-11-25 16:18:00 +00001555 if ((module_size = PyString_Size(module)) < 0 ||
1556 (name_size = PyString_Size(name)) < 0)
1557 goto finally;
1558
Guido van Rossum60456fd1997-04-09 17:36:32 +00001559 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001560 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561
Guido van Rossum60456fd1997-04-09 17:36:32 +00001562 if ((*self->write_func)(self, &inst, 1) < 0)
1563 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001564
Guido van Rossum60456fd1997-04-09 17:36:32 +00001565 if ((*self->write_func)(self, module_str, module_size) < 0)
1566 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001567
Guido van Rossum60456fd1997-04-09 17:36:32 +00001568 if ((*self->write_func)(self, "\n", 1) < 0)
1569 goto finally;
1570
1571 if ((*self->write_func)(self, name_str, name_size) < 0)
1572 goto finally;
1573
1574 if ((*self->write_func)(self, "\n", 1) < 0)
1575 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001576 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001577 else if ((*self->write_func)(self, &obj, 1) < 0) {
1578 goto finally;
1579 }
1580
Guido van Rossum142eeb81997-08-13 03:14:41 +00001581 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001582 UNLESS (state = PyObject_CallObject(getstate_func, empty_tuple))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001583 goto finally;
1584 }
1585 else {
1586 PyErr_Clear();
1587
Guido van Rossum053b8df1998-11-25 16:18:00 +00001588 UNLESS (state = PyObject_GetAttr(args, __dict___str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001589 PyErr_Clear();
1590 res = 0;
1591 goto finally;
1592 }
1593 }
1594
1595 if (!PyDict_Check(state)) {
1596 if (put2(self, args) < 0)
1597 goto finally;
1598 }
1599 else {
1600 if (put(self, args) < 0)
1601 goto finally;
1602 }
Tim Peters84e87f32001-03-17 04:50:51 +00001603
Guido van Rossum60456fd1997-04-09 17:36:32 +00001604 if (save(self, state, 0) < 0)
1605 goto finally;
1606
1607 if ((*self->write_func)(self, &build, 1) < 0)
1608 goto finally;
1609
1610 res = 0;
1611
1612finally:
1613 Py_XDECREF(module);
1614 Py_XDECREF(class);
1615 Py_XDECREF(state);
1616 Py_XDECREF(getinitargs_func);
1617 Py_XDECREF(getstate_func);
1618 Py_XDECREF(class_args);
1619
1620 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621}
1622
1623
Guido van Rossum60456fd1997-04-09 17:36:32 +00001624static int
1625save_global(Picklerobject *self, PyObject *args, PyObject *name) {
1626 PyObject *global_name = 0, *module = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00001627 char *name_str, *module_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001629
Guido van Rossum60456fd1997-04-09 17:36:32 +00001630 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001631
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001632 if (name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633 global_name = name;
1634 Py_INCREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001635 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001636 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001637 UNLESS (global_name = PyObject_GetAttr(args, __name___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001639 }
1640
Guido van Rossum053b8df1998-11-25 16:18:00 +00001641 UNLESS (module = whichmodule(args, global_name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001643
Guido van Rossum053b8df1998-11-25 16:18:00 +00001644 if ((module_size = PyString_Size(module)) < 0 ||
1645 (name_size = PyString_Size(global_name)) < 0)
1646 goto finally;
1647
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001648 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001649 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001650
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651 if ((*self->write_func)(self, &global, 1) < 0)
1652 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001653
Guido van Rossum60456fd1997-04-09 17:36:32 +00001654 if ((*self->write_func)(self, module_str, module_size) < 0)
1655 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001656
Guido van Rossum60456fd1997-04-09 17:36:32 +00001657 if ((*self->write_func)(self, "\n", 1) < 0)
1658 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001659
Guido van Rossum60456fd1997-04-09 17:36:32 +00001660 if ((*self->write_func)(self, name_str, name_size) < 0)
1661 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001662
Guido van Rossum60456fd1997-04-09 17:36:32 +00001663 if ((*self->write_func)(self, "\n", 1) < 0)
1664 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001665
Guido van Rossum60456fd1997-04-09 17:36:32 +00001666 if (put(self, args) < 0)
1667 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Guido van Rossum60456fd1997-04-09 17:36:32 +00001669 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001670
Guido van Rossum60456fd1997-04-09 17:36:32 +00001671finally:
1672 Py_XDECREF(module);
1673 Py_XDECREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001674
Guido van Rossum60456fd1997-04-09 17:36:32 +00001675 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001676}
1677
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678static int
1679save_pers(Picklerobject *self, PyObject *args, PyObject *f) {
1680 PyObject *pid = 0;
1681 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001682
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001684
Guido van Rossum053b8df1998-11-25 16:18:00 +00001685 Py_INCREF(args);
1686 ARG_TUP(self, args);
1687 if (self->arg) {
1688 pid = PyObject_CallObject(f, self->arg);
1689 FREE_ARG_TUP(self);
1690 }
1691 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693 if (pid != Py_None) {
1694 if (!self->bin) {
1695 if (!PyString_Check(pid)) {
Tim Peters84e87f32001-03-17 04:50:51 +00001696 PyErr_SetString(PicklingError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001697 "persistent id must be string");
1698 goto finally;
1699 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001700
Guido van Rossum60456fd1997-04-09 17:36:32 +00001701 if ((*self->write_func)(self, &persid, 1) < 0)
1702 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001703
Guido van Rossum60456fd1997-04-09 17:36:32 +00001704 if ((size = PyString_Size(pid)) < 0)
1705 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Tim Peters84e87f32001-03-17 04:50:51 +00001707 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001708 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1709 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001710
Guido van Rossum60456fd1997-04-09 17:36:32 +00001711 if ((*self->write_func)(self, "\n", 1) < 0)
1712 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001713
Guido van Rossum60456fd1997-04-09 17:36:32 +00001714 res = 1;
1715 goto finally;
1716 }
1717 else if (save(self, pid, 1) >= 0) {
1718 if ((*self->write_func)(self, &binpersid, 1) < 0)
1719 res = -1;
1720 else
1721 res = 1;
1722 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001723
Tim Peters84e87f32001-03-17 04:50:51 +00001724 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001725 }
1726
Guido van Rossum60456fd1997-04-09 17:36:32 +00001727 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001728
Guido van Rossum60456fd1997-04-09 17:36:32 +00001729finally:
1730 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001731
Guido van Rossum60456fd1997-04-09 17:36:32 +00001732 return res;
1733}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001734
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001735
Tim Peters84e87f32001-03-17 04:50:51 +00001736static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737save_reduce(Picklerobject *self, PyObject *callable,
1738 PyObject *tup, PyObject *state, PyObject *ob) {
1739 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001740
Guido van Rossum60456fd1997-04-09 17:36:32 +00001741 if (save(self, callable, 0) < 0)
1742 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001743
Guido van Rossum60456fd1997-04-09 17:36:32 +00001744 if (save(self, tup, 0) < 0)
1745 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Guido van Rossum60456fd1997-04-09 17:36:32 +00001747 if ((*self->write_func)(self, &reduce, 1) < 0)
1748 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001749
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001750 if (ob != NULL) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001751 if (state && !PyDict_Check(state)) {
1752 if (put2(self, ob) < 0)
1753 return -1;
1754 }
1755 else {
1756 if (put(self, ob) < 0)
1757 return -1;
1758 }
1759 }
Tim Peters84e87f32001-03-17 04:50:51 +00001760
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001761 if (state) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001762 if (save(self, state, 0) < 0)
1763 return -1;
1764
1765 if ((*self->write_func)(self, &build, 1) < 0)
1766 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001767 }
1768
Guido van Rossum60456fd1997-04-09 17:36:32 +00001769 return 0;
1770}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Guido van Rossum60456fd1997-04-09 17:36:32 +00001772static int
1773save(Picklerobject *self, PyObject *args, int pers_save) {
1774 PyTypeObject *type;
1775 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
Guido van Rossum142eeb81997-08-13 03:14:41 +00001776 *callable = 0, *state = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001777 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001778
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779 if (!pers_save && self->pers_func) {
1780 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1781 res = tmp;
1782 goto finally;
1783 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001784 }
1785
Guido van Rossum60456fd1997-04-09 17:36:32 +00001786 if (args == Py_None) {
1787 res = save_none(self, args);
1788 goto finally;
1789 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790
Guido van Rossum60456fd1997-04-09 17:36:32 +00001791 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792
Guido van Rossum60456fd1997-04-09 17:36:32 +00001793 switch (type->tp_name[0]) {
1794 case 'i':
1795 if (type == &PyInt_Type) {
1796 res = save_int(self, args);
1797 goto finally;
1798 }
1799 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001800
Guido van Rossum60456fd1997-04-09 17:36:32 +00001801 case 'l':
1802 if (type == &PyLong_Type) {
1803 res = save_long(self, args);
1804 goto finally;
1805 }
1806 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Guido van Rossum60456fd1997-04-09 17:36:32 +00001808 case 'f':
1809 if (type == &PyFloat_Type) {
1810 res = save_float(self, args);
1811 goto finally;
1812 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001813 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Guido van Rossum60456fd1997-04-09 17:36:32 +00001815 case 't':
1816 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001817 if (self->bin) res = save_empty_tuple(self, args);
1818 else res = save_tuple(self, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001819 goto finally;
1820 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001821 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001822
Guido van Rossum60456fd1997-04-09 17:36:32 +00001823 case 's':
Guido van Rossum053b8df1998-11-25 16:18:00 +00001824 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001825 res = save_string(self, args, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001826 goto finally;
1827 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001828
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001829#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001830 case 'u':
1831 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1832 res = save_unicode(self, args, 0);
1833 goto finally;
1834 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001835#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00001836 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001837
Guido van Rossum60456fd1997-04-09 17:36:32 +00001838 if (args->ob_refcnt > 1) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001839 int has_key;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001840
Guido van Rossum534b7c52000-06-28 22:23:56 +00001841 UNLESS (py_ob_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001842 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001843
Guido van Rossum60456fd1997-04-09 17:36:32 +00001844 if ((has_key = cPickle_PyMapping_HasKey(self->memo, py_ob_id)) < 0)
1845 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001846
Guido van Rossum60456fd1997-04-09 17:36:32 +00001847 if (has_key) {
1848 if (get(self, py_ob_id) < 0)
1849 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001850
Guido van Rossum60456fd1997-04-09 17:36:32 +00001851 res = 0;
1852 goto finally;
1853 }
1854 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001855
Guido van Rossum60456fd1997-04-09 17:36:32 +00001856 switch (type->tp_name[0]) {
1857 case 's':
1858 if (type == &PyString_Type) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001859 res = save_string(self, args, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001860 goto finally;
1861 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001862 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001864#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001865 case 'u':
1866 if (type == &PyUnicode_Type) {
1867 res = save_unicode(self, args, 1);
1868 goto finally;
1869 }
1870 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001871#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001872
Guido van Rossum60456fd1997-04-09 17:36:32 +00001873 case 't':
1874 if (type == &PyTuple_Type) {
1875 res = save_tuple(self, args);
1876 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001877 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001878 if (type == &PyType_Type) {
1879 res = save_global(self, args, NULL);
1880 goto finally;
1881 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001882 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Guido van Rossum60456fd1997-04-09 17:36:32 +00001884 case 'l':
1885 if (type == &PyList_Type) {
1886 res = save_list(self, args);
1887 goto finally;
1888 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001889 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001890
1891 case 'd':
1892 if (type == &PyDict_Type) {
1893 res = save_dict(self, args);
Tim Peters84e87f32001-03-17 04:50:51 +00001894 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001895 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001896 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001897
1898 case 'i':
1899 if (type == &PyInstance_Type) {
1900 res = save_inst(self, args);
1901 goto finally;
1902 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001903 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001904
1905 case 'c':
1906 if (type == &PyClass_Type) {
1907 res = save_global(self, args, NULL);
1908 goto finally;
1909 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001910 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001911
1912 case 'f':
1913 if (type == &PyFunction_Type) {
1914 res = save_global(self, args, NULL);
1915 goto finally;
1916 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001917 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918
1919 case 'b':
1920 if (type == &PyCFunction_Type) {
1921 res = save_global(self, args, NULL);
1922 goto finally;
1923 }
1924 }
1925
1926 if (!pers_save && self->inst_pers_func) {
1927 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
1928 res = tmp;
1929 goto finally;
1930 }
1931 }
1932
Guido van Rossum142eeb81997-08-13 03:14:41 +00001933 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934 Py_INCREF(__reduce__);
1935
Guido van Rossum60456fd1997-04-09 17:36:32 +00001936 Py_INCREF(args);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001937 ARG_TUP(self, args);
1938 if (self->arg) {
1939 t = PyObject_CallObject(__reduce__, self->arg);
1940 FREE_ARG_TUP(self);
1941 }
1942 if (! t) goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001943 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001944 else {
1945 PyErr_Clear();
1946
Guido van Rossum142eeb81997-08-13 03:14:41 +00001947 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001948 UNLESS (t = PyObject_CallObject(__reduce__, empty_tuple))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001949 goto finally;
1950 }
1951 else {
1952 PyErr_Clear();
1953 }
1954 }
1955
1956 if (t) {
1957 if (PyString_Check(t)) {
1958 res = save_global(self, args, t);
1959 goto finally;
1960 }
Tim Peters84e87f32001-03-17 04:50:51 +00001961
Guido van Rossum60456fd1997-04-09 17:36:32 +00001962 if (!PyTuple_Check(t)) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00001963 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964 "be a tuple", "O", __reduce__);
1965 goto finally;
1966 }
1967
1968 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00001969
Guido van Rossum60456fd1997-04-09 17:36:32 +00001970 if ((size != 3) && (size != 2)) {
Tim Peters84e87f32001-03-17 04:50:51 +00001971 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00001972 "contain only two or three elements", "O", __reduce__);
1973 goto finally;
1974 }
Tim Peters84e87f32001-03-17 04:50:51 +00001975
Guido van Rossum60456fd1997-04-09 17:36:32 +00001976 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00001977
Guido van Rossum60456fd1997-04-09 17:36:32 +00001978 arg_tup = PyTuple_GET_ITEM(t, 1);
1979
1980 if (size > 2) {
1981 state = PyTuple_GET_ITEM(t, 2);
1982 }
1983
Guido van Rossum053b8df1998-11-25 16:18:00 +00001984 UNLESS (PyTuple_Check(arg_tup) || arg_tup==Py_None) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00001985 cPickle_ErrFormat(PicklingError, "Second element of tuple "
Guido van Rossum60456fd1997-04-09 17:36:32 +00001986 "returned by %s must be a tuple", "O", __reduce__);
1987 goto finally;
1988 }
1989
1990 res = save_reduce(self, callable, arg_tup, state, args);
1991 goto finally;
1992 }
1993
Guido van Rossumc03158b1999-06-09 15:23:31 +00001994 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001995
1996finally:
1997 Py_XDECREF(py_ob_id);
1998 Py_XDECREF(__reduce__);
1999 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002000
Guido van Rossum60456fd1997-04-09 17:36:32 +00002001 return res;
2002}
2003
2004
2005static int
2006dump(Picklerobject *self, PyObject *args) {
2007 static char stop = STOP;
2008
2009 if (save(self, args, 0) < 0)
2010 return -1;
2011
2012 if ((*self->write_func)(self, &stop, 1) < 0)
2013 return -1;
2014
2015 if ((*self->write_func)(self, NULL, 0) < 0)
2016 return -1;
2017
2018 return 0;
2019}
2020
2021static PyObject *
Guido van Rossum053b8df1998-11-25 16:18:00 +00002022Pickle_clear_memo(Picklerobject *self, PyObject *args) {
Guido van Rossum43713e52000-02-29 13:59:29 +00002023 if (args && ! PyArg_ParseTuple(args,":clear_memo")) return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002024 if (self->memo) PyDict_Clear(self->memo);
2025 Py_INCREF(Py_None);
2026 return Py_None;
2027}
2028
2029static PyObject *
2030Pickle_getvalue(Picklerobject *self, PyObject *args) {
2031 int l, i, rsize, ssize, clear=1, lm;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002032 long ik;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002033 PyObject *k, *r;
2034 char *s, *p, *have_get;
2035 Pdata *data;
2036
Guido van Rossum43713e52000-02-29 13:59:29 +00002037 if (args && ! PyArg_ParseTuple(args,"|i:getvalue",&clear)) return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002038
2039 /* Check to make sure we are based on a list */
2040 if (! Pdata_Check(self->file)) {
2041 PyErr_SetString(PicklingError,
2042 "Attempt to getvalue a non-list-based pickler");
2043 return NULL;
2044 }
2045
2046 /* flush write buffer */
2047 if (write_other(self, NULL, 0) < 0) return NULL;
2048
2049 data=(Pdata*)self->file;
2050 l=data->length;
2051
2052 /* set up an array to hold get/put status */
2053 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2054 lm++;
Tim Peters84e87f32001-03-17 04:50:51 +00002055 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002056 memset(have_get,0,lm);
2057
2058 /* Scan for gets. */
2059 for (rsize=0, i=l; --i >= 0; ) {
2060 k=data->data[i];
Tim Peters84e87f32001-03-17 04:50:51 +00002061
Guido van Rossum053b8df1998-11-25 16:18:00 +00002062 if (PyString_Check(k)) {
2063 rsize += PyString_GET_SIZE(k);
2064 }
2065
2066 else if (PyInt_Check(k)) { /* put */
2067 ik=PyInt_AS_LONG((PyIntObject*)k);
2068 if (ik >= lm || ik==0) {
2069 PyErr_SetString(PicklingError,
2070 "Invalid get data");
2071 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002072 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002073 if (have_get[ik]) { /* with matching get */
2074 if (ik < 256) rsize += 2;
2075 else rsize+=5;
2076 }
2077 }
2078
2079 else if (! (PyTuple_Check(k) &&
2080 PyTuple_GET_SIZE(k) == 2 &&
2081 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2082 ) {
2083 PyErr_SetString(PicklingError,
2084 "Unexpected data in internal list");
2085 return NULL;
2086 }
2087
2088 else { /* put */
2089 ik=PyInt_AS_LONG((PyIntObject*)k);
2090 if (ik >= lm || ik==0) {
2091 PyErr_SetString(PicklingError,
2092 "Invalid get data");
2093 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002094 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002095 have_get[ik]=1;
2096 if (ik < 256) rsize += 2;
2097 else rsize+=5;
2098 }
2099
2100 }
2101
2102 /* Now generate the result */
2103 UNLESS (r=PyString_FromStringAndSize(NULL,rsize)) goto err;
2104 s=PyString_AS_STRING((PyStringObject*)r);
2105
2106 for (i=0; i<l; i++) {
2107 k=data->data[i];
2108
2109 if (PyString_Check(k)) {
2110 ssize=PyString_GET_SIZE(k);
2111 if (ssize) {
2112 p=PyString_AS_STRING((PyStringObject*)k);
2113 while (--ssize >= 0) *s++=*p++;
2114 }
2115 }
2116
2117 else if (PyTuple_Check(k)) { /* get */
2118 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2119 if (ik < 256) {
2120 *s++ = BINGET;
2121 *s++ = (int)(ik & 0xff);
2122 }
2123 else {
2124 *s++ = LONG_BINGET;
2125 *s++ = (int)(ik & 0xff);
2126 *s++ = (int)((ik >> 8) & 0xff);
2127 *s++ = (int)((ik >> 16) & 0xff);
2128 *s++ = (int)((ik >> 24) & 0xff);
2129 }
2130 }
2131
2132 else { /* put */
2133 ik=PyInt_AS_LONG((PyIntObject*)k);
2134
2135 if (have_get[ik]) { /* with matching get */
2136 if (ik < 256) {
2137 *s++ = BINPUT;
2138 *s++ = (int)(ik & 0xff);
2139 }
2140 else {
2141 *s++ = LONG_BINPUT;
2142 *s++ = (int)(ik & 0xff);
2143 *s++ = (int)((ik >> 8) & 0xff);
2144 *s++ = (int)((ik >> 16) & 0xff);
2145 *s++ = (int)((ik >> 24) & 0xff);
2146 }
2147 }
2148 }
2149
2150 }
2151
2152 if (clear) {
2153 PyDict_Clear(self->memo);
2154 Pdata_clear(data,0);
2155 }
Tim Peters84e87f32001-03-17 04:50:51 +00002156
Guido van Rossum053b8df1998-11-25 16:18:00 +00002157 free(have_get);
2158 return r;
2159err:
2160 free(have_get);
2161 return NULL;
2162}
2163
2164static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002165Pickler_dump(Picklerobject *self, PyObject *args) {
2166 PyObject *ob;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002167 int get=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002168
Guido van Rossum43713e52000-02-29 13:59:29 +00002169 UNLESS (PyArg_ParseTuple(args, "O|i:dump", &ob, &get))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002170 return NULL;
2171
2172 if (dump(self, ob) < 0)
2173 return NULL;
2174
Guido van Rossum053b8df1998-11-25 16:18:00 +00002175 if (get) return Pickle_getvalue(self, NULL);
2176
2177 Py_INCREF(self);
2178 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002179}
2180
2181
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002182static struct PyMethodDef Pickler_methods[] = {
Guido van Rossum142eeb81997-08-13 03:14:41 +00002183 {"dump", (PyCFunction)Pickler_dump, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002184 "dump(object) --"
2185 "Write an object in pickle format to the object's pickle stream\n"
2186 },
Guido van Rossum142eeb81997-08-13 03:14:41 +00002187 {"clear_memo", (PyCFunction)Pickle_clear_memo, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002188 "clear_memo() -- Clear the picklers memo"},
Guido van Rossum053b8df1998-11-25 16:18:00 +00002189 {"getvalue", (PyCFunction)Pickle_getvalue, 1,
2190 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002191 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002192};
2193
2194
2195static Picklerobject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002196newPicklerobject(PyObject *file, int bin) {
2197 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002198
Guido van Rossumb18618d2000-05-03 23:44:39 +00002199 UNLESS (self = PyObject_New(Picklerobject, &Picklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002200 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002201
2202 self->fp = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002203 self->write = NULL;
2204 self->memo = NULL;
2205 self->arg = NULL;
2206 self->pers_func = NULL;
2207 self->inst_pers_func = NULL;
2208 self->write_buf = NULL;
2209 self->bin = bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002210 self->fast = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002211 self->buf_size = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002212 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002213
Guido van Rossum053b8df1998-11-25 16:18:00 +00002214 if (file)
2215 Py_INCREF(file);
2216 else
Guido van Rossum50f385c1998-12-04 18:48:44 +00002217 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002218
2219 UNLESS (self->file = file)
Guido van Rossum83addc72000-04-21 20:49:36 +00002220 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002221
Tim Peters84e87f32001-03-17 04:50:51 +00002222 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00002223 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002224
Guido van Rossum60456fd1997-04-09 17:36:32 +00002225 if (PyFile_Check(file)) {
2226 self->fp = PyFile_AsFile(file);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002227 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00002228 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2229 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002230 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002231 self->write_func = write_file;
2232 }
2233 else if (PycStringIO_OutputCheck(file)) {
2234 self->write_func = write_cStringIO;
2235 }
Guido van Rossum142eeb81997-08-13 03:14:41 +00002236 else if (file == Py_None) {
2237 self->write_func = write_none;
2238 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002239 else {
2240 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002241
Guido van Rossum053b8df1998-11-25 16:18:00 +00002242 if (! Pdata_Check(file)) {
2243 UNLESS (self->write = PyObject_GetAttr(file, write_str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002244 PyErr_Clear();
2245 PyErr_SetString(PyExc_TypeError, "argument must have 'write' "
Guido van Rossum053b8df1998-11-25 16:18:00 +00002246 "attribute");
2247 goto err;
2248 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002249 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002250
Tim Peters84e87f32001-03-17 04:50:51 +00002251 UNLESS (self->write_buf =
2252 (char *)malloc(WRITE_BUF_SIZE * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002253 PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002254 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002255 }
2256 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002257
Guido van Rossum053b8df1998-11-25 16:18:00 +00002258 if (PyEval_GetRestricted()) {
2259 /* Restricted execution, get private tables */
2260 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002261
Guido van Rossum053b8df1998-11-25 16:18:00 +00002262 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
2263 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2264 Py_DECREF(m);
2265 UNLESS (self->dispatch_table) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002266 }
2267 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002268 self->dispatch_table=dispatch_table;
2269 Py_INCREF(dispatch_table);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002270 }
2271
Guido van Rossum60456fd1997-04-09 17:36:32 +00002272 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002273
2274err:
2275 Py_DECREF((PyObject *)self);
2276 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277}
2278
2279
2280static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002281get_Pickler(PyObject *self, PyObject *args) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002282 PyObject *file=NULL;
2283 int bin;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284
Guido van Rossum053b8df1998-11-25 16:18:00 +00002285 bin=1;
Guido van Rossum43713e52000-02-29 13:59:29 +00002286 if (! PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002287 PyErr_Clear();
2288 bin=0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002289 if (! PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
Guido van Rossum053b8df1998-11-25 16:18:00 +00002290 return NULL;
2291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002293}
2294
2295
2296static void
Guido van Rossum60456fd1997-04-09 17:36:32 +00002297Pickler_dealloc(Picklerobject *self) {
2298 Py_XDECREF(self->write);
2299 Py_XDECREF(self->memo);
2300 Py_XDECREF(self->arg);
2301 Py_XDECREF(self->file);
2302 Py_XDECREF(self->pers_func);
2303 Py_XDECREF(self->inst_pers_func);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002304 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002305
Tim Peters84e87f32001-03-17 04:50:51 +00002306 if (self->write_buf) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002307 free(self->write_buf);
2308 }
2309
Guido van Rossumb18618d2000-05-03 23:44:39 +00002310 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002311}
2312
2313
2314static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002315Pickler_getattr(Picklerobject *self, char *name) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002316
2317 switch (*name) {
2318 case 'p':
Guido van Rossum60456fd1997-04-09 17:36:32 +00002319 if (strcmp(name, "persistent_id") == 0) {
2320 if (!self->pers_func) {
2321 PyErr_SetString(PyExc_AttributeError, name);
2322 return NULL;
2323 }
2324
2325 Py_INCREF(self->pers_func);
2326 return self->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002327 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002328 break;
2329 case 'm':
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330 if (strcmp(name, "memo") == 0) {
2331 if (!self->memo) {
2332 PyErr_SetString(PyExc_AttributeError, name);
2333 return NULL;
2334 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002335
Guido van Rossum60456fd1997-04-09 17:36:32 +00002336 Py_INCREF(self->memo);
2337 return self->memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002338 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002339 break;
2340 case 'P':
Guido van Rossum60456fd1997-04-09 17:36:32 +00002341 if (strcmp(name, "PicklingError") == 0) {
2342 Py_INCREF(PicklingError);
2343 return PicklingError;
2344 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002345 break;
2346 case 'b':
2347 if (strcmp(name, "binary")==0)
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002348 return PyInt_FromLong(self->bin);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002349 break;
2350 case 'f':
2351 if (strcmp(name, "fast")==0)
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002352 return PyInt_FromLong(self->fast);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002353 break;
2354 case 'g':
2355 if (strcmp(name, "getvalue")==0 && ! Pdata_Check(self->file)) {
2356 PyErr_SetString(PyExc_AttributeError, name);
2357 return NULL;
2358 }
2359 break;
2360 }
2361 return Py_FindMethod(Pickler_methods, (PyObject *)self, name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002362}
2363
2364
Tim Peters84e87f32001-03-17 04:50:51 +00002365int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002366Pickler_setattr(Picklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002367
Guido van Rossum053b8df1998-11-25 16:18:00 +00002368 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002369 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002370 "attribute deletion is not supported");
2371 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002372 }
Tim Peters84e87f32001-03-17 04:50:51 +00002373
Guido van Rossum60456fd1997-04-09 17:36:32 +00002374 if (strcmp(name, "persistent_id") == 0) {
2375 Py_XDECREF(self->pers_func);
2376 self->pers_func = value;
2377 Py_INCREF(value);
2378 return 0;
2379 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002380
Guido van Rossum60456fd1997-04-09 17:36:32 +00002381 if (strcmp(name, "inst_persistent_id") == 0) {
2382 Py_XDECREF(self->inst_pers_func);
2383 self->inst_pers_func = value;
2384 Py_INCREF(value);
2385 return 0;
2386 }
2387
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002388 if (strcmp(name, "memo") == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002389 if (! PyDict_Check(value)) {
2390 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2391 return -1;
2392 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002393 Py_XDECREF(self->memo);
2394 self->memo = value;
2395 Py_INCREF(value);
2396 return 0;
2397 }
2398
Guido van Rossum053b8df1998-11-25 16:18:00 +00002399 if (strcmp(name, "binary")==0) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002400 self->bin=PyObject_IsTrue(value);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002401 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002402 }
2403
Guido van Rossum053b8df1998-11-25 16:18:00 +00002404 if (strcmp(name, "fast")==0) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002405 self->fast=PyObject_IsTrue(value);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002406 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002407 }
2408
Guido van Rossum60456fd1997-04-09 17:36:32 +00002409 PyErr_SetString(PyExc_AttributeError, name);
2410 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002411}
2412
2413
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002414static char Picklertype__doc__[] =
2415"Objects that know how to pickle objects\n"
2416;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002417
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002418static PyTypeObject Picklertype = {
2419 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002420 0, /*ob_size*/
2421 "Pickler", /*tp_name*/
2422 sizeof(Picklerobject), /*tp_basicsize*/
2423 0, /*tp_itemsize*/
2424 /* methods */
2425 (destructor)Pickler_dealloc, /*tp_dealloc*/
2426 (printfunc)0, /*tp_print*/
2427 (getattrfunc)Pickler_getattr, /*tp_getattr*/
2428 (setattrfunc)Pickler_setattr, /*tp_setattr*/
2429 (cmpfunc)0, /*tp_compare*/
2430 (reprfunc)0, /*tp_repr*/
2431 0, /*tp_as_number*/
2432 0, /*tp_as_sequence*/
2433 0, /*tp_as_mapping*/
2434 (hashfunc)0, /*tp_hash*/
2435 (ternaryfunc)0, /*tp_call*/
2436 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002437
Guido van Rossum60456fd1997-04-09 17:36:32 +00002438 /* Space for future expansion */
2439 0L,0L,0L,0L,
2440 Picklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002441};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002442
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002443static PyObject *
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002444find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) {
Guido van Rossume2d81cd1998-08-08 19:40:10 +00002445 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002446
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002447 if (fc) {
2448 if (fc==Py_None) {
Tim Peters84e87f32001-03-17 04:50:51 +00002449 PyErr_SetString(UnpicklingError,
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002450 "Global and instance pickles are not supported.");
2451 return NULL;
2452 }
2453 return PyObject_CallFunction(fc, "OO", py_module_name, py_global_name);
2454 }
2455
Jeremy Hyltond1055231998-08-11 19:52:51 +00002456 module = PySys_GetObject("modules");
2457 if (module == NULL)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002458 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002459
2460 module = PyDict_GetItem(module, py_module_name);
2461 if (module == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002462 module = PyImport_Import(py_module_name);
2463 if (!module)
2464 return NULL;
2465 global = PyObject_GetAttr(module, py_global_name);
2466 Py_DECREF(module);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002467 }
Jeremy Hyltond1055231998-08-11 19:52:51 +00002468 else
Guido van Rossum053b8df1998-11-25 16:18:00 +00002469 global = PyObject_GetAttr(module, py_global_name);
Jeremy Hyltond1055231998-08-11 19:52:51 +00002470 if (global == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002471 char buf[256 + 37];
2472 sprintf(buf, "Failed to import class %.128s from module %.128s",
2473 PyString_AS_STRING((PyStringObject*)py_global_name),
Tim Peters84e87f32001-03-17 04:50:51 +00002474 PyString_AS_STRING((PyStringObject*)py_module_name));
Guido van Rossum053b8df1998-11-25 16:18:00 +00002475 PyErr_SetString(PyExc_SystemError, buf);
2476 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002477 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002478 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002479}
2480
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002481static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002482marker(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002483 if (self->num_marks < 1) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002484 PyErr_SetString(UnpicklingError, "could not find MARK");
2485 return -1;
2486 }
2487
2488 return self->marks[--self->num_marks];
2489}
2490
Tim Peters84e87f32001-03-17 04:50:51 +00002491
Guido van Rossum60456fd1997-04-09 17:36:32 +00002492static int
2493load_none(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002494 PDATA_APPEND(self->stack, Py_None, -1);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002495 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002496}
2497
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002498static int
Thomas Wouters58d05102000-07-24 14:43:35 +00002499bad_readline(void) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002500 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2501 return -1;
2502}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002503
2504static int
2505load_int(Unpicklerobject *self) {
2506 PyObject *py_int = 0;
2507 char *endptr, *s;
2508 int len, res = -1;
2509 long l;
2510
2511 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002512 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002513 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002514
2515 errno = 0;
2516 l = strtol(s, &endptr, 0);
2517
2518 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2519 /* Hm, maybe we've got something long. Let's try reading
Guido van Rossum053b8df1998-11-25 16:18:00 +00002520 it as a Python long object. */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002521 errno=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002522 UNLESS (py_int=PyLong_FromString(s,&endptr,0)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002523
Guido van Rossum053b8df1998-11-25 16:18:00 +00002524 if ((*endptr != '\n') || (endptr[1] != '\0')) {
2525 PyErr_SetString(PyExc_ValueError,
2526 "could not convert string to int");
2527 goto finally;
2528 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002529 }
2530 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002531 UNLESS (py_int = PyInt_FromLong(l)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002532 }
2533
Guido van Rossum053b8df1998-11-25 16:18:00 +00002534 free(s);
2535 PDATA_PUSH(self->stack, py_int, -1);
2536 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002537
2538finally:
2539 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002540
2541 return res;
2542}
2543
2544
Tim Peters84e87f32001-03-17 04:50:51 +00002545static long
Guido van Rossum60456fd1997-04-09 17:36:32 +00002546calc_binint(char *s, int x) {
2547 unsigned char c;
2548 int i;
2549 long l;
2550
2551 for (i = 0, l = 0L; i < x; i++) {
2552 c = (unsigned char)s[i];
2553 l |= (long)c << (i * 8);
2554 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002555#if SIZEOF_LONG > 4
2556 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2557 * is signed, so on a box with longs bigger than 4 bytes we need
2558 * to extend a BININT's sign bit to the full width.
2559 */
2560 if (x == 4 && l & (1L << 31))
2561 l |= (~0L) << 32;
2562#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00002563 return l;
2564}
2565
2566
2567static int
2568load_binintx(Unpicklerobject *self, char *s, int x) {
2569 PyObject *py_int = 0;
2570 long l;
2571
2572 l = calc_binint(s, x);
2573
Guido van Rossum053b8df1998-11-25 16:18:00 +00002574 UNLESS (py_int = PyInt_FromLong(l))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002575 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002576
Guido van Rossum053b8df1998-11-25 16:18:00 +00002577 PDATA_PUSH(self->stack, py_int, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002578 return 0;
2579}
2580
2581
2582static int
2583load_binint(Unpicklerobject *self) {
2584 char *s;
2585
2586 if ((*self->read_func)(self, &s, 4) < 0)
2587 return -1;
2588
2589 return load_binintx(self, s, 4);
2590}
2591
2592
2593static int
2594load_binint1(Unpicklerobject *self) {
2595 char *s;
2596
2597 if ((*self->read_func)(self, &s, 1) < 0)
2598 return -1;
2599
2600 return load_binintx(self, s, 1);
2601}
2602
2603
2604static int
2605load_binint2(Unpicklerobject *self) {
2606 char *s;
2607
2608 if ((*self->read_func)(self, &s, 2) < 0)
2609 return -1;
2610
2611 return load_binintx(self, s, 2);
2612}
Tim Peters84e87f32001-03-17 04:50:51 +00002613
Guido van Rossum60456fd1997-04-09 17:36:32 +00002614static int
2615load_long(Unpicklerobject *self) {
2616 PyObject *l = 0;
2617 char *end, *s;
2618 int len, res = -1;
2619
Guido van Rossum60456fd1997-04-09 17:36:32 +00002620 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002621 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002622 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002623
Guido van Rossum053b8df1998-11-25 16:18:00 +00002624 UNLESS (l = PyLong_FromString(s, &end, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002625 goto finally;
2626
Guido van Rossum053b8df1998-11-25 16:18:00 +00002627 free(s);
2628 PDATA_PUSH(self->stack, l, -1);
2629 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002630
2631finally:
2632 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002633
2634 return res;
2635}
2636
Tim Peters84e87f32001-03-17 04:50:51 +00002637
Guido van Rossum60456fd1997-04-09 17:36:32 +00002638static int
2639load_float(Unpicklerobject *self) {
2640 PyObject *py_float = 0;
2641 char *endptr, *s;
2642 int len, res = -1;
2643 double d;
2644
2645 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002646 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002647 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002648
2649 errno = 0;
2650 d = strtod(s, &endptr);
2651
2652 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
Tim Peters84e87f32001-03-17 04:50:51 +00002653 PyErr_SetString(PyExc_ValueError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00002654 "could not convert string to float");
2655 goto finally;
2656 }
2657
Guido van Rossum053b8df1998-11-25 16:18:00 +00002658 UNLESS (py_float = PyFloat_FromDouble(d))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002659 goto finally;
2660
Guido van Rossum053b8df1998-11-25 16:18:00 +00002661 free(s);
2662 PDATA_PUSH(self->stack, py_float, -1);
2663 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002664
2665finally:
2666 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002667
2668 return res;
2669}
2670
Guido van Rossum60456fd1997-04-09 17:36:32 +00002671static int
2672load_binfloat(Unpicklerobject *self) {
2673 PyObject *py_float = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00002674 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675 long fhi, flo;
2676 double x;
2677 char *p;
2678
2679 if ((*self->read_func)(self, &p, 8) < 0)
2680 return -1;
2681
2682 /* First byte */
2683 s = (*p>>7) & 1;
2684 e = (*p & 0x7F) << 4;
2685 p++;
2686
2687 /* Second byte */
2688 e |= (*p>>4) & 0xF;
2689 fhi = (*p & 0xF) << 24;
2690 p++;
2691
2692 /* Third byte */
2693 fhi |= (*p & 0xFF) << 16;
2694 p++;
2695
2696 /* Fourth byte */
2697 fhi |= (*p & 0xFF) << 8;
2698 p++;
2699
2700 /* Fifth byte */
2701 fhi |= *p & 0xFF;
2702 p++;
2703
2704 /* Sixth byte */
2705 flo = (*p & 0xFF) << 16;
2706 p++;
2707
2708 /* Seventh byte */
2709 flo |= (*p & 0xFF) << 8;
2710 p++;
2711
2712 /* Eighth byte */
2713 flo |= *p & 0xFF;
2714
2715 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2716 x /= 268435456.0; /* 2**28 */
2717
2718 /* XXX This sadly ignores Inf/NaN */
2719 if (e == 0)
2720 e = -1022;
2721 else {
2722 x += 1.0;
2723 e -= 1023;
2724 }
2725 x = ldexp(x, e);
2726
2727 if (s)
2728 x = -x;
2729
Guido van Rossum053b8df1998-11-25 16:18:00 +00002730 UNLESS (py_float = PyFloat_FromDouble(x)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002731
Guido van Rossum053b8df1998-11-25 16:18:00 +00002732 PDATA_PUSH(self->stack, py_float, -1);
2733 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
2736static int
2737load_string(Unpicklerobject *self) {
2738 PyObject *str = 0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002739 int len, res = -1, nslash;
2740 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741
2742 static PyObject *eval_dict = 0;
2743
2744 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002745 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002746 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002747
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002748 /* Check for unquoted quotes (evil strings) */
2749 q=*s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002750 if (q != '"' && q != '\'') goto insecure;
2751 for (p=s+1, nslash=0; *p; p++) {
2752 if (*p==q && nslash%2==0) break;
2753 if (*p=='\\') nslash++;
2754 else nslash=0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002755 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002756 if (*p==q)
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002757 {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002758 for (p++; *p; p++) if (*p > ' ') goto insecure;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002759 }
2760 else goto insecure;
2761 /********************************************/
2762
Guido van Rossum053b8df1998-11-25 16:18:00 +00002763 UNLESS (eval_dict)
2764 UNLESS (eval_dict = Py_BuildValue("{s{}}", "__builtins__"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765 goto finally;
2766
Guido van Rossum053b8df1998-11-25 16:18:00 +00002767 UNLESS (str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768 goto finally;
2769
Guido van Rossum053b8df1998-11-25 16:18:00 +00002770 free(s);
2771 PDATA_PUSH(self->stack, str, -1);
2772 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002773
2774finally:
2775 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776
2777 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002778
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002779insecure:
2780 free(s);
2781 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2782 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002783}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784
2785
2786static int
2787load_binstring(Unpicklerobject *self) {
2788 PyObject *py_string = 0;
2789 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790 char *s;
2791
Guido van Rossum053b8df1998-11-25 16:18:00 +00002792 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002793
2794 l = calc_binint(s, 4);
2795
2796 if ((*self->read_func)(self, &s, l) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002797 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002798
Guido van Rossum053b8df1998-11-25 16:18:00 +00002799 UNLESS (py_string = PyString_FromStringAndSize(s, l))
2800 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002801
Guido van Rossum053b8df1998-11-25 16:18:00 +00002802 PDATA_PUSH(self->stack, py_string, -1);
2803 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804}
2805
2806
2807static int
2808load_short_binstring(Unpicklerobject *self) {
2809 PyObject *py_string = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002810 unsigned char l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811 char *s;
2812
2813 if ((*self->read_func)(self, &s, 1) < 0)
2814 return -1;
2815
2816 l = (unsigned char)s[0];
2817
Guido van Rossum053b8df1998-11-25 16:18:00 +00002818 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
Guido van Rossum053b8df1998-11-25 16:18:00 +00002820 UNLESS (py_string = PyString_FromStringAndSize(s, l)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821
Guido van Rossum053b8df1998-11-25 16:18:00 +00002822 PDATA_PUSH(self->stack, py_string, -1);
2823 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002824}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002825
2826
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002827#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002829load_unicode(Unpicklerobject *self) {
2830 PyObject *str = 0;
2831 int len, res = -1;
2832 char *s;
2833
2834 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00002835 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002836
2837 UNLESS (str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))
2838 goto finally;
2839
2840 PDATA_PUSH(self->stack, str, -1);
2841 return 0;
2842
2843finally:
2844 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002845}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002846#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002847
2848
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002849#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002850static int
2851load_binunicode(Unpicklerobject *self) {
2852 PyObject *unicode;
2853 long l;
2854 char *s;
2855
2856 if ((*self->read_func)(self, &s, 4) < 0) return -1;
2857
2858 l = calc_binint(s, 4);
2859
2860 if ((*self->read_func)(self, &s, l) < 0)
2861 return -1;
2862
2863 UNLESS (unicode = PyUnicode_DecodeUTF8(s, l, NULL))
2864 return -1;
2865
2866 PDATA_PUSH(self->stack, unicode, -1);
2867 return 0;
2868}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002869#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002870
2871
2872static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002873load_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002874 PyObject *tup;
2875 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002876
Guido van Rossum053b8df1998-11-25 16:18:00 +00002877 if ((i = marker(self)) < 0) return -1;
2878 UNLESS (tup=Pdata_popTuple(self->stack, i)) return -1;
2879 PDATA_PUSH(self->stack, tup, -1);
2880 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002881}
2882
2883static int
2884load_empty_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002885 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002886
Guido van Rossum053b8df1998-11-25 16:18:00 +00002887 UNLESS (tup=PyTuple_New(0)) return -1;
2888 PDATA_PUSH(self->stack, tup, -1);
2889 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890}
2891
2892static int
2893load_empty_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002894 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002895
Guido van Rossum053b8df1998-11-25 16:18:00 +00002896 UNLESS (list=PyList_New(0)) return -1;
2897 PDATA_PUSH(self->stack, list, -1);
2898 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002899}
2900
2901static int
2902load_empty_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002903 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002904
Guido van Rossum053b8df1998-11-25 16:18:00 +00002905 UNLESS (dict=PyDict_New()) return -1;
2906 PDATA_PUSH(self->stack, dict, -1);
2907 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002908}
2909
2910
2911static int
2912load_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002913 PyObject *list = 0;
2914 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Guido van Rossum053b8df1998-11-25 16:18:00 +00002916 if ((i = marker(self)) < 0) return -1;
2917 UNLESS (list=Pdata_popList(self->stack, i)) return -1;
2918 PDATA_PUSH(self->stack, list, -1);
2919 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920}
2921
2922static int
2923load_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002924 PyObject *dict, *key, *value;
2925 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002926
Guido van Rossum053b8df1998-11-25 16:18:00 +00002927 if ((i = marker(self)) < 0) return -1;
2928 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929
Guido van Rossum053b8df1998-11-25 16:18:00 +00002930 UNLESS (dict = PyDict_New()) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002931
Guido van Rossum053b8df1998-11-25 16:18:00 +00002932 for (k = i+1; k < j; k += 2) {
2933 key =self->stack->data[k-1];
2934 value=self->stack->data[k ];
2935 if (PyDict_SetItem(dict, key, value) < 0) {
2936 Py_DECREF(dict);
2937 return -1;
2938 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002940 Pdata_clear(self->stack, i);
2941 PDATA_PUSH(self->stack, dict, -1);
2942 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943}
2944
2945static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002946Instance_New(PyObject *cls, PyObject *args) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947 int has_key;
2948 PyObject *safe=0, *r=0;
2949
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002950 if (PyClass_Check(cls)) {
2951 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00002952
Jeremy Hylton03657cf2000-07-12 13:05:33 +00002953 if ((l=PyObject_Size(args)) < 0) goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002954 UNLESS (l) {
2955 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002956
Guido van Rossum053b8df1998-11-25 16:18:00 +00002957 UNLESS (__getinitargs__=PyObject_GetAttr(cls, __getinitargs___str)) {
2958 /* We have a class with no __getinitargs__, so bypass usual
2959 construction */
Fred Drake2c773552001-03-22 17:52:17 +00002960 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002961
Guido van Rossum053b8df1998-11-25 16:18:00 +00002962 PyErr_Clear();
Fred Drake2c773552001-03-22 17:52:17 +00002963 UNLESS (inst=PyInstance_NewRaw(cls, NULL))
Guido van Rossum053b8df1998-11-25 16:18:00 +00002964 goto err;
Fred Drake2c773552001-03-22 17:52:17 +00002965 return inst;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002966 }
2967 Py_DECREF(__getinitargs__);
2968 }
Tim Peters84e87f32001-03-17 04:50:51 +00002969
Guido van Rossum053b8df1998-11-25 16:18:00 +00002970 if ((r=PyInstance_New(cls, args, NULL))) return r;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002971 else goto err;
2972 }
Tim Peters84e87f32001-03-17 04:50:51 +00002973
2974
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975 if ((has_key = cPickle_PyMapping_HasKey(safe_constructors, cls)) < 0)
2976 goto err;
Tim Peters84e87f32001-03-17 04:50:51 +00002977
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978 if (!has_key)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002979 if (!(safe = PyObject_GetAttr(cls, __safe_for_unpickling___str)) ||
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980 !PyObject_IsTrue(safe)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002981 cPickle_ErrFormat(UnpicklingError,
2982 "%s is not safe for unpickling", "O", cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983 Py_XDECREF(safe);
2984 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002985 }
2986
Guido van Rossum053b8df1998-11-25 16:18:00 +00002987 if (args==Py_None) {
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002988 /* Special case, call cls.__basicnew__() */
2989 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00002990
Guido van Rossum053b8df1998-11-25 16:18:00 +00002991 UNLESS (basicnew=PyObject_GetAttr(cls, __basicnew___str)) return NULL;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002992 r=PyObject_CallObject(basicnew, NULL);
2993 Py_DECREF(basicnew);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002994 if (r) return r;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002995 }
2996
Guido van Rossum053b8df1998-11-25 16:18:00 +00002997 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00002998
Guido van Rossum60456fd1997-04-09 17:36:32 +00002999err:
3000 {
3001 PyObject *tp, *v, *tb;
3002
3003 PyErr_Fetch(&tp, &v, &tb);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003004 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3005 Py_XDECREF(v);
3006 v=r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007 }
3008 PyErr_Restore(tp,v,tb);
3009 }
3010 return NULL;
3011}
Tim Peters84e87f32001-03-17 04:50:51 +00003012
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
3014static int
3015load_obj(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003016 PyObject *class, *tup, *obj=0;
3017 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003018
Guido van Rossum053b8df1998-11-25 16:18:00 +00003019 if ((i = marker(self)) < 0) return -1;
3020 UNLESS (tup=Pdata_popTuple(self->stack, i+1)) return -1;
3021 PDATA_POP(self->stack, class);
3022 if (class) {
3023 obj = Instance_New(class, tup);
3024 Py_DECREF(class);
3025 }
3026 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027
Guido van Rossum053b8df1998-11-25 16:18:00 +00003028 if (! obj) return -1;
3029 PDATA_PUSH(self->stack, obj, -1);
3030 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003031}
3032
3033
3034static int
3035load_inst(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003036 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003037 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038 char *s;
3039
Guido van Rossum053b8df1998-11-25 16:18:00 +00003040 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003041
Guido van Rossum053b8df1998-11-25 16:18:00 +00003042 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003043 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003044 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003045
Guido van Rossum053b8df1998-11-25 16:18:00 +00003046 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003047 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003048 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003049 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003050 Py_DECREF(class_name);
3051 }
3052 }
3053 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003054
Guido van Rossum053b8df1998-11-25 16:18:00 +00003055 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003056
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003057 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003058 obj = Instance_New(class, tup);
3059 Py_DECREF(tup);
3060 }
3061 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003062
Guido van Rossum053b8df1998-11-25 16:18:00 +00003063 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003064
Guido van Rossum053b8df1998-11-25 16:18:00 +00003065 PDATA_PUSH(self->stack, obj, -1);
3066 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003067}
3068
3069
3070static int
3071load_global(Unpicklerobject *self) {
3072 PyObject *class = 0, *module_name = 0, *class_name = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003073 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074 char *s;
3075
Guido van Rossum053b8df1998-11-25 16:18:00 +00003076 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003077 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003078 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079
Guido van Rossum053b8df1998-11-25 16:18:00 +00003080 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003081 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003082 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003083 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003084 Py_DECREF(class_name);
3085 }
3086 }
3087 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Guido van Rossum053b8df1998-11-25 16:18:00 +00003089 if (! class) return -1;
3090 PDATA_PUSH(self->stack, class, -1);
3091 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092}
3093
3094
3095static int
3096load_persid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003097 PyObject *pid = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003098 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099 char *s;
3100
3101 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003102 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003103 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003104
Guido van Rossum053b8df1998-11-25 16:18:00 +00003105 UNLESS (pid = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Guido van Rossum053b8df1998-11-25 16:18:00 +00003107 if (PyList_Check(self->pers_func)) {
3108 if (PyList_Append(self->pers_func, pid) < 0) {
3109 Py_DECREF(pid);
3110 return -1;
3111 }
3112 }
3113 else {
3114 ARG_TUP(self, pid);
3115 if (self->arg) {
3116 pid = PyObject_CallObject(self->pers_func, self->arg);
3117 FREE_ARG_TUP(self);
3118 }
3119 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
Guido van Rossum053b8df1998-11-25 16:18:00 +00003121 if (! pid) return -1;
3122
3123 PDATA_PUSH(self->stack, pid, -1);
3124 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003125 }
3126 else {
3127 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003128 "A load persistent id instruction was encountered,\n"
3129 "but no persistent_load function was specified.");
3130 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003132}
3133
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134static int
3135load_binpersid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003136 PyObject *pid = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
3138 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003139 PDATA_POP(self->stack, pid);
3140 if (! pid) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Guido van Rossum053b8df1998-11-25 16:18:00 +00003142 if (PyList_Check(self->pers_func)) {
3143 if (PyList_Append(self->pers_func, pid) < 0) {
3144 Py_DECREF(pid);
3145 return -1;
3146 }
3147 }
3148 else {
3149 ARG_TUP(self, pid);
3150 if (self->arg) {
3151 pid = PyObject_CallObject(self->pers_func, self->arg);
3152 FREE_ARG_TUP(self);
3153 }
3154 if (! pid) return -1;
3155 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Guido van Rossum053b8df1998-11-25 16:18:00 +00003157 PDATA_PUSH(self->stack, pid, -1);
3158 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003159 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003160 else {
3161 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003162 "A load persistent id instruction was encountered,\n"
3163 "but no persistent_load function was specified.");
3164 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003165 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003166}
3167
3168
3169static int
3170load_pop(Unpicklerobject *self) {
3171 int len;
3172
Guido van Rossum053b8df1998-11-25 16:18:00 +00003173 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Tim Peters84e87f32001-03-17 04:50:51 +00003175 /* Note that we split the (pickle.py) stack into two stacks,
Guido van Rossumea2b7152000-05-09 18:14:50 +00003176 an object stack and a mark stack. We have to be clever and
3177 pop the right one. We do this by looking at the top of the
3178 mark stack.
3179 */
3180
Tim Peters84e87f32001-03-17 04:50:51 +00003181 if ((self->num_marks > 0) &&
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182 (self->marks[self->num_marks - 1] == len))
3183 self->num_marks--;
Tim Peters84e87f32001-03-17 04:50:51 +00003184 else {
Guido van Rossumea2b7152000-05-09 18:14:50 +00003185 len--;
3186 Py_DECREF(self->stack->data[len]);
3187 self->stack->length=len;
3188 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
3190 return 0;
3191}
3192
3193
3194static int
3195load_pop_mark(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003196 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197
3198 if ((i = marker(self)) < 0)
3199 return -1;
3200
Guido van Rossum053b8df1998-11-25 16:18:00 +00003201 Pdata_clear(self->stack, i);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202
3203 return 0;
3204}
3205
3206
3207static int
3208load_dup(Unpicklerobject *self) {
3209 PyObject *last;
3210 int len;
3211
Guido van Rossum053b8df1998-11-25 16:18:00 +00003212 if ((len = self->stack->length) <= 0) return stackUnderflow();
3213 last=self->stack->data[len-1];
3214 Py_INCREF(last);
3215 PDATA_PUSH(self->stack, last, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216 return 0;
3217}
3218
3219
3220static int
3221load_get(Unpicklerobject *self) {
3222 PyObject *py_str = 0, *value = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003223 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003225 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003226
Guido van Rossum053b8df1998-11-25 16:18:00 +00003227 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003228 if (len < 2) return bad_readline();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Guido van Rossum053b8df1998-11-25 16:18:00 +00003230 UNLESS (py_str = PyString_FromStringAndSize(s, len - 1)) return -1;
3231
3232 value = PyDict_GetItem(self->memo, py_str);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003233 if (! value) {
3234 PyErr_SetObject(BadPickleGet, py_str);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003235 rc = -1;
3236 } else {
3237 PDATA_APPEND(self->stack, value, -1);
3238 rc = 0;
3239 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Guido van Rossum2f80d961999-07-13 15:18:58 +00003241 Py_DECREF(py_str);
3242 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243}
3244
3245
3246static int
3247load_binget(Unpicklerobject *self) {
3248 PyObject *py_key = 0, *value = 0;
3249 unsigned char key;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003250 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003251 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003252
Guido van Rossum053b8df1998-11-25 16:18:00 +00003253 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254
3255 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003256 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003257
Guido van Rossum053b8df1998-11-25 16:18:00 +00003258 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003259 if (! value) {
3260 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003261 rc = -1;
3262 } else {
3263 PDATA_APPEND(self->stack, value, -1);
3264 rc = 0;
3265 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266
Guido van Rossum2f80d961999-07-13 15:18:58 +00003267 Py_DECREF(py_key);
3268 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269}
3270
3271
3272static int
3273load_long_binget(Unpicklerobject *self) {
3274 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003275 unsigned char c;
3276 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277 long key;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003278 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Guido van Rossum053b8df1998-11-25 16:18:00 +00003280 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
3282 c = (unsigned char)s[0];
3283 key = (long)c;
3284 c = (unsigned char)s[1];
3285 key |= (long)c << 8;
3286 c = (unsigned char)s[2];
3287 key |= (long)c << 16;
3288 c = (unsigned char)s[3];
3289 key |= (long)c << 24;
3290
Guido van Rossum053b8df1998-11-25 16:18:00 +00003291 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003292
Guido van Rossum053b8df1998-11-25 16:18:00 +00003293 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003294 if (! value) {
3295 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003296 rc = -1;
3297 } else {
3298 PDATA_APPEND(self->stack, value, -1);
3299 rc = 0;
3300 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003301
Guido van Rossum2f80d961999-07-13 15:18:58 +00003302 Py_DECREF(py_key);
3303 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304}
3305
3306
3307static int
3308load_put(Unpicklerobject *self) {
3309 PyObject *py_str = 0, *value = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003310 int len, l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311 char *s;
3312
Guido van Rossum053b8df1998-11-25 16:18:00 +00003313 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumd1f66dc1999-02-08 22:38:25 +00003314 if (l < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003315 UNLESS (len=self->stack->length) return stackUnderflow();
3316 UNLESS (py_str = PyString_FromStringAndSize(s, l - 1)) return -1;
3317 value=self->stack->data[len-1];
3318 l=PyDict_SetItem(self->memo, py_str, value);
3319 Py_DECREF(py_str);
3320 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321}
3322
3323
3324static int
3325load_binput(Unpicklerobject *self) {
3326 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003327 unsigned char key;
3328 char *s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003329 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003330
Guido van Rossum053b8df1998-11-25 16:18:00 +00003331 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3332 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003333
3334 key = (unsigned char)s[0];
3335
Guido van Rossum053b8df1998-11-25 16:18:00 +00003336 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3337 value=self->stack->data[len-1];
3338 len=PyDict_SetItem(self->memo, py_key, value);
3339 Py_DECREF(py_key);
3340 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341}
3342
3343
3344static int
3345load_long_binput(Unpicklerobject *self) {
3346 PyObject *py_key = 0, *value = 0;
3347 long key;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003348 unsigned char c;
3349 char *s;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003350 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003351
Guido van Rossum053b8df1998-11-25 16:18:00 +00003352 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3353 UNLESS (len=self->stack->length) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
3355 c = (unsigned char)s[0];
3356 key = (long)c;
3357 c = (unsigned char)s[1];
3358 key |= (long)c << 8;
3359 c = (unsigned char)s[2];
3360 key |= (long)c << 16;
3361 c = (unsigned char)s[3];
3362 key |= (long)c << 24;
3363
Guido van Rossum053b8df1998-11-25 16:18:00 +00003364 UNLESS (py_key = PyInt_FromLong(key)) return -1;
3365 value=self->stack->data[len-1];
3366 len=PyDict_SetItem(self->memo, py_key, value);
3367 Py_DECREF(py_key);
3368 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003369}
3370
3371
Tim Peters84e87f32001-03-17 04:50:51 +00003372static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00003373do_append(Unpicklerobject *self, int x) {
3374 PyObject *value = 0, *list = 0, *append_method = 0;
3375 int len, i;
3376
Guido van Rossum053b8df1998-11-25 16:18:00 +00003377 UNLESS ((len=self->stack->length) >= x && x > 0) return stackUnderflow();
3378 if (len==x) return 0; /* nothing to do */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379
Guido van Rossum053b8df1998-11-25 16:18:00 +00003380 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
3382 if (PyList_Check(list)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003383 PyObject *slice;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003384 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003385
Guido van Rossum053b8df1998-11-25 16:18:00 +00003386 slice=Pdata_popList(self->stack, x);
3387 list_len = PyList_GET_SIZE(list);
3388 i=PyList_SetSlice(list, list_len, list_len, slice);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389 Py_DECREF(slice);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003390 return i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003391 }
3392 else {
3393
Guido van Rossum053b8df1998-11-25 16:18:00 +00003394 UNLESS (append_method = PyObject_GetAttr(list, append_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003396
Guido van Rossum60456fd1997-04-09 17:36:32 +00003397 for (i = x; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003398 PyObject *junk;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399
Guido van Rossum053b8df1998-11-25 16:18:00 +00003400 value=self->stack->data[i];
3401 junk=0;
3402 ARG_TUP(self, value);
3403 if (self->arg) {
3404 junk = PyObject_CallObject(append_method, self->arg);
3405 FREE_ARG_TUP(self);
3406 }
3407 if (! junk) {
3408 Pdata_clear(self->stack, i+1);
3409 self->stack->length=x;
3410 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003412 }
3413 Py_DECREF(junk);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003415 self->stack->length=x;
3416 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003417 }
3418
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420}
3421
Tim Peters84e87f32001-03-17 04:50:51 +00003422
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423static int
3424load_append(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003425 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003426}
3427
3428
3429static int
3430load_appends(Unpicklerobject *self) {
3431 return do_append(self, marker(self));
3432}
3433
3434
3435static int
3436do_setitems(Unpicklerobject *self, int x) {
3437 PyObject *value = 0, *key = 0, *dict = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003438 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Guido van Rossum053b8df1998-11-25 16:18:00 +00003440 UNLESS ((len=self->stack->length) >= x
3441 && x > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
Guido van Rossum053b8df1998-11-25 16:18:00 +00003443 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Guido van Rossum053b8df1998-11-25 16:18:00 +00003445 for (i = x+1; i < len; i += 2) {
3446 key =self->stack->data[i-1];
3447 value=self->stack->data[i ];
3448 if (PyObject_SetItem(dict, key, value) < 0) {
3449 r=-1;
3450 break;
3451 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452 }
3453
Guido van Rossum053b8df1998-11-25 16:18:00 +00003454 Pdata_clear(self->stack, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Guido van Rossum053b8df1998-11-25 16:18:00 +00003456 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457}
3458
3459
3460static int
3461load_setitem(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003462 return do_setitems(self, self->stack->length - 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463}
3464
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465static int
3466load_setitems(Unpicklerobject *self) {
3467 return do_setitems(self, marker(self));
3468}
3469
3470
3471static int
3472load_build(Unpicklerobject *self) {
Tim Peters84e87f32001-03-17 04:50:51 +00003473 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474 *junk = 0, *__setstate__ = 0;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003475 int i, r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476
Guido van Rossum053b8df1998-11-25 16:18:00 +00003477 if (self->stack->length < 2) return stackUnderflow();
3478 PDATA_POP(self->stack, value);
3479 if (! value) return -1;
3480 inst=self->stack->data[self->stack->length-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481
Guido van Rossum053b8df1998-11-25 16:18:00 +00003482 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3483 ARG_TUP(self, value);
3484 if (self->arg) {
3485 junk = PyObject_CallObject(__setstate__, self->arg);
3486 FREE_ARG_TUP(self);
3487 }
3488 Py_DECREF(__setstate__);
3489 if (! junk) return -1;
3490 Py_DECREF(junk);
3491 return 0;
3492 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003493
Guido van Rossum053b8df1998-11-25 16:18:00 +00003494 PyErr_Clear();
3495 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496 i = 0;
3497 while (PyDict_Next(value, &i, &d_key, &d_value)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003498 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3499 r=-1;
3500 break;
3501 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003502 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003503 Py_DECREF(instdict);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003505 else r=-1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003506
Guido van Rossum053b8df1998-11-25 16:18:00 +00003507 Py_XDECREF(value);
Tim Peters84e87f32001-03-17 04:50:51 +00003508
Guido van Rossum053b8df1998-11-25 16:18:00 +00003509 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510}
3511
3512
3513static int
3514load_mark(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003515 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003516
Guido van Rossumea2b7152000-05-09 18:14:50 +00003517 /* Note that we split the (pickle.py) stack into two stacks, an
3518 object stack and a mark stack. Here we push a mark onto the
Tim Peters84e87f32001-03-17 04:50:51 +00003519 mark stack.
Guido van Rossumea2b7152000-05-09 18:14:50 +00003520 */
3521
Guido van Rossum053b8df1998-11-25 16:18:00 +00003522 if ((self->num_marks + 1) >= self->marks_size) {
3523 s=self->marks_size+20;
3524 if (s <= self->num_marks) s=self->num_marks + 1;
Guido van Rossum761fcd01999-04-12 22:51:20 +00003525 if (self->marks == NULL)
Guido van Rossumaa8d1671999-01-25 21:43:51 +00003526 self->marks=(int *)malloc(s * sizeof(int));
3527 else
3528 self->marks=(int *)realloc(self->marks, s * sizeof(int));
Guido van Rossum053b8df1998-11-25 16:18:00 +00003529 if (! self->marks) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530 PyErr_NoMemory();
3531 return -1;
3532 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003533 self->marks_size = s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534 }
3535
Guido van Rossum053b8df1998-11-25 16:18:00 +00003536 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
3538 return 0;
3539}
3540
3541static int
3542load_reduce(Unpicklerobject *self) {
3543 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Guido van Rossum053b8df1998-11-25 16:18:00 +00003545 PDATA_POP(self->stack, arg_tup);
3546 if (! arg_tup) return -1;
3547 PDATA_POP(self->stack, callable);
3548 if (callable) {
3549 ob = Instance_New(callable, arg_tup);
3550 Py_DECREF(callable);
3551 }
3552 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553
Guido van Rossum053b8df1998-11-25 16:18:00 +00003554 if (! ob) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003555
Guido van Rossum053b8df1998-11-25 16:18:00 +00003556 PDATA_PUSH(self->stack, ob, -1);
3557 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003558}
Tim Peters84e87f32001-03-17 04:50:51 +00003559
Guido van Rossum60456fd1997-04-09 17:36:32 +00003560static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003561load(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003562 PyObject *err = 0, *val = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563 char *s;
3564
Guido van Rossum60456fd1997-04-09 17:36:32 +00003565 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003566 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
3568 while (1) {
3569 if ((*self->read_func)(self, &s, 1) < 0)
3570 break;
3571
3572 switch (s[0]) {
3573 case NONE:
3574 if (load_none(self) < 0)
3575 break;
3576 continue;
3577
3578 case BININT:
3579 if (load_binint(self) < 0)
3580 break;
3581 continue;
3582
3583 case BININT1:
3584 if (load_binint1(self) < 0)
3585 break;
3586 continue;
3587
3588 case BININT2:
3589 if (load_binint2(self) < 0)
3590 break;
3591 continue;
3592
3593 case INT:
3594 if (load_int(self) < 0)
3595 break;
3596 continue;
3597
3598 case LONG:
3599 if (load_long(self) < 0)
3600 break;
3601 continue;
3602
3603 case FLOAT:
3604 if (load_float(self) < 0)
3605 break;
3606 continue;
3607
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608 case BINFLOAT:
3609 if (load_binfloat(self) < 0)
3610 break;
3611 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003612
3613 case BINSTRING:
3614 if (load_binstring(self) < 0)
3615 break;
3616 continue;
3617
3618 case SHORT_BINSTRING:
3619 if (load_short_binstring(self) < 0)
3620 break;
3621 continue;
3622
3623 case STRING:
3624 if (load_string(self) < 0)
3625 break;
3626 continue;
3627
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003628#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003629 case UNICODE:
3630 if (load_unicode(self) < 0)
3631 break;
3632 continue;
3633
3634 case BINUNICODE:
3635 if (load_binunicode(self) < 0)
3636 break;
3637 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003638#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003639
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640 case EMPTY_TUPLE:
3641 if (load_empty_tuple(self) < 0)
3642 break;
3643 continue;
3644
3645 case TUPLE:
3646 if (load_tuple(self) < 0)
3647 break;
3648 continue;
3649
3650 case EMPTY_LIST:
3651 if (load_empty_list(self) < 0)
3652 break;
3653 continue;
3654
3655 case LIST:
3656 if (load_list(self) < 0)
3657 break;
3658 continue;
3659
3660 case EMPTY_DICT:
3661 if (load_empty_dict(self) < 0)
3662 break;
3663 continue;
3664
3665 case DICT:
3666 if (load_dict(self) < 0)
3667 break;
3668 continue;
3669
3670 case OBJ:
3671 if (load_obj(self) < 0)
3672 break;
3673 continue;
3674
3675 case INST:
3676 if (load_inst(self) < 0)
3677 break;
3678 continue;
3679
3680 case GLOBAL:
3681 if (load_global(self) < 0)
3682 break;
3683 continue;
3684
3685 case APPEND:
3686 if (load_append(self) < 0)
3687 break;
3688 continue;
3689
3690 case APPENDS:
3691 if (load_appends(self) < 0)
3692 break;
3693 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003694
Guido van Rossum60456fd1997-04-09 17:36:32 +00003695 case BUILD:
3696 if (load_build(self) < 0)
3697 break;
3698 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003699
Guido van Rossum60456fd1997-04-09 17:36:32 +00003700 case DUP:
3701 if (load_dup(self) < 0)
3702 break;
3703 continue;
3704
3705 case BINGET:
3706 if (load_binget(self) < 0)
3707 break;
3708 continue;
3709
3710 case LONG_BINGET:
3711 if (load_long_binget(self) < 0)
3712 break;
3713 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003714
Guido van Rossum60456fd1997-04-09 17:36:32 +00003715 case GET:
3716 if (load_get(self) < 0)
3717 break;
3718 continue;
3719
3720 case MARK:
3721 if (load_mark(self) < 0)
3722 break;
3723 continue;
3724
3725 case BINPUT:
3726 if (load_binput(self) < 0)
3727 break;
3728 continue;
3729
3730 case LONG_BINPUT:
3731 if (load_long_binput(self) < 0)
3732 break;
3733 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003734
Guido van Rossum60456fd1997-04-09 17:36:32 +00003735 case PUT:
3736 if (load_put(self) < 0)
3737 break;
3738 continue;
3739
3740 case POP:
3741 if (load_pop(self) < 0)
3742 break;
3743 continue;
3744
3745 case POP_MARK:
3746 if (load_pop_mark(self) < 0)
3747 break;
3748 continue;
3749
3750 case SETITEM:
3751 if (load_setitem(self) < 0)
3752 break;
3753 continue;
3754
3755 case SETITEMS:
3756 if (load_setitems(self) < 0)
3757 break;
3758 continue;
3759
3760 case STOP:
3761 break;
3762
3763 case PERSID:
3764 if (load_persid(self) < 0)
3765 break;
3766 continue;
3767
3768 case BINPERSID:
3769 if (load_binpersid(self) < 0)
3770 break;
3771 continue;
3772
3773 case REDUCE:
3774 if (load_reduce(self) < 0)
3775 break;
3776 continue;
3777
Tim Peters84e87f32001-03-17 04:50:51 +00003778 default:
3779 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003781 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782 }
3783
3784 break;
3785 }
3786
Guido van Rossum053b8df1998-11-25 16:18:00 +00003787 if ((err = PyErr_Occurred())) {
3788 if (err == PyExc_EOFError) {
3789 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00003790 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003791 return NULL;
3792 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003793
Tim Peters84e87f32001-03-17 04:50:51 +00003794 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796}
Tim Peters84e87f32001-03-17 04:50:51 +00003797
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003799/* No-load functions to support noload, which is used to
3800 find persistent references. */
3801
3802static int
3803noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003804 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003805
3806 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003807 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003808}
3809
3810
3811static int
3812noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003813 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003814 char *s;
3815
3816 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003817 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003818 if ((*self->readline_func)(self, &s) < 0) return -1;
3819 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003820 PDATA_APPEND(self->stack, Py_None,-1);
3821 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003822}
3823
3824static int
3825noload_global(Unpicklerobject *self) {
3826 char *s;
3827
3828 if ((*self->readline_func)(self, &s) < 0) return -1;
3829 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003830 PDATA_APPEND(self->stack, Py_None,-1);
3831 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003832}
3833
3834static int
3835noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003836
Guido van Rossum053b8df1998-11-25 16:18:00 +00003837 if (self->stack->length < 2) return stackUnderflow();
3838 Pdata_clear(self->stack, self->stack->length-2);
3839 PDATA_APPEND(self->stack, Py_None,-1);
3840 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003841}
3842
3843static int
3844noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003845
Guido van Rossum053b8df1998-11-25 16:18:00 +00003846 if (self->stack->length < 1) return stackUnderflow();
3847 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003848 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003849}
3850
3851
3852static PyObject *
3853noload(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003854 PyObject *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003855 char *s;
3856
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003857 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003858 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003859
3860 while (1) {
3861 if ((*self->read_func)(self, &s, 1) < 0)
3862 break;
3863
3864 switch (s[0]) {
3865 case NONE:
3866 if (load_none(self) < 0)
3867 break;
3868 continue;
3869
3870 case BININT:
3871 if (load_binint(self) < 0)
3872 break;
3873 continue;
3874
3875 case BININT1:
3876 if (load_binint1(self) < 0)
3877 break;
3878 continue;
3879
3880 case BININT2:
3881 if (load_binint2(self) < 0)
3882 break;
3883 continue;
3884
3885 case INT:
3886 if (load_int(self) < 0)
3887 break;
3888 continue;
3889
3890 case LONG:
3891 if (load_long(self) < 0)
3892 break;
3893 continue;
3894
3895 case FLOAT:
3896 if (load_float(self) < 0)
3897 break;
3898 continue;
3899
3900 case BINFLOAT:
3901 if (load_binfloat(self) < 0)
3902 break;
3903 continue;
3904
3905 case BINSTRING:
3906 if (load_binstring(self) < 0)
3907 break;
3908 continue;
3909
3910 case SHORT_BINSTRING:
3911 if (load_short_binstring(self) < 0)
3912 break;
3913 continue;
3914
3915 case STRING:
3916 if (load_string(self) < 0)
3917 break;
3918 continue;
3919
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003920#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003921 case UNICODE:
3922 if (load_unicode(self) < 0)
3923 break;
3924 continue;
3925
3926 case BINUNICODE:
3927 if (load_binunicode(self) < 0)
3928 break;
3929 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003930#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003931
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003932 case EMPTY_TUPLE:
3933 if (load_empty_tuple(self) < 0)
3934 break;
3935 continue;
3936
3937 case TUPLE:
3938 if (load_tuple(self) < 0)
3939 break;
3940 continue;
3941
3942 case EMPTY_LIST:
3943 if (load_empty_list(self) < 0)
3944 break;
3945 continue;
3946
3947 case LIST:
3948 if (load_list(self) < 0)
3949 break;
3950 continue;
3951
3952 case EMPTY_DICT:
3953 if (load_empty_dict(self) < 0)
3954 break;
3955 continue;
3956
3957 case DICT:
3958 if (load_dict(self) < 0)
3959 break;
3960 continue;
3961
3962 case OBJ:
3963 if (noload_obj(self) < 0)
3964 break;
3965 continue;
3966
3967 case INST:
3968 if (noload_inst(self) < 0)
3969 break;
3970 continue;
3971
3972 case GLOBAL:
3973 if (noload_global(self) < 0)
3974 break;
3975 continue;
3976
3977 case APPEND:
3978 if (load_append(self) < 0)
3979 break;
3980 continue;
3981
3982 case APPENDS:
3983 if (load_appends(self) < 0)
3984 break;
3985 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003986
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003987 case BUILD:
3988 if (noload_build(self) < 0)
3989 break;
3990 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003991
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003992 case DUP:
3993 if (load_dup(self) < 0)
3994 break;
3995 continue;
3996
3997 case BINGET:
3998 if (load_binget(self) < 0)
3999 break;
4000 continue;
4001
4002 case LONG_BINGET:
4003 if (load_long_binget(self) < 0)
4004 break;
4005 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004006
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007 case GET:
4008 if (load_get(self) < 0)
4009 break;
4010 continue;
4011
4012 case MARK:
4013 if (load_mark(self) < 0)
4014 break;
4015 continue;
4016
4017 case BINPUT:
4018 if (load_binput(self) < 0)
4019 break;
4020 continue;
4021
4022 case LONG_BINPUT:
4023 if (load_long_binput(self) < 0)
4024 break;
4025 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004026
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004027 case PUT:
4028 if (load_put(self) < 0)
4029 break;
4030 continue;
4031
4032 case POP:
4033 if (load_pop(self) < 0)
4034 break;
4035 continue;
4036
4037 case POP_MARK:
4038 if (load_pop_mark(self) < 0)
4039 break;
4040 continue;
4041
4042 case SETITEM:
4043 if (load_setitem(self) < 0)
4044 break;
4045 continue;
4046
4047 case SETITEMS:
4048 if (load_setitems(self) < 0)
4049 break;
4050 continue;
4051
4052 case STOP:
4053 break;
4054
4055 case PERSID:
4056 if (load_persid(self) < 0)
4057 break;
4058 continue;
4059
4060 case BINPERSID:
4061 if (load_binpersid(self) < 0)
4062 break;
4063 continue;
4064
4065 case REDUCE:
4066 if (noload_reduce(self) < 0)
4067 break;
4068 continue;
4069
Tim Peters84e87f32001-03-17 04:50:51 +00004070 default:
4071 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004072 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004073 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004074 }
4075
4076 break;
4077 }
4078
Guido van Rossum053b8df1998-11-25 16:18:00 +00004079 if ((err = PyErr_Occurred())) {
4080 if (err == PyExc_EOFError) {
4081 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00004082 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00004083 return NULL;
4084 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004085
Tim Peters84e87f32001-03-17 04:50:51 +00004086 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004087 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004088}
Tim Peters84e87f32001-03-17 04:50:51 +00004089
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004090
Guido van Rossum60456fd1997-04-09 17:36:32 +00004091static PyObject *
4092Unpickler_load(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004093 UNLESS (PyArg_ParseTuple(args, ":load"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094 return NULL;
4095
4096 return load(self);
4097}
4098
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004099static PyObject *
4100Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004101 UNLESS (PyArg_ParseTuple(args, ":noload"))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004102 return NULL;
4103
4104 return noload(self);
4105}
4106
Guido van Rossum60456fd1997-04-09 17:36:32 +00004107
4108static struct PyMethodDef Unpickler_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004109 {"load", (PyCFunction)Unpickler_load, 1,
4110 "load() -- Load a pickle"
4111 },
4112 {"noload", (PyCFunction)Unpickler_noload, 1,
4113 "noload() -- not load a pickle, but go through most of the motions\n"
4114 "\n"
4115 "This function can be used to read past a pickle without instantiating\n"
4116 "any objects or importing any modules. It can also be used to find all\n"
4117 "persistent references without instantiating any objects or importing\n"
4118 "any modules.\n"
4119 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004120 {NULL, NULL} /* sentinel */
4121};
4122
4123
4124static Unpicklerobject *
4125newUnpicklerobject(PyObject *f) {
4126 Unpicklerobject *self;
4127
Guido van Rossumb18618d2000-05-03 23:44:39 +00004128 UNLESS (self = PyObject_New(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004129 return NULL;
4130
4131 self->file = NULL;
4132 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004133 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004134 self->pers_func = NULL;
4135 self->last_string = NULL;
4136 self->marks = NULL;
4137 self->num_marks = 0;
4138 self->marks_size = 0;
4139 self->buf_size = 0;
4140 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00004141 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00004142 self->safe_constructors = NULL;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004143 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004144
Tim Peters84e87f32001-03-17 04:50:51 +00004145 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00004146 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004147
4148 Py_INCREF(f);
4149 self->file = f;
4150
4151 /* Set read, readline based on type of f */
4152 if (PyFile_Check(f)) {
4153 self->fp = PyFile_AsFile(f);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004154 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00004155 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
4156 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004157 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158 self->read_func = read_file;
4159 self->readline_func = readline_file;
4160 }
4161 else if (PycStringIO_InputCheck(f)) {
4162 self->fp = NULL;
4163 self->read_func = read_cStringIO;
4164 self->readline_func = readline_cStringIO;
4165 }
4166 else {
4167
4168 self->fp = NULL;
4169 self->read_func = read_other;
4170 self->readline_func = readline_other;
4171
Guido van Rossum053b8df1998-11-25 16:18:00 +00004172 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004173 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004174 PyErr_Clear();
4175 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
4176 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00004177 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004178 }
4179 }
4180
Guido van Rossum053b8df1998-11-25 16:18:00 +00004181 if (PyEval_GetRestricted()) {
4182 /* Restricted execution, get private tables */
4183 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004184
Guido van Rossum053b8df1998-11-25 16:18:00 +00004185 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
4186 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
4187 Py_DECREF(m);
4188 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004189 }
4190 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004191 self->safe_constructors=safe_constructors;
4192 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004193 }
4194
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004196
4197err:
4198 Py_DECREF((PyObject *)self);
4199 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004200}
4201
4202
4203static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004204get_Unpickler(PyObject *self, PyObject *args) {
4205 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004206
Guido van Rossum43713e52000-02-29 13:59:29 +00004207 UNLESS (PyArg_ParseTuple(args, "O:Unpickler", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208 return NULL;
4209 return (PyObject *)newUnpicklerobject(file);
4210}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004211
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004212
Guido van Rossum60456fd1997-04-09 17:36:32 +00004213static void
4214Unpickler_dealloc(Unpicklerobject *self) {
4215 Py_XDECREF(self->readline);
4216 Py_XDECREF(self->read);
4217 Py_XDECREF(self->file);
4218 Py_XDECREF(self->memo);
4219 Py_XDECREF(self->stack);
4220 Py_XDECREF(self->pers_func);
4221 Py_XDECREF(self->arg);
4222 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004223 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004224
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225 if (self->marks) {
4226 free(self->marks);
4227 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004228
Guido van Rossum60456fd1997-04-09 17:36:32 +00004229 if (self->buf_size) {
4230 free(self->buf);
4231 }
Tim Peters84e87f32001-03-17 04:50:51 +00004232
Guido van Rossumb18618d2000-05-03 23:44:39 +00004233 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004234}
4235
4236
4237static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004238Unpickler_getattr(Unpicklerobject *self, char *name) {
4239 if (!strcmp(name, "persistent_load")) {
4240 if (!self->pers_func) {
4241 PyErr_SetString(PyExc_AttributeError, name);
4242 return NULL;
4243 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004244
Guido van Rossum60456fd1997-04-09 17:36:32 +00004245 Py_INCREF(self->pers_func);
4246 return self->pers_func;
4247 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004248
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004249 if (!strcmp(name, "find_global")) {
4250 if (!self->find_class) {
4251 PyErr_SetString(PyExc_AttributeError, name);
4252 return NULL;
4253 }
4254
4255 Py_INCREF(self->find_class);
4256 return self->find_class;
4257 }
4258
Guido van Rossum60456fd1997-04-09 17:36:32 +00004259 if (!strcmp(name, "memo")) {
4260 if (!self->memo) {
4261 PyErr_SetString(PyExc_AttributeError, name);
4262 return NULL;
4263 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004264
Guido van Rossum60456fd1997-04-09 17:36:32 +00004265 Py_INCREF(self->memo);
4266 return self->memo;
4267 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004268
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269 if (!strcmp(name, "UnpicklingError")) {
4270 Py_INCREF(UnpicklingError);
4271 return UnpicklingError;
4272 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004273
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
4275}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004276
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277
4278static int
4279Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004280
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004281 if (!strcmp(name, "persistent_load")) {
4282 Py_XDECREF(self->pers_func);
4283 self->pers_func = value;
4284 Py_XINCREF(value);
4285 return 0;
4286 }
4287
4288 if (!strcmp(name, "find_global")) {
4289 Py_XDECREF(self->find_class);
4290 self->find_class = value;
4291 Py_XINCREF(value);
4292 return 0;
4293 }
4294
Guido van Rossum053b8df1998-11-25 16:18:00 +00004295 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004296 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00004297 "attribute deletion is not supported");
4298 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004299 }
4300
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004301 if (strcmp(name, "memo") == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004302 if (! PyDict_Check(value)) {
4303 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4304 return -1;
4305 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004306 Py_XDECREF(self->memo);
4307 self->memo = value;
4308 Py_INCREF(value);
4309 return 0;
4310 }
4311
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312 PyErr_SetString(PyExc_AttributeError, name);
4313 return -1;
4314}
4315
4316
4317static PyObject *
4318cpm_dump(PyObject *self, PyObject *args) {
4319 PyObject *ob, *file, *res = NULL;
4320 Picklerobject *pickler = 0;
4321 int bin = 0;
4322
Guido van Rossum053b8df1998-11-25 16:18:00 +00004323 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004324 goto finally;
4325
Guido van Rossum053b8df1998-11-25 16:18:00 +00004326 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004327 goto finally;
4328
4329 if (dump(pickler, ob) < 0)
4330 goto finally;
4331
4332 Py_INCREF(Py_None);
4333 res = Py_None;
4334
4335finally:
4336 Py_XDECREF(pickler);
4337
4338 return res;
4339}
4340
4341
4342static PyObject *
4343cpm_dumps(PyObject *self, PyObject *args) {
4344 PyObject *ob, *file = 0, *res = NULL;
4345 Picklerobject *pickler = 0;
4346 int bin = 0;
4347
Guido van Rossum43713e52000-02-29 13:59:29 +00004348 UNLESS (PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004349 goto finally;
4350
Guido van Rossum053b8df1998-11-25 16:18:00 +00004351 UNLESS (file = PycStringIO->NewOutput(128))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004352 goto finally;
4353
Guido van Rossum053b8df1998-11-25 16:18:00 +00004354 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004355 goto finally;
4356
4357 if (dump(pickler, ob) < 0)
4358 goto finally;
4359
4360 res = PycStringIO->cgetvalue(file);
4361
4362finally:
4363 Py_XDECREF(pickler);
4364 Py_XDECREF(file);
4365
4366 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004367}
4368
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004369
4370static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004371cpm_load(PyObject *self, PyObject *args) {
4372 Unpicklerobject *unpickler = 0;
4373 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004374
Guido van Rossum43713e52000-02-29 13:59:29 +00004375 UNLESS (PyArg_ParseTuple(args, "O:load", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004377
Guido van Rossum053b8df1998-11-25 16:18:00 +00004378 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004380
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004382
Guido van Rossum60456fd1997-04-09 17:36:32 +00004383finally:
4384 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004385
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004387}
4388
4389
4390static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391cpm_loads(PyObject *self, PyObject *args) {
4392 PyObject *ob, *file = 0, *res = NULL;
4393 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004394
Guido van Rossum43713e52000-02-29 13:59:29 +00004395 UNLESS (PyArg_ParseTuple(args, "S:loads", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004396 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004397
Guido van Rossum053b8df1998-11-25 16:18:00 +00004398 UNLESS (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004400
Guido van Rossum053b8df1998-11-25 16:18:00 +00004401 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004403
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004405
Guido van Rossum60456fd1997-04-09 17:36:32 +00004406finally:
4407 Py_XDECREF(file);
4408 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004409
Guido van Rossum60456fd1997-04-09 17:36:32 +00004410 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004411}
4412
4413
Tim Peters84e87f32001-03-17 04:50:51 +00004414static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004415"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004416
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004417static PyTypeObject Unpicklertype = {
4418 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004419 0, /*ob_size*/
4420 "Unpickler", /*tp_name*/
4421 sizeof(Unpicklerobject), /*tp_basicsize*/
4422 0, /*tp_itemsize*/
4423 /* methods */
4424 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4425 (printfunc)0, /*tp_print*/
4426 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4427 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4428 (cmpfunc)0, /*tp_compare*/
4429 (reprfunc)0, /*tp_repr*/
4430 0, /*tp_as_number*/
4431 0, /*tp_as_sequence*/
4432 0, /*tp_as_mapping*/
4433 (hashfunc)0, /*tp_hash*/
4434 (ternaryfunc)0, /*tp_call*/
4435 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004436
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437 /* Space for future expansion */
4438 0L,0L,0L,0L,
4439 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004440};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004441
Guido van Rossum60456fd1997-04-09 17:36:32 +00004442static struct PyMethodDef cPickle_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004443 {"dump", (PyCFunction)cpm_dump, 1,
4444 "dump(object, file, [binary]) --"
4445 "Write an object in pickle format to the given file\n"
4446 "\n"
4447 "If the optional argument, binary, is provided and is true, then the\n"
4448 "pickle will be written in binary format, which is more space and\n"
4449 "computationally efficient. \n"
4450 },
4451 {"dumps", (PyCFunction)cpm_dumps, 1,
4452 "dumps(object, [binary]) --"
4453 "Return a string containing an object in pickle format\n"
4454 "\n"
4455 "If the optional argument, binary, is provided and is true, then the\n"
4456 "pickle will be written in binary format, which is more space and\n"
4457 "computationally efficient. \n"
4458 },
4459 {"load", (PyCFunction)cpm_load, 1,
4460 "load(file) -- Load a pickle from the given file"},
4461 {"loads", (PyCFunction)cpm_loads, 1,
4462 "loads(string) -- Load a pickle from the given string"},
4463 {"Pickler", (PyCFunction)get_Pickler, 1,
4464 "Pickler(file, [binary]) -- Create a pickler\n"
4465 "\n"
4466 "If the optional argument, binary, is provided and is true, then\n"
4467 "pickles will be written in binary format, which is more space and\n"
4468 "computationally efficient. \n"
4469 },
4470 {"Unpickler", (PyCFunction)get_Unpickler, 1,
4471 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004472 { NULL, NULL }
4473};
4474
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475static int
Guido van Rossumebba4202000-09-07 14:35:37 +00004476init_stuff(PyObject *module_dict) {
Fred Drake2c7a6852001-07-17 18:34:03 +00004477 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478
4479#define INIT_STR(S) UNLESS(S ## _str=PyString_FromString(#S)) return -1;
4480
4481 INIT_STR(__class__);
4482 INIT_STR(__getinitargs__);
4483 INIT_STR(__dict__);
4484 INIT_STR(__getstate__);
4485 INIT_STR(__setstate__);
4486 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004487 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488 INIT_STR(__reduce__);
4489 INIT_STR(write);
4490 INIT_STR(__safe_for_unpickling__);
4491 INIT_STR(append);
4492 INIT_STR(read);
4493 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004494 INIT_STR(copy_reg);
4495 INIT_STR(dispatch_table);
4496 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004497 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Guido van Rossum053b8df1998-11-25 16:18:00 +00004499 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500 return -1;
4501
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004502 /* These next few are special because we want to use different
4503 ones in restricted mode. */
4504
Guido van Rossum053b8df1998-11-25 16:18:00 +00004505 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506 return -1;
4507
Guido van Rossum053b8df1998-11-25 16:18:00 +00004508 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
4509 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510 return -1;
4511
4512 Py_DECREF(copy_reg);
4513
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004514 /* Down to here ********************************** */
4515
Guido van Rossum053b8df1998-11-25 16:18:00 +00004516 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517 return -1;
4518
Guido van Rossumc03158b1999-06-09 15:23:31 +00004519 /* Ugh */
4520 UNLESS (t=PyImport_ImportModule("__builtin__")) return -1;
4521 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4522 return -1;
4523
4524 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004525 UNLESS (r=PyRun_String(
4526 "def __init__(self, *args): self.args=args\n\n"
4527 "def __str__(self):\n"
4528 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4529 Py_file_input,
4530 module_dict, t) ) return -1;
4531 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004532
4533 UNLESS (PickleError = PyErr_NewException("cPickle.PickleError", NULL, t))
4534 return -1;
4535
4536 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004537
Tim Peters84e87f32001-03-17 04:50:51 +00004538
4539 UNLESS (PicklingError = PyErr_NewException("cPickle.PicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004540 PickleError, NULL))
4541 return -1;
4542
4543 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004544 UNLESS (r=PyRun_String(
4545 "def __init__(self, *args): self.args=args\n\n"
4546 "def __str__(self):\n"
4547 " a=self.args\n"
4548 " a=a and type(a[0]) or '(what)'\n"
4549 " return 'Cannot pickle %s objects' % a\n"
4550 , Py_file_input,
4551 module_dict, t) ) return -1;
4552 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004553
4554 UNLESS (UnpickleableError = PyErr_NewException(
4555 "cPickle.UnpickleableError", PicklingError, t))
4556 return -1;
4557
4558 Py_DECREF(t);
4559
Tim Peters84e87f32001-03-17 04:50:51 +00004560 UNLESS (UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004561 PickleError, NULL))
4562 return -1;
4563
Tim Peters84e87f32001-03-17 04:50:51 +00004564 if (PyDict_SetItemString(module_dict, "PickleError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004565 PickleError) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566 return -1;
4567
Tim Peters84e87f32001-03-17 04:50:51 +00004568 if (PyDict_SetItemString(module_dict, "PicklingError",
Guido van Rossum60456fd1997-04-09 17:36:32 +00004569 PicklingError) < 0)
4570 return -1;
4571
Guido van Rossum60456fd1997-04-09 17:36:32 +00004572 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4573 UnpicklingError) < 0)
4574 return -1;
4575
Guido van Rossumc03158b1999-06-09 15:23:31 +00004576 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4577 UnpickleableError) < 0)
4578 return -1;
4579
Guido van Rossum053b8df1998-11-25 16:18:00 +00004580 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4581 return -1;
4582
4583 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4584 BadPickleGet) < 0)
4585 return -1;
4586
Guido van Rossum60456fd1997-04-09 17:36:32 +00004587 PycString_IMPORT;
Tim Peters84e87f32001-03-17 04:50:51 +00004588
Guido van Rossum60456fd1997-04-09 17:36:32 +00004589 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004590}
4591
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004592#ifndef DL_EXPORT /* declarations for DLL import/export */
4593#define DL_EXPORT(RTYPE) RTYPE
4594#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004595DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +00004596initcPickle(void) {
Guido van Rossumebba4202000-09-07 14:35:37 +00004597 PyObject *m, *d, *di, *v, *k;
4598 int i;
Guido van Rossum2f80d961999-07-13 15:18:58 +00004599 char *rev="1.71";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004600 PyObject *format_version;
4601 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004602
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004603 Picklertype.ob_type = &PyType_Type;
4604 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004605 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Tim Peters84e87f32001-03-17 04:50:51 +00004607 /* Initialize some pieces. We need to do this before module creation,
4608 so we're forced to use a temporary dictionary. :(
Guido van Rossumebba4202000-09-07 14:35:37 +00004609 */
4610 di=PyDict_New();
4611 if (!di) return;
4612 if (init_stuff(di) < 0) return;
4613
Guido van Rossum60456fd1997-04-09 17:36:32 +00004614 /* Create the module and add the functions */
4615 m = Py_InitModule4("cPickle", cPickle_methods,
4616 cPickle_module_documentation,
4617 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004618
Guido van Rossum60456fd1997-04-09 17:36:32 +00004619 /* Add some symbolic constants to the module */
4620 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004621 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004622 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004623
Guido van Rossumebba4202000-09-07 14:35:37 +00004624 /* Copy data from di. Waaa. */
4625 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4626 if (PyObject_SetItem(d, k, v) < 0) {
4627 Py_DECREF(di);
4628 return;
4629 }
4630 }
4631 Py_DECREF(di);
4632
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633 format_version = PyString_FromString("1.3");
4634 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004635
Guido van Rossum60456fd1997-04-09 17:36:32 +00004636 PyDict_SetItemString(d, "format_version", format_version);
4637 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004638 Py_XDECREF(format_version);
4639 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004640}