blob: adf7e4449f0241417ae859cfa7707a44f1358448 [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"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +000057#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000058
Guido van Rossum142eeb81997-08-13 03:14:41 +000059#ifndef Py_eval_input
60#include <graminit.h>
61#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000062#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000063
Guido van Rossum2f4caa41997-01-06 22:59:08 +000064#include <errno.h>
65
Guido van Rossum2f4caa41997-01-06 22:59:08 +000066#define UNLESS(E) if (!(E))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000067
Guido van Rossum60456fd1997-04-09 17:36:32 +000068#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000069
Guido van Rossum60456fd1997-04-09 17:36:32 +000070#define WRITE_BUF_SIZE 256
71
Tim Peters3906eb82001-04-10 04:22:00 +000072/* --------------------------------------------------------------------------
73NOTES on format codes.
74XXX much more is needed here
75
76Integer types
Tim Petersd8ae7c22001-04-10 04:35:28 +000077BININT1 8-bit unsigned integer; followed by 1 byte.
Tim Peters3906eb82001-04-10 04:22:00 +000078BININT2 16-bit unsigned integer; followed by 2 bytes, little-endian.
Tim Petersd8ae7c22001-04-10 04:35:28 +000079BININT 32-bit signed integer; followed by 4 bytes, little-endian.
80INT Integer; natural decimal string conversion, then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000081 CAUTION: INT-reading code can't assume that what follows
82 fits in a Python int, because the size of Python ints varies
83 across platforms.
Tim Petersd8ae7c22001-04-10 04:35:28 +000084LONG Long (unbounded) integer; repr(i), then newline.
Tim Peters3906eb82001-04-10 04:22:00 +000085-------------------------------------------------------------------------- */
Guido van Rossum60456fd1997-04-09 17:36:32 +000086
87#define MARK '('
88#define STOP '.'
89#define POP '0'
90#define POP_MARK '1'
91#define DUP '2'
92#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000093#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000094#define INT 'I'
95#define BININT 'J'
96#define BININT1 'K'
97#define LONG 'L'
98#define BININT2 'M'
99#define NONE 'N'
100#define PERSID 'P'
101#define BINPERSID 'Q'
102#define REDUCE 'R'
103#define STRING 'S'
104#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000105#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +0000106#define UNICODE 'V'
107#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +0000108#define APPEND 'a'
109#define BUILD 'b'
110#define GLOBAL 'c'
111#define DICT 'd'
112#define EMPTY_DICT '}'
113#define APPENDS 'e'
114#define GET 'g'
115#define BINGET 'h'
116#define INST 'i'
117#define LONG_BINGET 'j'
118#define LIST 'l'
119#define EMPTY_LIST ']'
120#define OBJ 'o'
121#define PUT 'p'
122#define BINPUT 'q'
123#define LONG_BINPUT 'r'
124#define SETITEM 's'
125#define TUPLE 't'
126#define EMPTY_TUPLE ')'
127#define SETITEMS 'u'
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum60456fd1997-04-09 17:36:32 +0000129static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000130
Guido van Rossumc03158b1999-06-09 15:23:31 +0000131static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000132static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000133static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000134static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000135static PyObject *BadPickleGet;
136
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000137
Guido van Rossum60456fd1997-04-09 17:36:32 +0000138static PyObject *dispatch_table;
139static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000140static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000141
Guido van Rossum60456fd1997-04-09 17:36:32 +0000142static PyObject *__class___str, *__getinitargs___str, *__dict___str,
143 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
144 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000145 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000146 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000147
Guido van Rossum053b8df1998-11-25 16:18:00 +0000148/*************************************************************************
149 Internal Data type for pickle data. */
150
151typedef struct {
152 PyObject_HEAD
153 int length, size;
154 PyObject **data;
155} Pdata;
156
Tim Peters84e87f32001-03-17 04:50:51 +0000157static void
Guido van Rossum053b8df1998-11-25 16:18:00 +0000158Pdata_dealloc(Pdata *self) {
159 int i;
160 PyObject **p;
161
162 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
163
164 if (self->data) free(self->data);
165
Guido van Rossumb18618d2000-05-03 23:44:39 +0000166 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167}
168
169static PyTypeObject PdataType = {
Guido van Rossum14648392001-12-08 18:02:58 +0000170 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171 (destructor)Pdata_dealloc,
172 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
173};
174
175#define Pdata_Check(O) ((O)->ob_type == &PdataType)
176
177static PyObject *
Thomas Wouters58d05102000-07-24 14:43:35 +0000178Pdata_New(void) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000179 Pdata *self;
180
Guido van Rossumb18618d2000-05-03 23:44:39 +0000181 UNLESS (self = PyObject_New(Pdata, &PdataType)) return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182 self->size=8;
183 self->length=0;
184 self->data=malloc(self->size * sizeof(PyObject*));
185 if (self->data) return (PyObject*)self;
186 Py_DECREF(self);
187 return PyErr_NoMemory();
188}
189
Tim Peters84e87f32001-03-17 04:50:51 +0000190static int
Thomas Wouters58d05102000-07-24 14:43:35 +0000191stackUnderflow(void) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
193 return -1;
194}
195
196static int
197Pdata_clear(Pdata *self, int clearto) {
198 int i;
199 PyObject **p;
200
201 if (clearto < 0) return stackUnderflow();
202 if (clearto >= self->length) return 0;
203
204 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
205 Py_DECREF(*p);
206 self->length=clearto;
207
208 return 0;
209}
210
211
Tim Peters84e87f32001-03-17 04:50:51 +0000212static int
Guido van Rossum053b8df1998-11-25 16:18:00 +0000213Pdata_grow(Pdata *self) {
214 if (! self->size) {
215 PyErr_NoMemory();
216 return -1;
217 }
Tim Peters84e87f32001-03-17 04:50:51 +0000218 self->size *= 2;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000219 self->data = realloc(self->data, self->size*sizeof(PyObject*));
220 if (! self->data) {
Tim Peters84e87f32001-03-17 04:50:51 +0000221 self->size = 0;
222 PyErr_NoMemory();
223 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000224 }
225 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000226}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000227
228#define PDATA_POP(D,V) { \
229 if ((D)->length) V=D->data[--((D)->length)]; \
230 else { \
231 PyErr_SetString(UnpicklingError, "bad pickle data"); \
232 V=NULL; \
233 } \
234}
235
236
237static PyObject *
238Pdata_popTuple(Pdata *self, int start) {
239 PyObject *r;
240 int i, j, l;
241
242 l=self->length-start;
243 UNLESS (r=PyTuple_New(l)) return NULL;
Guido van Rossumea2b7152000-05-09 18:14:50 +0000244 for (i=start, j=0 ; j < l; i++, j++)
245 PyTuple_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000246
247 self->length=start;
248 return r;
249}
250
251static PyObject *
252Pdata_popList(Pdata *self, int start) {
253 PyObject *r;
254 int i, j, l;
255
256 l=self->length-start;
257 UNLESS (r=PyList_New(l)) return NULL;
Guido van Rossumea2b7152000-05-09 18:14:50 +0000258 for (i=start, j=0 ; j < l; i++, j++)
259 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000260
261 self->length=start;
262 return r;
263}
264
265#define PDATA_APPEND_(D,O,ER) { \
266 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
267}
268
269#define PDATA_APPEND(D,O,ER) { \
270 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
271 Pdata_grow((Pdata*)(D)) < 0) \
272 return ER; \
273 Py_INCREF(O); \
274 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
275}
276
277#define PDATA_PUSH(D,O,ER) { \
278 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
279 Pdata_grow((Pdata*)(D)) < 0) { \
280 Py_DECREF(O); \
281 return ER; \
282 } \
283 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
284}
285
286/*************************************************************************/
287
288#define ARG_TUP(self, o) { \
289 if (self->arg || (self->arg=PyTuple_New(1))) { \
290 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
291 PyTuple_SET_ITEM(self->arg,0,o); \
292 } \
293 else { \
294 Py_DECREF(o); \
295 } \
296}
297
298#define FREE_ARG_TUP(self) { \
299 if (self->arg->ob_refcnt > 1) { \
300 Py_DECREF(self->arg); \
301 self->arg=NULL; \
302 } \
303 }
304
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000305typedef struct Picklerobject {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000306 PyObject_HEAD
307 FILE *fp;
308 PyObject *write;
309 PyObject *file;
310 PyObject *memo;
311 PyObject *arg;
312 PyObject *pers_func;
313 PyObject *inst_pers_func;
314 int bin;
315 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
316 int (*write_func)(struct Picklerobject *, char *, int);
317 char *write_buf;
318 int buf_size;
319 PyObject *dispatch_table;
320 int fast_container; /* count nested container dumps */
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000321 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000322} Picklerobject;
323
Barry Warsaw52acb492001-12-21 20:04:22 +0000324#ifndef PY_CPICKLE_FAST_LIMIT
325#define PY_CPICKLE_FAST_LIMIT 50
326#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000327
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000328staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000329
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000330typedef struct Unpicklerobject {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000331 PyObject_HEAD
332 FILE *fp;
333 PyObject *file;
334 PyObject *readline;
335 PyObject *read;
336 PyObject *memo;
337 PyObject *arg;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000338 Pdata *stack;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000339 PyObject *mark;
340 PyObject *pers_func;
341 PyObject *last_string;
342 int *marks;
343 int num_marks;
344 int marks_size;
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000345 int (*read_func)(struct Unpicklerobject *, char **, int);
346 int (*readline_func)(struct Unpicklerobject *, char **);
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000347 int buf_size;
348 char *buf;
349 PyObject *safe_constructors;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +0000350 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000351} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000352
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000353staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000354
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000355/* Forward decls that need the above structs */
356static int save(Picklerobject *, PyObject *, int);
357static int put2(Picklerobject *, PyObject *);
358
Tim Peters84e87f32001-03-17 04:50:51 +0000359int
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000360cPickle_PyMapping_HasKey(PyObject *o, PyObject *key) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000361 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000362
Guido van Rossum053b8df1998-11-25 16:18:00 +0000363 if ((v = PyObject_GetItem(o,key))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000364 Py_DECREF(v);
365 return 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000366 }
367
Guido van Rossum60456fd1997-04-09 17:36:32 +0000368 PyErr_Clear();
369 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000370}
371
Guido van Rossumd385d591997-04-09 17:47:47 +0000372static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000373PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000374cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
375{
Guido van Rossum60456fd1997-04-09 17:36:32 +0000376 va_list va;
377 PyObject *args=0, *retval=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000378 va_start(va, format);
Tim Peters84e87f32001-03-17 04:50:51 +0000379
Guido van Rossum053b8df1998-11-25 16:18:00 +0000380 if (format) args = Py_VaBuildValue(format, va);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000381 va_end(va);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000382 if (format && ! args) return NULL;
383 if (stringformat && !(retval=PyString_FromString(stringformat))) return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384
Guido van Rossum053b8df1998-11-25 16:18:00 +0000385 if (retval) {
386 if (args) {
387 PyObject *v;
388 v=PyString_Format(retval, args);
389 Py_DECREF(retval);
390 Py_DECREF(args);
391 if (! v) return NULL;
392 retval=v;
393 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000394 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000395 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000396 if (args) retval=args;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000397 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000398 PyErr_SetObject(ErrType,Py_None);
399 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000400 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000401 PyErr_SetObject(ErrType,retval);
402 Py_DECREF(retval);
403 return NULL;
404}
405
Tim Peters84e87f32001-03-17 04:50:51 +0000406static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000407write_file(Picklerobject *self, char *s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000408 size_t nbyteswritten;
409
Guido van Rossum60456fd1997-04-09 17:36:32 +0000410 if (s == NULL) {
411 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000412 }
413
Tim Peters84e87f32001-03-17 04:50:51 +0000414 Py_BEGIN_ALLOW_THREADS
415 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
416 Py_END_ALLOW_THREADS
417 if (nbyteswritten != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418 PyErr_SetFromErrno(PyExc_IOError);
419 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000420 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000421
422 return n;
423}
424
Tim Peters84e87f32001-03-17 04:50:51 +0000425static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000426write_cStringIO(Picklerobject *self, char *s, int n) {
427 if (s == NULL) {
428 return 0;
429 }
430
431 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
432 return -1;
433 }
434
435 return n;
436}
437
Tim Peters84e87f32001-03-17 04:50:51 +0000438static int
Guido van Rossum142eeb81997-08-13 03:14:41 +0000439write_none(Picklerobject *self, char *s, int n) {
440 if (s == NULL) return 0;
441 return n;
442}
443
Tim Peters84e87f32001-03-17 04:50:51 +0000444static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000445write_other(Picklerobject *self, char *s, int n) {
446 PyObject *py_str = 0, *junk = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000447
448 if (s == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000449 UNLESS (self->buf_size) return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000450 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000451 PyString_FromStringAndSize(self->write_buf, self->buf_size))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000452 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000453 }
454 else {
455 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
456 if (write_other(self, NULL, 0) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000457 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000458 }
459
Tim Peters84e87f32001-03-17 04:50:51 +0000460 if (n > WRITE_BUF_SIZE) {
461 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000462 PyString_FromStringAndSize(s, n))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000463 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464 }
465 else {
466 memcpy(self->write_buf + self->buf_size, s, n);
467 self->buf_size += n;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000468 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000469 }
470 }
471
Guido van Rossum053b8df1998-11-25 16:18:00 +0000472 if (self->write) {
473 /* object with write method */
474 ARG_TUP(self, py_str);
475 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000476 junk = PyObject_Call(self->write, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000477 FREE_ARG_TUP(self);
478 }
479 if (junk) Py_DECREF(junk);
480 else return -1;
481 }
Tim Peters84e87f32001-03-17 04:50:51 +0000482 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000483 PDATA_PUSH(self->file, py_str, -1);
Tim Peters84e87f32001-03-17 04:50:51 +0000484
485 self->buf_size = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000486 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000487}
488
489
Tim Peters84e87f32001-03-17 04:50:51 +0000490static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491read_file(Unpicklerobject *self, char **s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000492 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000493
494 if (self->buf_size == 0) {
495 int size;
496
Tim Peters84e87f32001-03-17 04:50:51 +0000497 size = ((n < 32) ? 32 : n);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000498 UNLESS (self->buf = (char *)malloc(size * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000499 PyErr_NoMemory();
500 return -1;
501 }
502
503 self->buf_size = size;
504 }
505 else if (n > self->buf_size) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000506 UNLESS (self->buf = (char *)realloc(self->buf, n * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507 PyErr_NoMemory();
508 return -1;
509 }
Tim Peters84e87f32001-03-17 04:50:51 +0000510
Guido van Rossum60456fd1997-04-09 17:36:32 +0000511 self->buf_size = n;
512 }
Tim Peters84e87f32001-03-17 04:50:51 +0000513
514 Py_BEGIN_ALLOW_THREADS
515 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
516 Py_END_ALLOW_THREADS
517 if (nbytesread != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000518 if (feof(self->fp)) {
519 PyErr_SetNone(PyExc_EOFError);
520 return -1;
521 }
522
523 PyErr_SetFromErrno(PyExc_IOError);
524 return -1;
525 }
526
527 *s = self->buf;
528
529 return n;
530}
531
532
Tim Peters84e87f32001-03-17 04:50:51 +0000533static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000534readline_file(Unpicklerobject *self, char **s) {
535 int i;
536
537 if (self->buf_size == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000538 UNLESS (self->buf = (char *)malloc(40 * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000539 PyErr_NoMemory();
540 return -1;
541 }
Tim Peters84e87f32001-03-17 04:50:51 +0000542
Guido van Rossum60456fd1997-04-09 17:36:32 +0000543 self->buf_size = 40;
544 }
545
546 i = 0;
547 while (1) {
548 for (; i < (self->buf_size - 1); i++) {
549 if (feof(self->fp) || (self->buf[i] = getc(self->fp)) == '\n') {
550 self->buf[i + 1] = '\0';
551 *s = self->buf;
552 return i + 1;
553 }
554 }
555
Tim Peters84e87f32001-03-17 04:50:51 +0000556 UNLESS (self->buf = (char *)realloc(self->buf,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557 (self->buf_size * 2) * sizeof(char))) {
558 PyErr_NoMemory();
559 return -1;
560 }
561
562 self->buf_size *= 2;
563 }
564
Tim Peters84e87f32001-03-17 04:50:51 +0000565}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000566
567
Tim Peters84e87f32001-03-17 04:50:51 +0000568static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569read_cStringIO(Unpicklerobject *self, char **s, int n) {
570 char *ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000571
Guido van Rossum60456fd1997-04-09 17:36:32 +0000572 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
573 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000574 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000575 }
576
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577 *s = ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000578
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579 return n;
580}
581
582
Tim Peters84e87f32001-03-17 04:50:51 +0000583static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000584readline_cStringIO(Unpicklerobject *self, char **s) {
585 int n;
586 char *ptr;
587
588 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
589 return -1;
590 }
591
592 *s = ptr;
593
594 return n;
595}
596
597
Tim Peters84e87f32001-03-17 04:50:51 +0000598static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000599read_other(Unpicklerobject *self, char **s, int n) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000600 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601
Guido van Rossum053b8df1998-11-25 16:18:00 +0000602 UNLESS (bytes = PyInt_FromLong(n)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000603
Guido van Rossum053b8df1998-11-25 16:18:00 +0000604 ARG_TUP(self, bytes);
605 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000606 str = PyObject_Call(self->read, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000607 FREE_ARG_TUP(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000609 if (! str) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
611 Py_XDECREF(self->last_string);
612 self->last_string = str;
613
Guido van Rossum053b8df1998-11-25 16:18:00 +0000614 if (! (*s = PyString_AsString(str))) return -1;
615 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000616}
617
618
Tim Peters84e87f32001-03-17 04:50:51 +0000619static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000620readline_other(Unpicklerobject *self, char **s) {
621 PyObject *str;
622 int str_size;
623
Guido van Rossum053b8df1998-11-25 16:18:00 +0000624 UNLESS (str = PyObject_CallObject(self->readline, empty_tuple)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000625 return -1;
626 }
627
Guido van Rossum053b8df1998-11-25 16:18:00 +0000628 if ((str_size = PyString_Size(str)) < 0)
629 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000630
631 Py_XDECREF(self->last_string);
632 self->last_string = str;
633
Guido van Rossum053b8df1998-11-25 16:18:00 +0000634 if (! (*s = PyString_AsString(str)))
635 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000636
637 return str_size;
638}
639
640
641static char *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000642pystrndup(char *s, int l) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643 char *r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000644 UNLESS (r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory();
Guido van Rossum60456fd1997-04-09 17:36:32 +0000645 memcpy(r,s,l);
646 r[l]=0;
647 return r;
648}
649
650
651static int
652get(Picklerobject *self, PyObject *id) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000653 PyObject *value, *mv;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654 long c_value;
655 char s[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000656 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657
Guido van Rossum053b8df1998-11-25 16:18:00 +0000658 UNLESS (mv = PyDict_GetItem(self->memo, id)) {
659 PyErr_SetObject(PyExc_KeyError, id);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000660 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000661 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662
Guido van Rossum053b8df1998-11-25 16:18:00 +0000663 UNLESS (value = PyTuple_GetItem(mv, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000665
Guido van Rossum053b8df1998-11-25 16:18:00 +0000666 UNLESS (PyInt_Check(value)) {
667 PyErr_SetString(PicklingError, "no int where int expected in memo");
668 return -1;
669 }
670 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
672 if (!self->bin) {
673 s[0] = GET;
Jeremy Hylton179c48c2001-11-28 21:49:51 +0000674 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675 len = strlen(s);
676 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000677 else if (Pdata_Check(self->file)) {
678 if (write_other(self, NULL, 0) < 0) return -1;
679 PDATA_APPEND(self->file, mv, -1);
680 return 0;
681 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682 else {
683 if (c_value < 256) {
684 s[0] = BINGET;
685 s[1] = (int)(c_value & 0xff);
686 len = 2;
687 }
688 else {
689 s[0] = LONG_BINGET;
690 s[1] = (int)(c_value & 0xff);
691 s[2] = (int)((c_value >> 8) & 0xff);
692 s[3] = (int)((c_value >> 16) & 0xff);
693 s[4] = (int)((c_value >> 24) & 0xff);
694 len = 5;
695 }
696 }
697
698 if ((*self->write_func)(self, s, len) < 0)
699 return -1;
700
701 return 0;
702}
Tim Peters84e87f32001-03-17 04:50:51 +0000703
Guido van Rossum60456fd1997-04-09 17:36:32 +0000704
705static int
706put(Picklerobject *self, PyObject *ob) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000707 if (ob->ob_refcnt < 2 || self->fast)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000708 return 0;
709
710 return put2(self, ob);
711}
712
Tim Peters84e87f32001-03-17 04:50:51 +0000713
Guido van Rossum60456fd1997-04-09 17:36:32 +0000714static int
715put2(Picklerobject *self, PyObject *ob) {
716 char c_str[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000717 int p;
718 size_t len;
719 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000721
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000722 if (self->fast)
723 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000724
Guido van Rossum60456fd1997-04-09 17:36:32 +0000725 if ((p = PyDict_Size(self->memo)) < 0)
726 goto finally;
727
Guido van Rossum053b8df1998-11-25 16:18:00 +0000728 p++; /* Make sure memo keys are positive! */
729
Guido van Rossum534b7c52000-06-28 22:23:56 +0000730 UNLESS (py_ob_id = PyLong_FromVoidPtr(ob))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000731 goto finally;
732
733 UNLESS (memo_len = PyInt_FromLong(p))
734 goto finally;
735
736 UNLESS (t = PyTuple_New(2))
737 goto finally;
738
739 PyTuple_SET_ITEM(t, 0, memo_len);
740 Py_INCREF(memo_len);
741 PyTuple_SET_ITEM(t, 1, ob);
742 Py_INCREF(ob);
743
744 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
745 goto finally;
746
Guido van Rossum60456fd1997-04-09 17:36:32 +0000747 if (!self->bin) {
748 c_str[0] = PUT;
Jeremy Hylton179c48c2001-11-28 21:49:51 +0000749 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000750 len = strlen(c_str);
751 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000752 else if (Pdata_Check(self->file)) {
753 if (write_other(self, NULL, 0) < 0) return -1;
754 PDATA_APPEND(self->file, memo_len, -1);
755 res=0; /* Job well done ;) */
756 goto finally;
757 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000758 else {
759 if (p >= 256) {
760 c_str[0] = LONG_BINPUT;
761 c_str[1] = (int)(p & 0xff);
762 c_str[2] = (int)((p >> 8) & 0xff);
763 c_str[3] = (int)((p >> 16) & 0xff);
764 c_str[4] = (int)((p >> 24) & 0xff);
765 len = 5;
766 }
767 else {
768 c_str[0] = BINPUT;
769 c_str[1] = p;
Tim Peters84e87f32001-03-17 04:50:51 +0000770 len = 2;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000771 }
772 }
773
774 if ((*self->write_func)(self, c_str, len) < 0)
775 goto finally;
776
Guido van Rossum60456fd1997-04-09 17:36:32 +0000777 res = 0;
778
779finally:
780 Py_XDECREF(py_ob_id);
781 Py_XDECREF(memo_len);
782 Py_XDECREF(t);
783
784 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000785}
786
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000787#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000788
789static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000790PyImport_Import(PyObject *module_name) {
791 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
792 static PyObject *standard_builtins=0;
793 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
794
Guido van Rossum053b8df1998-11-25 16:18:00 +0000795 UNLESS (silly_list) {
796 UNLESS (__import___str=PyString_FromString("__import__"))
797 return NULL;
798 UNLESS (__builtins___str=PyString_FromString("__builtins__"))
799 return NULL;
800 UNLESS (silly_list=Py_BuildValue("[s]","__doc__"))
801 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000802 }
803
Guido van Rossum053b8df1998-11-25 16:18:00 +0000804 if ((globals=PyEval_GetGlobals())) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000805 Py_INCREF(globals);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000806 UNLESS (__builtins__=PyObject_GetItem(globals,__builtins___str))
807 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000808 }
809 else {
810 PyErr_Clear();
811
Guido van Rossum053b8df1998-11-25 16:18:00 +0000812 UNLESS (standard_builtins ||
813 (standard_builtins=PyImport_ImportModule("__builtin__")))
814 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000815
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000816 __builtins__=standard_builtins;
817 Py_INCREF(__builtins__);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000818 UNLESS (globals = Py_BuildValue("{sO}", "__builtins__", __builtins__))
819 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000820 }
821
Guido van Rossum053b8df1998-11-25 16:18:00 +0000822 if (PyDict_Check(__builtins__)) {
823 UNLESS (__import__=PyObject_GetItem(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000824 }
825 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000826 UNLESS (__import__=PyObject_GetAttr(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000827 }
828
Guido van Rossum053b8df1998-11-25 16:18:00 +0000829 UNLESS (r=PyObject_CallFunction(__import__,"OOOO",
830 module_name, globals, globals, silly_list))
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000831 goto err;
832
833 Py_DECREF(globals);
834 Py_DECREF(__builtins__);
835 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000836
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000837 return r;
838err:
839 Py_XDECREF(globals);
840 Py_XDECREF(__builtins__);
841 Py_XDECREF(__import__);
842 return NULL;
843}
844
845static PyObject *
Guido van Rossume2d81cd1998-08-08 19:40:10 +0000846whichmodule(PyObject *global, PyObject *global_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000847 int i, j;
848 PyObject *module = 0, *modules_dict = 0,
849 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000850
Guido van Rossum45188231997-09-28 05:38:51 +0000851 module = PyObject_GetAttrString(global, "__module__");
852 if (module) return module;
853 PyErr_Clear();
854
Guido van Rossum053b8df1998-11-25 16:18:00 +0000855 UNLESS (modules_dict = PySys_GetObject("modules"))
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856 return NULL;
857
Guido van Rossum60456fd1997-04-09 17:36:32 +0000858 i = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000859 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
860
Guido van Rossum053b8df1998-11-25 16:18:00 +0000861 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000862
Guido van Rossum053b8df1998-11-25 16:18:00 +0000863 UNLESS (global_name_attr = PyObject_GetAttr(module, global_name)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000864 PyErr_Clear();
865 continue;
866 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000867
Guido van Rossum60456fd1997-04-09 17:36:32 +0000868 if (global_name_attr != global) {
869 Py_DECREF(global_name_attr);
870 continue;
871 }
872
873 Py_DECREF(global_name_attr);
874
875 break;
876 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000877
878 /* The following implements the rule in pickle.py added in 1.5
879 that used __main__ if no module is found. I don't actually
880 like this rule. jlf
881 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000882 if (!j) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000883 j=1;
884 name=__main___str;
885 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000886
887 Py_INCREF(name);
888 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000889}
890
891
Guido van Rossum60456fd1997-04-09 17:36:32 +0000892static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000893fast_save_enter(Picklerobject *self, PyObject *obj)
894{
895 /* if fast_container < 0, we're doing an error exit. */
Barry Warsaw52acb492001-12-21 20:04:22 +0000896 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000897 PyObject *key = NULL;
898 if (self->fast_memo == NULL) {
899 self->fast_memo = PyDict_New();
900 if (self->fast_memo == NULL) {
901 self->fast_container = -1;
902 return 0;
903 }
904 }
905 key = PyLong_FromVoidPtr(obj);
906 if (key == NULL)
907 return 0;
908 if (PyDict_GetItem(self->fast_memo, key)) {
909 PyErr_Format(PyExc_ValueError,
910 "fast mode: can't pickle cyclic objects including object type %s at %p",
911 obj->ob_type->tp_name, obj);
912 self->fast_container = -1;
913 return 0;
914 }
915 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
916 self->fast_container = -1;
917 return 0;
918 }
919 }
920 return 1;
921}
922
923int
924fast_save_leave(Picklerobject *self, PyObject *obj)
925{
Barry Warsaw52acb492001-12-21 20:04:22 +0000926 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000927 PyObject *key = PyLong_FromVoidPtr(obj);
928 if (key == NULL)
929 return 0;
930 if (PyDict_DelItem(self->fast_memo, key) < 0) {
931 return 0;
932 }
933 }
934 return 1;
935}
936
937static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000938save_none(Picklerobject *self, PyObject *args) {
939 static char none = NONE;
Tim Peters84e87f32001-03-17 04:50:51 +0000940 if ((*self->write_func)(self, &none, 1) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000941 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000942
Guido van Rossum60456fd1997-04-09 17:36:32 +0000943 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000944}
945
Tim Peters84e87f32001-03-17 04:50:51 +0000946
Guido van Rossum60456fd1997-04-09 17:36:32 +0000947static int
948save_int(Picklerobject *self, PyObject *args) {
949 char c_str[32];
950 long l = PyInt_AS_LONG((PyIntObject *)args);
951 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000952
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000953 if (!self->bin
954#if SIZEOF_LONG > 4
Tim Peters3906eb82001-04-10 04:22:00 +0000955 || l > 0x7fffffffL
956 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000957#endif
Tim Peters3906eb82001-04-10 04:22:00 +0000958 ) {
959 /* Text-mode pickle, or long too big to fit in the 4-byte
960 * signed BININT format: store as a string.
961 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000962 c_str[0] = INT;
Jeremy Hylton179c48c2001-11-28 21:49:51 +0000963 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000964 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
965 return -1;
966 }
967 else {
Tim Petersd8ae7c22001-04-10 04:35:28 +0000968 /* Binary pickle and l fits in a signed 4-byte int. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000969 c_str[1] = (int)( l & 0xff);
970 c_str[2] = (int)((l >> 8) & 0xff);
971 c_str[3] = (int)((l >> 16) & 0xff);
972 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000973
Guido van Rossum60456fd1997-04-09 17:36:32 +0000974 if ((c_str[4] == 0) && (c_str[3] == 0)) {
975 if (c_str[2] == 0) {
976 c_str[0] = BININT1;
977 len = 2;
978 }
979 else {
980 c_str[0] = BININT2;
981 len = 3;
982 }
983 }
984 else {
985 c_str[0] = BININT;
986 len = 5;
987 }
988
989 if ((*self->write_func)(self, c_str, len) < 0)
990 return -1;
991 }
992
993 return 0;
994}
995
996
997static int
998save_long(Picklerobject *self, PyObject *args) {
999 int size, res = -1;
1000 PyObject *repr = 0;
1001
1002 static char l = LONG;
1003
Guido van Rossum053b8df1998-11-25 16:18:00 +00001004 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001005 goto finally;
1006
1007 if ((size = PyString_Size(repr)) < 0)
1008 goto finally;
1009
1010 if ((*self->write_func)(self, &l, 1) < 0)
1011 goto finally;
1012
Tim Peters84e87f32001-03-17 04:50:51 +00001013 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001014 PyString_AS_STRING((PyStringObject *)repr), size) < 0)
1015 goto finally;
1016
1017 if ((*self->write_func)(self, "\n", 1) < 0)
1018 goto finally;
1019
1020 res = 0;
1021
1022finally:
1023 Py_XDECREF(repr);
1024
1025 return res;
1026}
1027
1028
1029static int
1030save_float(Picklerobject *self, PyObject *args) {
1031 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
1032
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033 if (self->bin) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001034 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035 double f;
1036 long fhi, flo;
Fred Drake2c7a6852001-07-17 18:34:03 +00001037 char str[9];
1038 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
1040 *p = BINFLOAT;
1041 p++;
1042
1043 if (x < 0) {
1044 s = 1;
1045 x = -x;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001046 }
1047 else
Guido van Rossum60456fd1997-04-09 17:36:32 +00001048 s = 0;
1049
1050 f = frexp(x, &e);
1051
1052 /* Normalize f to be in the range [1.0, 2.0) */
1053 if (0.5 <= f && f < 1.0) {
1054 f *= 2.0;
1055 e--;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001056 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057 else if (f == 0.0) {
1058 e = 0;
1059 }
1060 else {
1061 PyErr_SetString(PyExc_SystemError,
1062 "frexp() result out of range");
1063 return -1;
1064 }
1065
1066 if (e >= 1024) {
1067 /* XXX 1024 itself is reserved for Inf/NaN */
1068 PyErr_SetString(PyExc_OverflowError,
1069 "float too large to pack with d format");
1070 return -1;
1071 }
1072 else if (e < -1022) {
1073 /* Gradual underflow */
1074 f = ldexp(f, 1022 + e);
1075 e = 0;
1076 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001077 else if (!(e == 0 && f == 0.0)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078 e += 1023;
1079 f -= 1.0; /* Get rid of leading 1 */
1080 }
1081
1082 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
1083 f *= 268435456.0; /* 2**28 */
1084 fhi = (long) floor(f); /* Truncate */
1085 f -= (double)fhi;
1086 f *= 16777216.0; /* 2**24 */
1087 flo = (long) floor(f + 0.5); /* Round */
1088
1089 /* First byte */
1090 *p = (s<<7) | (e>>4);
1091 p++;
1092
1093 /* Second byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001094 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
Guido van Rossum60456fd1997-04-09 17:36:32 +00001095 p++;
1096
1097 /* Third byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001098 *p = (unsigned char) ((fhi>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001099 p++;
1100
1101 /* Fourth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001102 *p = (unsigned char) ((fhi>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001103 p++;
1104
1105 /* Fifth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001106 *p = (unsigned char) (fhi & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001107 p++;
1108
1109 /* Sixth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001110 *p = (unsigned char) ((flo>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111 p++;
1112
1113 /* Seventh byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001114 *p = (unsigned char) ((flo>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001115 p++;
1116
1117 /* Eighth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001118 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
1120 if ((*self->write_func)(self, str, 9) < 0)
1121 return -1;
1122 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001123 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124 char c_str[250];
1125 c_str[0] = FLOAT;
Jeremy Hylton179c48c2001-11-28 21:49:51 +00001126 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
1128 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1129 return -1;
1130 }
1131
1132 return 0;
1133}
1134
1135
1136static int
Guido van Rossum142eeb81997-08-13 03:14:41 +00001137save_string(Picklerobject *self, PyObject *args, int doput) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138 int size, len;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001139 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140
Guido van Rossum053b8df1998-11-25 16:18:00 +00001141 if ((size = PyString_Size(args)) < 0)
1142 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
1144 if (!self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001145 char *repr_str;
1146
1147 static char string = STRING;
1148
Guido van Rossum053b8df1998-11-25 16:18:00 +00001149 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150 return -1;
1151
Guido van Rossum053b8df1998-11-25 16:18:00 +00001152 if ((len = PyString_Size(repr)) < 0)
1153 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155
1156 if ((*self->write_func)(self, &string, 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001157 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001158
1159 if ((*self->write_func)(self, repr_str, len) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001160 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
1162 if ((*self->write_func)(self, "\n", 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001163 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
1165 Py_XDECREF(repr);
1166 }
1167 else {
1168 int i;
1169 char c_str[5];
1170
Guido van Rossum053b8df1998-11-25 16:18:00 +00001171 if ((size = PyString_Size(args)) < 0)
1172 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
1174 if (size < 256) {
1175 c_str[0] = SHORT_BINSTRING;
1176 c_str[1] = size;
1177 len = 2;
1178 }
1179 else {
1180 c_str[0] = BINSTRING;
1181 for (i = 1; i < 5; i++)
1182 c_str[i] = (int)(size >> ((i - 1) * 8));
1183 len = 5;
1184 }
1185
1186 if ((*self->write_func)(self, c_str, len) < 0)
1187 return -1;
1188
Guido van Rossum053b8df1998-11-25 16:18:00 +00001189 if (size > 128 && Pdata_Check(self->file)) {
1190 if (write_other(self, NULL, 0) < 0) return -1;
1191 PDATA_APPEND(self->file, args, -1);
1192 }
1193 else {
Tim Peters84e87f32001-03-17 04:50:51 +00001194 if ((*self->write_func)(self,
Guido van Rossum053b8df1998-11-25 16:18:00 +00001195 PyString_AS_STRING((PyStringObject *)args), size) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001197 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198 }
1199
Guido van Rossum142eeb81997-08-13 03:14:41 +00001200 if (doput)
1201 if (put(self, args) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001202 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001203
1204 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001205
1206err:
1207 Py_XDECREF(repr);
1208 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001209}
1210
1211
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001212#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001213/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1214 backslash and newline characters to \uXXXX escapes. */
1215static PyObject *
1216modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1217{
1218 PyObject *repr;
1219 char *p;
1220 char *q;
1221
1222 static const char *hexdigit = "0123456789ABCDEF";
1223
1224 repr = PyString_FromStringAndSize(NULL, 6 * size);
1225 if (repr == NULL)
1226 return NULL;
1227 if (size == 0)
1228 return repr;
1229
1230 p = q = PyString_AS_STRING(repr);
1231 while (size-- > 0) {
1232 Py_UNICODE ch = *s++;
1233 /* Map 16-bit characters to '\uxxxx' */
1234 if (ch >= 256 || ch == '\\' || ch == '\n') {
1235 *p++ = '\\';
1236 *p++ = 'u';
1237 *p++ = hexdigit[(ch >> 12) & 0xf];
1238 *p++ = hexdigit[(ch >> 8) & 0xf];
1239 *p++ = hexdigit[(ch >> 4) & 0xf];
1240 *p++ = hexdigit[ch & 15];
1241 }
1242 /* Copy everything else as-is */
1243 else
1244 *p++ = (char) ch;
1245 }
1246 *p = '\0';
1247 if (_PyString_Resize(&repr, p - q))
1248 goto onError;
1249
1250 return repr;
1251
1252 onError:
1253 Py_DECREF(repr);
1254 return NULL;
1255}
1256
1257
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001259save_unicode(Picklerobject *self, PyObject *args, int doput) {
1260 int size, len;
1261 PyObject *repr=0;
1262
1263 if (!PyUnicode_Check(args))
1264 return -1;
1265
1266 if (!self->bin) {
1267 char *repr_str;
1268 static char string = UNICODE;
1269
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001270 UNLESS(repr = modified_EncodeRawUnicodeEscape(
1271 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)))
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001272 return -1;
1273
1274 if ((len = PyString_Size(repr)) < 0)
1275 goto err;
1276 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1277
1278 if ((*self->write_func)(self, &string, 1) < 0)
1279 goto err;
1280
1281 if ((*self->write_func)(self, repr_str, len) < 0)
1282 goto err;
1283
1284 if ((*self->write_func)(self, "\n", 1) < 0)
1285 goto err;
1286
1287 Py_XDECREF(repr);
1288 }
1289 else {
1290 int i;
1291 char c_str[5];
1292
1293 UNLESS (repr = PyUnicode_AsUTF8String(args))
1294 return -1;
1295
1296 if ((size = PyString_Size(repr)) < 0)
1297 goto err;
1298
1299 c_str[0] = BINUNICODE;
1300 for (i = 1; i < 5; i++)
1301 c_str[i] = (int)(size >> ((i - 1) * 8));
1302 len = 5;
1303
1304 if ((*self->write_func)(self, c_str, len) < 0)
1305 goto err;
1306
1307 if (size > 128 && Pdata_Check(self->file)) {
1308 if (write_other(self, NULL, 0) < 0)
1309 goto err;
1310 PDATA_APPEND(self->file, repr, -1);
1311 }
1312 else {
1313 if ((*self->write_func)(self, PyString_AS_STRING(repr), size) < 0)
1314 goto err;
1315 }
1316
1317 Py_DECREF(repr);
1318 }
1319
1320 if (doput)
1321 if (put(self, args) < 0)
1322 return -1;
1323
1324 return 0;
1325
1326err:
1327 Py_XDECREF(repr);
1328 return -1;
1329}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001330#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001331
1332
1333static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001334save_tuple(Picklerobject *self, PyObject *args) {
1335 PyObject *element = 0, *py_tuple_id = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001336 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001337
1338 static char tuple = TUPLE;
1339
1340 if ((*self->write_func)(self, &MARKv, 1) < 0)
1341 goto finally;
1342
Tim Peters84e87f32001-03-17 04:50:51 +00001343 if ((len = PyTuple_Size(args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001344 goto finally;
1345
1346 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001347 UNLESS (element = PyTuple_GET_ITEM((PyTupleObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001349
Guido van Rossum60456fd1997-04-09 17:36:32 +00001350 if (save(self, element, 0) < 0)
1351 goto finally;
1352 }
1353
Guido van Rossum534b7c52000-06-28 22:23:56 +00001354 UNLESS (py_tuple_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001355 goto finally;
1356
1357 if (len) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001358 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001359 if (self->bin) {
1360 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001361
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1363 goto finally;
1364 }
1365 else {
1366 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001367
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368 for (i = 0; i <= len; i++) {
1369 if ((*self->write_func)(self, &pop, 1) < 0)
1370 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001371 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001372 }
Tim Peters84e87f32001-03-17 04:50:51 +00001373
Guido van Rossum60456fd1997-04-09 17:36:32 +00001374 if (get(self, py_tuple_id) < 0)
1375 goto finally;
1376
1377 res = 0;
1378 goto finally;
1379 }
1380 }
1381
1382 if ((*self->write_func)(self, &tuple, 1) < 0) {
1383 goto finally;
1384 }
1385
1386 if (put(self, args) < 0)
1387 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001388
Guido van Rossum60456fd1997-04-09 17:36:32 +00001389 res = 0;
1390
1391finally:
1392 Py_XDECREF(py_tuple_id);
1393
1394 return res;
1395}
1396
1397static int
1398save_empty_tuple(Picklerobject *self, PyObject *args) {
1399 static char tuple = EMPTY_TUPLE;
1400
1401 return (*self->write_func)(self, &tuple, 1);
1402}
1403
1404
1405static int
1406save_list(Picklerobject *self, PyObject *args) {
1407 PyObject *element = 0;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001408 int s_len, len, i, using_appends, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001409 char s[3];
1410
1411 static char append = APPEND, appends = APPENDS;
1412
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001413 if (self->fast && !fast_save_enter(self, args))
1414 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001415
Guido van Rossum053b8df1998-11-25 16:18:00 +00001416 if (self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001417 s[0] = EMPTY_LIST;
1418 s_len = 1;
Tim Peters84e87f32001-03-17 04:50:51 +00001419 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001420 else {
1421 s[0] = MARK;
1422 s[1] = LIST;
1423 s_len = 2;
1424 }
1425
1426 if ((len = PyList_Size(args)) < 0)
1427 goto finally;
1428
1429 if ((*self->write_func)(self, s, s_len) < 0)
1430 goto finally;
1431
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001432 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001433 if (put(self, args) < 0)
1434 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001435 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001436 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001437 if (put2(self, args) < 0)
1438 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001439 }
1440
Guido van Rossum142eeb81997-08-13 03:14:41 +00001441 if ((using_appends = (self->bin && (len > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442 if ((*self->write_func)(self, &MARKv, 1) < 0)
1443 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001444
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001446 UNLESS (element = PyList_GET_ITEM((PyListObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001447 goto finally;
1448
Tim Peters84e87f32001-03-17 04:50:51 +00001449 if (save(self, element, 0) < 0)
1450 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001451
1452 if (!using_appends) {
1453 if ((*self->write_func)(self, &append, 1) < 0)
1454 goto finally;
1455 }
1456 }
1457
1458 if (using_appends) {
1459 if ((*self->write_func)(self, &appends, 1) < 0)
1460 goto finally;
1461 }
1462
1463 res = 0;
1464
1465finally:
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001466 if (self->fast && !fast_save_leave(self, args))
1467 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
1469 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001470}
1471
1472
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473static int
1474save_dict(Picklerobject *self, PyObject *args) {
1475 PyObject *key = 0, *value = 0;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001476 int i, len, res = -1, using_setitems;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001478
Guido van Rossum60456fd1997-04-09 17:36:32 +00001479 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001480
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001481 if (self->fast && !fast_save_enter(self, args))
1482 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001483
Guido van Rossum60456fd1997-04-09 17:36:32 +00001484 if (self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001485 s[0] = EMPTY_DICT;
1486 len = 1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001487 }
1488 else {
1489 s[0] = MARK;
1490 s[1] = DICT;
1491 len = 2;
1492 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001493
Guido van Rossum60456fd1997-04-09 17:36:32 +00001494 if ((*self->write_func)(self, s, len) < 0)
1495 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001496
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497 if ((len = PyDict_Size(args)) < 0)
1498 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001499
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001500 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001501 if (put(self, args) < 0)
1502 goto finally;
1503 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001504 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001505 if (put2(self, args) < 0)
1506 goto finally;
1507 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001508
Guido van Rossum142eeb81997-08-13 03:14:41 +00001509 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001510 if ((*self->write_func)(self, &MARKv, 1) < 0)
1511 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001512
Guido van Rossum60456fd1997-04-09 17:36:32 +00001513 i = 0;
1514 while (PyDict_Next(args, &i, &key, &value)) {
1515 if (save(self, key, 0) < 0)
1516 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001517
Guido van Rossum60456fd1997-04-09 17:36:32 +00001518 if (save(self, value, 0) < 0)
1519 goto finally;
1520
1521 if (!using_setitems) {
1522 if ((*self->write_func)(self, &setitem, 1) < 0)
1523 goto finally;
1524 }
1525 }
1526
1527 if (using_setitems) {
1528 if ((*self->write_func)(self, &setitems, 1) < 0)
1529 goto finally;
1530 }
1531
1532 res = 0;
1533
1534finally:
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001535 if (self->fast && !fast_save_leave(self, args))
1536 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001537
1538 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001539}
1540
1541
Tim Peters84e87f32001-03-17 04:50:51 +00001542static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543save_inst(Picklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00001544 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001545 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1546 char *module_str, *name_str;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001547 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001548
Guido van Rossum60456fd1997-04-09 17:36:32 +00001549 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001550
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001551 if (self->fast && !fast_save_enter(self, args))
1552 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001553
Guido van Rossum60456fd1997-04-09 17:36:32 +00001554 if ((*self->write_func)(self, &MARKv, 1) < 0)
1555 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001556
Guido van Rossum053b8df1998-11-25 16:18:00 +00001557 UNLESS (class = PyObject_GetAttr(args, __class___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001558 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001559
Guido van Rossum60456fd1997-04-09 17:36:32 +00001560 if (self->bin) {
1561 if (save(self, class, 0) < 0)
1562 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001563 }
1564
Guido van Rossum142eeb81997-08-13 03:14:41 +00001565 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001566 PyObject *element = 0;
1567 int i, len;
1568
Tim Peters84e87f32001-03-17 04:50:51 +00001569 UNLESS (class_args =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001570 PyObject_Call(getinitargs_func, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001571 goto finally;
1572
Tim Peters84e87f32001-03-17 04:50:51 +00001573 if ((len = PyObject_Size(class_args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001574 goto finally;
1575
1576 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001577 UNLESS (element = PySequence_GetItem(class_args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001578 goto finally;
1579
1580 if (save(self, element, 0) < 0) {
1581 Py_DECREF(element);
1582 goto finally;
1583 }
1584
1585 Py_DECREF(element);
1586 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001587 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588 else {
1589 PyErr_Clear();
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001590 }
1591
Guido van Rossum60456fd1997-04-09 17:36:32 +00001592 if (!self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001593 UNLESS (name = ((PyClassObject *)class)->cl_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594 PyErr_SetString(PicklingError, "class has no name");
1595 goto finally;
1596 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001597
Guido van Rossum053b8df1998-11-25 16:18:00 +00001598 UNLESS (module = whichmodule(class, name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001599 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001600
Tim Peters84e87f32001-03-17 04:50:51 +00001601
Guido van Rossum053b8df1998-11-25 16:18:00 +00001602 if ((module_size = PyString_Size(module)) < 0 ||
1603 (name_size = PyString_Size(name)) < 0)
1604 goto finally;
1605
Guido van Rossum60456fd1997-04-09 17:36:32 +00001606 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001607 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001608
Guido van Rossum60456fd1997-04-09 17:36:32 +00001609 if ((*self->write_func)(self, &inst, 1) < 0)
1610 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001611
Guido van Rossum60456fd1997-04-09 17:36:32 +00001612 if ((*self->write_func)(self, module_str, module_size) < 0)
1613 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001614
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615 if ((*self->write_func)(self, "\n", 1) < 0)
1616 goto finally;
1617
1618 if ((*self->write_func)(self, name_str, name_size) < 0)
1619 goto finally;
1620
1621 if ((*self->write_func)(self, "\n", 1) < 0)
1622 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001623 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001624 else if ((*self->write_func)(self, &obj, 1) < 0) {
1625 goto finally;
1626 }
1627
Guido van Rossum142eeb81997-08-13 03:14:41 +00001628 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001629 UNLESS (state = PyObject_Call(getstate_func, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001630 goto finally;
1631 }
1632 else {
1633 PyErr_Clear();
1634
Guido van Rossum053b8df1998-11-25 16:18:00 +00001635 UNLESS (state = PyObject_GetAttr(args, __dict___str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636 PyErr_Clear();
1637 res = 0;
1638 goto finally;
1639 }
1640 }
1641
1642 if (!PyDict_Check(state)) {
1643 if (put2(self, args) < 0)
1644 goto finally;
1645 }
1646 else {
1647 if (put(self, args) < 0)
1648 goto finally;
1649 }
Tim Peters84e87f32001-03-17 04:50:51 +00001650
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651 if (save(self, state, 0) < 0)
1652 goto finally;
1653
1654 if ((*self->write_func)(self, &build, 1) < 0)
1655 goto finally;
1656
1657 res = 0;
1658
1659finally:
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001660 if (self->fast && !fast_save_leave(self, args))
1661 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001662
Guido van Rossum60456fd1997-04-09 17:36:32 +00001663 Py_XDECREF(module);
1664 Py_XDECREF(class);
1665 Py_XDECREF(state);
1666 Py_XDECREF(getinitargs_func);
1667 Py_XDECREF(getstate_func);
1668 Py_XDECREF(class_args);
1669
1670 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001671}
1672
1673
Guido van Rossum60456fd1997-04-09 17:36:32 +00001674static int
1675save_global(Picklerobject *self, PyObject *args, PyObject *name) {
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001676 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00001677 char *name_str, *module_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001679
Guido van Rossum60456fd1997-04-09 17:36:32 +00001680 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001681
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001682 if (name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683 global_name = name;
1684 Py_INCREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001685 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001686 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001687 UNLESS (global_name = PyObject_GetAttr(args, __name___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001688 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001689 }
1690
Guido van Rossum053b8df1998-11-25 16:18:00 +00001691 UNLESS (module = whichmodule(args, global_name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001692 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001693
Guido van Rossum053b8df1998-11-25 16:18:00 +00001694 if ((module_size = PyString_Size(module)) < 0 ||
1695 (name_size = PyString_Size(global_name)) < 0)
1696 goto finally;
1697
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001698 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001699 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001700
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001701 mod = PyImport_ImportModule(module_str);
1702 if (mod == NULL) {
1703 /* Py_ErrClear(); ?? */
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001704 cPickle_ErrFormat(PicklingError,
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001705 "Can't pickle %s: it's not found as %s.%s",
1706 "OSS", args, module, global_name);
1707 goto finally;
1708 }
1709 moddict = PyModule_GetDict(mod); /* borrowed ref */
1710 klass = PyDict_GetItemString(moddict, name_str); /* borrowed ref */
1711 if (klass == NULL) {
1712 cPickle_ErrFormat(PicklingError,
1713 "Can't pickle %s: it's not found as %s.%s",
1714 "OSS", args, module, global_name);
1715 goto finally;
1716 }
1717 if (klass != args) {
1718 cPickle_ErrFormat(PicklingError,
1719 "Can't pickle %s: it's not the same object as %s.%s",
1720 "OSS", args, module, global_name);
1721 goto finally;
1722 }
1723
Guido van Rossum60456fd1997-04-09 17:36:32 +00001724 if ((*self->write_func)(self, &global, 1) < 0)
1725 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001726
Guido van Rossum60456fd1997-04-09 17:36:32 +00001727 if ((*self->write_func)(self, module_str, module_size) < 0)
1728 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001729
Guido van Rossum60456fd1997-04-09 17:36:32 +00001730 if ((*self->write_func)(self, "\n", 1) < 0)
1731 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001732
Guido van Rossum60456fd1997-04-09 17:36:32 +00001733 if ((*self->write_func)(self, name_str, name_size) < 0)
1734 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001735
Guido van Rossum60456fd1997-04-09 17:36:32 +00001736 if ((*self->write_func)(self, "\n", 1) < 0)
1737 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001738
Guido van Rossum60456fd1997-04-09 17:36:32 +00001739 if (put(self, args) < 0)
1740 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001741
Guido van Rossum60456fd1997-04-09 17:36:32 +00001742 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001743
Guido van Rossum60456fd1997-04-09 17:36:32 +00001744finally:
1745 Py_XDECREF(module);
1746 Py_XDECREF(global_name);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001747 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748
Guido van Rossum60456fd1997-04-09 17:36:32 +00001749 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001750}
1751
Guido van Rossum60456fd1997-04-09 17:36:32 +00001752static int
1753save_pers(Picklerobject *self, PyObject *args, PyObject *f) {
1754 PyObject *pid = 0;
1755 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Guido van Rossum60456fd1997-04-09 17:36:32 +00001757 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Guido van Rossum053b8df1998-11-25 16:18:00 +00001759 Py_INCREF(args);
1760 ARG_TUP(self, args);
1761 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001762 pid = PyObject_Call(f, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001763 FREE_ARG_TUP(self);
1764 }
1765 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001766
Guido van Rossum60456fd1997-04-09 17:36:32 +00001767 if (pid != Py_None) {
1768 if (!self->bin) {
1769 if (!PyString_Check(pid)) {
Tim Peters84e87f32001-03-17 04:50:51 +00001770 PyErr_SetString(PicklingError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001771 "persistent id must be string");
1772 goto finally;
1773 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Guido van Rossum60456fd1997-04-09 17:36:32 +00001775 if ((*self->write_func)(self, &persid, 1) < 0)
1776 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Guido van Rossum60456fd1997-04-09 17:36:32 +00001778 if ((size = PyString_Size(pid)) < 0)
1779 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Tim Peters84e87f32001-03-17 04:50:51 +00001781 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001782 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1783 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001784
Guido van Rossum60456fd1997-04-09 17:36:32 +00001785 if ((*self->write_func)(self, "\n", 1) < 0)
1786 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001787
Guido van Rossum60456fd1997-04-09 17:36:32 +00001788 res = 1;
1789 goto finally;
1790 }
1791 else if (save(self, pid, 1) >= 0) {
1792 if ((*self->write_func)(self, &binpersid, 1) < 0)
1793 res = -1;
1794 else
1795 res = 1;
1796 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001797
Tim Peters84e87f32001-03-17 04:50:51 +00001798 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799 }
1800
Guido van Rossum60456fd1997-04-09 17:36:32 +00001801 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802
Guido van Rossum60456fd1997-04-09 17:36:32 +00001803finally:
1804 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Guido van Rossum60456fd1997-04-09 17:36:32 +00001806 return res;
1807}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001808
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001809
Tim Peters84e87f32001-03-17 04:50:51 +00001810static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001811save_reduce(Picklerobject *self, PyObject *callable,
1812 PyObject *tup, PyObject *state, PyObject *ob) {
1813 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Guido van Rossum60456fd1997-04-09 17:36:32 +00001815 if (save(self, callable, 0) < 0)
1816 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817
Guido van Rossum60456fd1997-04-09 17:36:32 +00001818 if (save(self, tup, 0) < 0)
1819 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Guido van Rossum60456fd1997-04-09 17:36:32 +00001821 if ((*self->write_func)(self, &reduce, 1) < 0)
1822 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001824 if (ob != NULL) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001825 if (state && !PyDict_Check(state)) {
1826 if (put2(self, ob) < 0)
1827 return -1;
1828 }
1829 else {
1830 if (put(self, ob) < 0)
1831 return -1;
1832 }
1833 }
Tim Peters84e87f32001-03-17 04:50:51 +00001834
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001835 if (state) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001836 if (save(self, state, 0) < 0)
1837 return -1;
1838
1839 if ((*self->write_func)(self, &build, 1) < 0)
1840 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001841 }
1842
Guido van Rossum60456fd1997-04-09 17:36:32 +00001843 return 0;
1844}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Guido van Rossum60456fd1997-04-09 17:36:32 +00001846static int
1847save(Picklerobject *self, PyObject *args, int pers_save) {
1848 PyTypeObject *type;
1849 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
Guido van Rossum142eeb81997-08-13 03:14:41 +00001850 *callable = 0, *state = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001851 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001852
Guido van Rossum60456fd1997-04-09 17:36:32 +00001853 if (!pers_save && self->pers_func) {
1854 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1855 res = tmp;
1856 goto finally;
1857 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001858 }
1859
Guido van Rossum60456fd1997-04-09 17:36:32 +00001860 if (args == Py_None) {
1861 res = save_none(self, args);
1862 goto finally;
1863 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Guido van Rossum60456fd1997-04-09 17:36:32 +00001867 switch (type->tp_name[0]) {
1868 case 'i':
1869 if (type == &PyInt_Type) {
1870 res = save_int(self, args);
1871 goto finally;
1872 }
1873 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001874
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875 case 'l':
1876 if (type == &PyLong_Type) {
1877 res = save_long(self, args);
1878 goto finally;
1879 }
1880 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Guido van Rossum60456fd1997-04-09 17:36:32 +00001882 case 'f':
1883 if (type == &PyFloat_Type) {
1884 res = save_float(self, args);
1885 goto finally;
1886 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001887 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001888
Guido van Rossum60456fd1997-04-09 17:36:32 +00001889 case 't':
1890 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001891 if (self->bin) res = save_empty_tuple(self, args);
1892 else res = save_tuple(self, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001893 goto finally;
1894 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001895 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Guido van Rossum60456fd1997-04-09 17:36:32 +00001897 case 's':
Guido van Rossum053b8df1998-11-25 16:18:00 +00001898 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001899 res = save_string(self, args, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001900 goto finally;
1901 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001902
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001903#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001904 case 'u':
1905 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1906 res = save_unicode(self, args, 0);
1907 goto finally;
1908 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001909#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00001910 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Guido van Rossum60456fd1997-04-09 17:36:32 +00001912 if (args->ob_refcnt > 1) {
Guido van Rossum534b7c52000-06-28 22:23:56 +00001913 UNLESS (py_ob_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001914 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001915
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001916 if (PyDict_GetItem(self->memo, py_ob_id)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001917 if (get(self, py_ob_id) < 0)
1918 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Guido van Rossum60456fd1997-04-09 17:36:32 +00001920 res = 0;
1921 goto finally;
1922 }
1923 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001924
Guido van Rossum60456fd1997-04-09 17:36:32 +00001925 switch (type->tp_name[0]) {
1926 case 's':
1927 if (type == &PyString_Type) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001928 res = save_string(self, args, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001929 goto finally;
1930 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001931 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001933#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001934 case 'u':
1935 if (type == &PyUnicode_Type) {
1936 res = save_unicode(self, args, 1);
1937 goto finally;
1938 }
1939 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001940#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001941
Guido van Rossum60456fd1997-04-09 17:36:32 +00001942 case 't':
1943 if (type == &PyTuple_Type) {
1944 res = save_tuple(self, args);
1945 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001946 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001947 if (type == &PyType_Type) {
1948 res = save_global(self, args, NULL);
1949 goto finally;
1950 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001951 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Guido van Rossum60456fd1997-04-09 17:36:32 +00001953 case 'l':
1954 if (type == &PyList_Type) {
1955 res = save_list(self, args);
1956 goto finally;
1957 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001958 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001959
1960 case 'd':
1961 if (type == &PyDict_Type) {
1962 res = save_dict(self, args);
Tim Peters84e87f32001-03-17 04:50:51 +00001963 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001965 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001966
1967 case 'i':
1968 if (type == &PyInstance_Type) {
1969 res = save_inst(self, args);
1970 goto finally;
1971 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001972 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001973
1974 case 'c':
1975 if (type == &PyClass_Type) {
1976 res = save_global(self, args, NULL);
1977 goto finally;
1978 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001979 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001980
1981 case 'f':
1982 if (type == &PyFunction_Type) {
1983 res = save_global(self, args, NULL);
1984 goto finally;
1985 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001986 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001987
1988 case 'b':
1989 if (type == &PyCFunction_Type) {
1990 res = save_global(self, args, NULL);
1991 goto finally;
1992 }
1993 }
1994
Guido van Rossum950dce62001-12-19 16:56:54 +00001995 if (PyType_IsSubtype(type, &PyType_Type)) {
1996 res = save_global(self, args, NULL);
1997 goto finally;
1998 }
1999
Guido van Rossum60456fd1997-04-09 17:36:32 +00002000 if (!pers_save && self->inst_pers_func) {
2001 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2002 res = tmp;
2003 goto finally;
2004 }
2005 }
2006
Guido van Rossum142eeb81997-08-13 03:14:41 +00002007 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002008 Py_INCREF(__reduce__);
2009
Guido van Rossum60456fd1997-04-09 17:36:32 +00002010 Py_INCREF(args);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002011 ARG_TUP(self, args);
2012 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002013 t = PyObject_Call(__reduce__, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002014 FREE_ARG_TUP(self);
2015 }
2016 if (! t) goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002018 else {
2019 PyErr_Clear();
2020
Guido van Rossum142eeb81997-08-13 03:14:41 +00002021 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002022 UNLESS (t = PyObject_Call(__reduce__, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002023 goto finally;
2024 }
2025 else {
2026 PyErr_Clear();
2027 }
2028 }
2029
2030 if (t) {
2031 if (PyString_Check(t)) {
2032 res = save_global(self, args, t);
2033 goto finally;
2034 }
Tim Peters84e87f32001-03-17 04:50:51 +00002035
Guido van Rossum60456fd1997-04-09 17:36:32 +00002036 if (!PyTuple_Check(t)) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00002037 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038 "be a tuple", "O", __reduce__);
2039 goto finally;
2040 }
2041
2042 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002043
Guido van Rossum60456fd1997-04-09 17:36:32 +00002044 if ((size != 3) && (size != 2)) {
Tim Peters84e87f32001-03-17 04:50:51 +00002045 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002046 "contain only two or three elements", "O", __reduce__);
2047 goto finally;
2048 }
Tim Peters84e87f32001-03-17 04:50:51 +00002049
Guido van Rossum60456fd1997-04-09 17:36:32 +00002050 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002051
Guido van Rossum60456fd1997-04-09 17:36:32 +00002052 arg_tup = PyTuple_GET_ITEM(t, 1);
2053
2054 if (size > 2) {
2055 state = PyTuple_GET_ITEM(t, 2);
2056 }
2057
Guido van Rossum053b8df1998-11-25 16:18:00 +00002058 UNLESS (PyTuple_Check(arg_tup) || arg_tup==Py_None) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00002059 cPickle_ErrFormat(PicklingError, "Second element of tuple "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002060 "returned by %s must be a tuple", "O", __reduce__);
2061 goto finally;
2062 }
2063
2064 res = save_reduce(self, callable, arg_tup, state, args);
2065 goto finally;
2066 }
2067
Guido van Rossumc03158b1999-06-09 15:23:31 +00002068 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002069
2070finally:
2071 Py_XDECREF(py_ob_id);
2072 Py_XDECREF(__reduce__);
2073 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002074
Guido van Rossum60456fd1997-04-09 17:36:32 +00002075 return res;
2076}
2077
2078
2079static int
2080dump(Picklerobject *self, PyObject *args) {
2081 static char stop = STOP;
2082
2083 if (save(self, args, 0) < 0)
2084 return -1;
2085
2086 if ((*self->write_func)(self, &stop, 1) < 0)
2087 return -1;
2088
2089 if ((*self->write_func)(self, NULL, 0) < 0)
2090 return -1;
2091
2092 return 0;
2093}
2094
2095static PyObject *
Guido van Rossum053b8df1998-11-25 16:18:00 +00002096Pickle_clear_memo(Picklerobject *self, PyObject *args) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002097 if (!PyArg_ParseTuple(args,":clear_memo"))
2098 return NULL;
2099 if (self->memo)
2100 PyDict_Clear(self->memo);
2101 Py_INCREF(Py_None);
2102 return Py_None;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002103}
2104
2105static PyObject *
2106Pickle_getvalue(Picklerobject *self, PyObject *args) {
2107 int l, i, rsize, ssize, clear=1, lm;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002108 long ik;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002109 PyObject *k, *r;
2110 char *s, *p, *have_get;
2111 Pdata *data;
2112
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002113 /* Can be called by Python code or C code */
2114 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2115 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002116
2117 /* Check to make sure we are based on a list */
2118 if (! Pdata_Check(self->file)) {
2119 PyErr_SetString(PicklingError,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002120 "Attempt to getvalue() a non-list-based pickler");
Guido van Rossum053b8df1998-11-25 16:18:00 +00002121 return NULL;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002122 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002123
2124 /* flush write buffer */
2125 if (write_other(self, NULL, 0) < 0) return NULL;
2126
2127 data=(Pdata*)self->file;
2128 l=data->length;
2129
2130 /* set up an array to hold get/put status */
2131 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2132 lm++;
Tim Peters84e87f32001-03-17 04:50:51 +00002133 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002134 memset(have_get,0,lm);
2135
2136 /* Scan for gets. */
2137 for (rsize=0, i=l; --i >= 0; ) {
2138 k=data->data[i];
Tim Peters84e87f32001-03-17 04:50:51 +00002139
Guido van Rossum053b8df1998-11-25 16:18:00 +00002140 if (PyString_Check(k)) {
2141 rsize += PyString_GET_SIZE(k);
2142 }
2143
2144 else if (PyInt_Check(k)) { /* put */
2145 ik=PyInt_AS_LONG((PyIntObject*)k);
2146 if (ik >= lm || ik==0) {
2147 PyErr_SetString(PicklingError,
2148 "Invalid get data");
2149 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002150 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002151 if (have_get[ik]) { /* with matching get */
2152 if (ik < 256) rsize += 2;
2153 else rsize+=5;
2154 }
2155 }
2156
2157 else if (! (PyTuple_Check(k) &&
2158 PyTuple_GET_SIZE(k) == 2 &&
2159 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2160 ) {
2161 PyErr_SetString(PicklingError,
2162 "Unexpected data in internal list");
2163 return NULL;
2164 }
2165
2166 else { /* put */
2167 ik=PyInt_AS_LONG((PyIntObject*)k);
2168 if (ik >= lm || ik==0) {
2169 PyErr_SetString(PicklingError,
2170 "Invalid get data");
2171 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002172 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002173 have_get[ik]=1;
2174 if (ik < 256) rsize += 2;
2175 else rsize+=5;
2176 }
2177
2178 }
2179
2180 /* Now generate the result */
2181 UNLESS (r=PyString_FromStringAndSize(NULL,rsize)) goto err;
2182 s=PyString_AS_STRING((PyStringObject*)r);
2183
2184 for (i=0; i<l; i++) {
2185 k=data->data[i];
2186
2187 if (PyString_Check(k)) {
2188 ssize=PyString_GET_SIZE(k);
2189 if (ssize) {
2190 p=PyString_AS_STRING((PyStringObject*)k);
2191 while (--ssize >= 0) *s++=*p++;
2192 }
2193 }
2194
2195 else if (PyTuple_Check(k)) { /* get */
2196 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2197 if (ik < 256) {
2198 *s++ = BINGET;
2199 *s++ = (int)(ik & 0xff);
2200 }
2201 else {
2202 *s++ = LONG_BINGET;
2203 *s++ = (int)(ik & 0xff);
2204 *s++ = (int)((ik >> 8) & 0xff);
2205 *s++ = (int)((ik >> 16) & 0xff);
2206 *s++ = (int)((ik >> 24) & 0xff);
2207 }
2208 }
2209
2210 else { /* put */
2211 ik=PyInt_AS_LONG((PyIntObject*)k);
2212
2213 if (have_get[ik]) { /* with matching get */
2214 if (ik < 256) {
2215 *s++ = BINPUT;
2216 *s++ = (int)(ik & 0xff);
2217 }
2218 else {
2219 *s++ = LONG_BINPUT;
2220 *s++ = (int)(ik & 0xff);
2221 *s++ = (int)((ik >> 8) & 0xff);
2222 *s++ = (int)((ik >> 16) & 0xff);
2223 *s++ = (int)((ik >> 24) & 0xff);
2224 }
2225 }
2226 }
2227
2228 }
2229
2230 if (clear) {
2231 PyDict_Clear(self->memo);
2232 Pdata_clear(data,0);
2233 }
Tim Peters84e87f32001-03-17 04:50:51 +00002234
Guido van Rossum053b8df1998-11-25 16:18:00 +00002235 free(have_get);
2236 return r;
2237err:
2238 free(have_get);
2239 return NULL;
2240}
2241
2242static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002243Pickler_dump(Picklerobject *self, PyObject *args) {
2244 PyObject *ob;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002245 int get=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002246
Guido van Rossum43713e52000-02-29 13:59:29 +00002247 UNLESS (PyArg_ParseTuple(args, "O|i:dump", &ob, &get))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002248 return NULL;
2249
2250 if (dump(self, ob) < 0)
2251 return NULL;
2252
Guido van Rossum053b8df1998-11-25 16:18:00 +00002253 if (get) return Pickle_getvalue(self, NULL);
2254
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002255 /* XXX Why does dump() return self? */
Guido van Rossum053b8df1998-11-25 16:18:00 +00002256 Py_INCREF(self);
2257 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002258}
2259
2260
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002261static struct PyMethodDef Pickler_methods[] = {
Guido van Rossum142eeb81997-08-13 03:14:41 +00002262 {"dump", (PyCFunction)Pickler_dump, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002263 "dump(object) --"
2264 "Write an object in pickle format to the object's pickle stream\n"
2265 },
Guido van Rossum142eeb81997-08-13 03:14:41 +00002266 {"clear_memo", (PyCFunction)Pickle_clear_memo, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002267 "clear_memo() -- Clear the picklers memo"},
Guido van Rossum053b8df1998-11-25 16:18:00 +00002268 {"getvalue", (PyCFunction)Pickle_getvalue, 1,
2269 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002270 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002271};
2272
2273
2274static Picklerobject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002275newPicklerobject(PyObject *file, int bin) {
2276 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277
Guido van Rossumb18618d2000-05-03 23:44:39 +00002278 UNLESS (self = PyObject_New(Picklerobject, &Picklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002279 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002280
2281 self->fp = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002282 self->write = NULL;
2283 self->memo = NULL;
2284 self->arg = NULL;
2285 self->pers_func = NULL;
2286 self->inst_pers_func = NULL;
2287 self->write_buf = NULL;
2288 self->bin = bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002289 self->fast = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002290 self->fast_container = 0;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00002291 self->fast_memo = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292 self->buf_size = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002293 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002294
Guido van Rossum053b8df1998-11-25 16:18:00 +00002295 if (file)
2296 Py_INCREF(file);
2297 else
Guido van Rossum50f385c1998-12-04 18:48:44 +00002298 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002299
2300 UNLESS (self->file = file)
Guido van Rossum83addc72000-04-21 20:49:36 +00002301 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002302
Tim Peters84e87f32001-03-17 04:50:51 +00002303 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00002304 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002305
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306 if (PyFile_Check(file)) {
2307 self->fp = PyFile_AsFile(file);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002308 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00002309 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2310 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002311 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002312 self->write_func = write_file;
2313 }
2314 else if (PycStringIO_OutputCheck(file)) {
2315 self->write_func = write_cStringIO;
2316 }
Guido van Rossum142eeb81997-08-13 03:14:41 +00002317 else if (file == Py_None) {
2318 self->write_func = write_none;
2319 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002320 else {
2321 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002322
Guido van Rossum053b8df1998-11-25 16:18:00 +00002323 if (! Pdata_Check(file)) {
2324 UNLESS (self->write = PyObject_GetAttr(file, write_str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002325 PyErr_Clear();
2326 PyErr_SetString(PyExc_TypeError, "argument must have 'write' "
Guido van Rossum053b8df1998-11-25 16:18:00 +00002327 "attribute");
2328 goto err;
2329 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Tim Peters84e87f32001-03-17 04:50:51 +00002332 UNLESS (self->write_buf =
2333 (char *)malloc(WRITE_BUF_SIZE * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002334 PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002335 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002336 }
2337 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002338
Guido van Rossum053b8df1998-11-25 16:18:00 +00002339 if (PyEval_GetRestricted()) {
2340 /* Restricted execution, get private tables */
2341 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002342
Guido van Rossum053b8df1998-11-25 16:18:00 +00002343 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
2344 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2345 Py_DECREF(m);
2346 UNLESS (self->dispatch_table) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002347 }
2348 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002349 self->dispatch_table=dispatch_table;
2350 Py_INCREF(dispatch_table);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002351 }
2352
Guido van Rossum60456fd1997-04-09 17:36:32 +00002353 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002354
2355err:
2356 Py_DECREF((PyObject *)self);
2357 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002358}
2359
2360
2361static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002362get_Pickler(PyObject *self, PyObject *args) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002363 PyObject *file = NULL;
2364 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002365
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002366 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002367 PyErr_Clear();
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002368 bin = 0;
2369 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2370 return NULL;
2371 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002372 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002373}
2374
2375
2376static void
Guido van Rossum60456fd1997-04-09 17:36:32 +00002377Pickler_dealloc(Picklerobject *self) {
2378 Py_XDECREF(self->write);
2379 Py_XDECREF(self->memo);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00002380 Py_XDECREF(self->fast_memo);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002381 Py_XDECREF(self->arg);
2382 Py_XDECREF(self->file);
2383 Py_XDECREF(self->pers_func);
2384 Py_XDECREF(self->inst_pers_func);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002385 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002386
Tim Peters84e87f32001-03-17 04:50:51 +00002387 if (self->write_buf) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002388 free(self->write_buf);
2389 }
2390
Guido van Rossumb18618d2000-05-03 23:44:39 +00002391 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002392}
2393
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002394static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002395Pickler_get_pers_func(Picklerobject *p)
2396{
2397 if (p->pers_func == NULL)
2398 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2399 else
2400 Py_INCREF(p->pers_func);
2401 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002402}
2403
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002404static int
2405Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2406{
2407 if (v == NULL) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002408 PyErr_SetString(PyExc_TypeError,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002409 "attribute deletion is not supported");
Guido van Rossum053b8df1998-11-25 16:18:00 +00002410 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002411 }
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002412 Py_XDECREF(p->pers_func);
2413 Py_INCREF(v);
2414 p->pers_func = v;
2415 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002416}
2417
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002418static int
2419Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2420{
2421 if (v == NULL) {
2422 PyErr_SetString(PyExc_TypeError,
2423 "attribute deletion is not supported");
2424 return -1;
2425 }
2426 Py_XDECREF(p->inst_pers_func);
2427 Py_INCREF(v);
2428 p->inst_pers_func = v;
2429 return 0;
2430}
2431
2432static PyObject *
2433Pickler_get_memo(Picklerobject *p)
2434{
2435 if (p->memo == NULL)
2436 PyErr_SetString(PyExc_AttributeError, "memo");
2437 else
2438 Py_INCREF(p->memo);
2439 return p->memo;
2440}
2441
2442static int
2443Pickler_set_memo(Picklerobject *p, PyObject *v)
2444{
2445 if (v == NULL) {
2446 PyErr_SetString(PyExc_TypeError,
2447 "attribute deletion is not supported");
2448 return -1;
2449 }
2450 if (!PyDict_Check(v)) {
2451 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2452 return -1;
2453 }
2454 Py_XDECREF(p->memo);
2455 Py_INCREF(v);
2456 p->memo = v;
2457 return 0;
2458}
2459
2460static PyObject *
2461Pickler_get_error(Picklerobject *p)
2462{
2463 /* why is this an attribute on the Pickler? */
2464 Py_INCREF(PicklingError);
2465 return PicklingError;
2466}
2467
2468static PyMemberDef Pickler_members[] = {
2469 {"binary", T_INT, offsetof(Picklerobject, bin)},
2470 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002471 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002472};
2473
2474static PyGetSetDef Pickler_getsets[] = {
2475 {"persistent_id", (getter)Pickler_get_pers_func,
2476 (setter)Pickler_set_pers_func},
2477 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2478 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002479 {"PicklingError", (getter)Pickler_get_error, NULL},
2480 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002481};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002482
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002483static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002484"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002485
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002486static PyTypeObject Picklertype = {
2487 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002488 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002489 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002490 sizeof(Picklerobject), /*tp_basicsize*/
2491 0,
2492 (destructor)Pickler_dealloc, /* tp_dealloc */
2493 0, /* tp_print */
2494 0, /* tp_getattr */
2495 0, /* tp_setattr */
2496 0, /* tp_compare */
2497 0, /* tp_repr */
2498 0, /* tp_as_number */
2499 0, /* tp_as_sequence */
2500 0, /* tp_as_mapping */
2501 0, /* tp_hash */
2502 0, /* tp_call */
2503 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002504 0, /* set below */ /* tp_getattro */
2505 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002506 0, /* tp_as_buffer */
2507 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2508 Picklertype__doc__, /* tp_doc */
2509 0, /* tp_traverse */
2510 0, /* tp_clear */
2511 0, /* tp_richcompare */
2512 0, /* tp_weaklistoffset */
2513 0, /* tp_iter */
2514 0, /* tp_iternext */
2515 Pickler_methods, /* tp_methods */
2516 Pickler_members, /* tp_members */
2517 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002518};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002519
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002520static PyObject *
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002521find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) {
Guido van Rossume2d81cd1998-08-08 19:40:10 +00002522 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002523
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002524 if (fc) {
2525 if (fc==Py_None) {
Tim Peters84e87f32001-03-17 04:50:51 +00002526 PyErr_SetString(UnpicklingError,
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002527 "Global and instance pickles are not supported.");
2528 return NULL;
2529 }
2530 return PyObject_CallFunction(fc, "OO", py_module_name, py_global_name);
2531 }
2532
Jeremy Hyltond1055231998-08-11 19:52:51 +00002533 module = PySys_GetObject("modules");
2534 if (module == NULL)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002535 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002536
2537 module = PyDict_GetItem(module, py_module_name);
2538 if (module == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002539 module = PyImport_Import(py_module_name);
2540 if (!module)
2541 return NULL;
2542 global = PyObject_GetAttr(module, py_global_name);
2543 Py_DECREF(module);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002544 }
Jeremy Hyltond1055231998-08-11 19:52:51 +00002545 else
Guido van Rossum053b8df1998-11-25 16:18:00 +00002546 global = PyObject_GetAttr(module, py_global_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002547 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002548}
2549
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002551marker(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002552 if (self->num_marks < 1) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002553 PyErr_SetString(UnpicklingError, "could not find MARK");
2554 return -1;
2555 }
2556
2557 return self->marks[--self->num_marks];
2558}
2559
Tim Peters84e87f32001-03-17 04:50:51 +00002560
Guido van Rossum60456fd1997-04-09 17:36:32 +00002561static int
2562load_none(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002563 PDATA_APPEND(self->stack, Py_None, -1);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002565}
2566
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002567static int
Thomas Wouters58d05102000-07-24 14:43:35 +00002568bad_readline(void) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002569 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2570 return -1;
2571}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002572
2573static int
2574load_int(Unpicklerobject *self) {
2575 PyObject *py_int = 0;
2576 char *endptr, *s;
2577 int len, res = -1;
2578 long l;
2579
2580 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002581 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002582 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002583
2584 errno = 0;
2585 l = strtol(s, &endptr, 0);
2586
2587 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2588 /* Hm, maybe we've got something long. Let's try reading
Guido van Rossum053b8df1998-11-25 16:18:00 +00002589 it as a Python long object. */
Tim Peters12778e32001-08-28 22:08:34 +00002590 errno = 0;
2591 py_int = PyLong_FromString(s, NULL, 0);
2592 if (py_int == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002593 PyErr_SetString(PyExc_ValueError,
2594 "could not convert string to int");
2595 goto finally;
2596 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002597 }
2598 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002599 UNLESS (py_int = PyInt_FromLong(l)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002600 }
2601
Guido van Rossum053b8df1998-11-25 16:18:00 +00002602 free(s);
2603 PDATA_PUSH(self->stack, py_int, -1);
2604 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002605
2606finally:
2607 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002608
2609 return res;
2610}
2611
2612
Tim Peters84e87f32001-03-17 04:50:51 +00002613static long
Guido van Rossum60456fd1997-04-09 17:36:32 +00002614calc_binint(char *s, int x) {
2615 unsigned char c;
2616 int i;
2617 long l;
2618
2619 for (i = 0, l = 0L; i < x; i++) {
2620 c = (unsigned char)s[i];
2621 l |= (long)c << (i * 8);
2622 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002623#if SIZEOF_LONG > 4
2624 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2625 * is signed, so on a box with longs bigger than 4 bytes we need
2626 * to extend a BININT's sign bit to the full width.
2627 */
2628 if (x == 4 && l & (1L << 31))
2629 l |= (~0L) << 32;
2630#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631 return l;
2632}
2633
2634
2635static int
2636load_binintx(Unpicklerobject *self, char *s, int x) {
2637 PyObject *py_int = 0;
2638 long l;
2639
2640 l = calc_binint(s, x);
2641
Guido van Rossum053b8df1998-11-25 16:18:00 +00002642 UNLESS (py_int = PyInt_FromLong(l))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002644
Guido van Rossum053b8df1998-11-25 16:18:00 +00002645 PDATA_PUSH(self->stack, py_int, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646 return 0;
2647}
2648
2649
2650static int
2651load_binint(Unpicklerobject *self) {
2652 char *s;
2653
2654 if ((*self->read_func)(self, &s, 4) < 0)
2655 return -1;
2656
2657 return load_binintx(self, s, 4);
2658}
2659
2660
2661static int
2662load_binint1(Unpicklerobject *self) {
2663 char *s;
2664
2665 if ((*self->read_func)(self, &s, 1) < 0)
2666 return -1;
2667
2668 return load_binintx(self, s, 1);
2669}
2670
2671
2672static int
2673load_binint2(Unpicklerobject *self) {
2674 char *s;
2675
2676 if ((*self->read_func)(self, &s, 2) < 0)
2677 return -1;
2678
2679 return load_binintx(self, s, 2);
2680}
Tim Peters84e87f32001-03-17 04:50:51 +00002681
Guido van Rossum60456fd1997-04-09 17:36:32 +00002682static int
2683load_long(Unpicklerobject *self) {
2684 PyObject *l = 0;
2685 char *end, *s;
2686 int len, res = -1;
2687
Guido van Rossum60456fd1997-04-09 17:36:32 +00002688 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002689 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002690 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002691
Guido van Rossum053b8df1998-11-25 16:18:00 +00002692 UNLESS (l = PyLong_FromString(s, &end, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002693 goto finally;
2694
Guido van Rossum053b8df1998-11-25 16:18:00 +00002695 free(s);
2696 PDATA_PUSH(self->stack, l, -1);
2697 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002698
2699finally:
2700 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002701
2702 return res;
2703}
2704
Tim Peters84e87f32001-03-17 04:50:51 +00002705
Guido van Rossum60456fd1997-04-09 17:36:32 +00002706static int
2707load_float(Unpicklerobject *self) {
2708 PyObject *py_float = 0;
2709 char *endptr, *s;
2710 int len, res = -1;
2711 double d;
2712
2713 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002714 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002715 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716
2717 errno = 0;
2718 d = strtod(s, &endptr);
2719
2720 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
Tim Peters84e87f32001-03-17 04:50:51 +00002721 PyErr_SetString(PyExc_ValueError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722 "could not convert string to float");
2723 goto finally;
2724 }
2725
Guido van Rossum053b8df1998-11-25 16:18:00 +00002726 UNLESS (py_float = PyFloat_FromDouble(d))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002727 goto finally;
2728
Guido van Rossum053b8df1998-11-25 16:18:00 +00002729 free(s);
2730 PDATA_PUSH(self->stack, py_float, -1);
2731 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732
2733finally:
2734 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
2736 return res;
2737}
2738
Guido van Rossum60456fd1997-04-09 17:36:32 +00002739static int
2740load_binfloat(Unpicklerobject *self) {
2741 PyObject *py_float = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00002742 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002743 long fhi, flo;
2744 double x;
2745 char *p;
2746
2747 if ((*self->read_func)(self, &p, 8) < 0)
2748 return -1;
2749
2750 /* First byte */
2751 s = (*p>>7) & 1;
2752 e = (*p & 0x7F) << 4;
2753 p++;
2754
2755 /* Second byte */
2756 e |= (*p>>4) & 0xF;
2757 fhi = (*p & 0xF) << 24;
2758 p++;
2759
2760 /* Third byte */
2761 fhi |= (*p & 0xFF) << 16;
2762 p++;
2763
2764 /* Fourth byte */
2765 fhi |= (*p & 0xFF) << 8;
2766 p++;
2767
2768 /* Fifth byte */
2769 fhi |= *p & 0xFF;
2770 p++;
2771
2772 /* Sixth byte */
2773 flo = (*p & 0xFF) << 16;
2774 p++;
2775
2776 /* Seventh byte */
2777 flo |= (*p & 0xFF) << 8;
2778 p++;
2779
2780 /* Eighth byte */
2781 flo |= *p & 0xFF;
2782
2783 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2784 x /= 268435456.0; /* 2**28 */
2785
2786 /* XXX This sadly ignores Inf/NaN */
2787 if (e == 0)
2788 e = -1022;
2789 else {
2790 x += 1.0;
2791 e -= 1023;
2792 }
2793 x = ldexp(x, e);
2794
2795 if (s)
2796 x = -x;
2797
Guido van Rossum053b8df1998-11-25 16:18:00 +00002798 UNLESS (py_float = PyFloat_FromDouble(x)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Guido van Rossum053b8df1998-11-25 16:18:00 +00002800 PDATA_PUSH(self->stack, py_float, -1);
2801 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002802}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002803
2804static int
2805load_string(Unpicklerobject *self) {
2806 PyObject *str = 0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002807 int len, res = -1, nslash;
2808 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002809
2810 static PyObject *eval_dict = 0;
2811
2812 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002813 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002814 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002815
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002816 /* Check for unquoted quotes (evil strings) */
2817 q=*s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002818 if (q != '"' && q != '\'') goto insecure;
2819 for (p=s+1, nslash=0; *p; p++) {
2820 if (*p==q && nslash%2==0) break;
2821 if (*p=='\\') nslash++;
2822 else nslash=0;
Tim Petersbf5ca652001-11-12 22:26:10 +00002823 }
2824 if (*p == q) {
2825 for (p++; *p; p++)
2826 if (*(unsigned char *)p > ' ')
2827 goto insecure;
2828 }
2829 else
2830 goto insecure;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002831 /********************************************/
2832
Guido van Rossum053b8df1998-11-25 16:18:00 +00002833 UNLESS (eval_dict)
2834 UNLESS (eval_dict = Py_BuildValue("{s{}}", "__builtins__"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835 goto finally;
2836
Guido van Rossum053b8df1998-11-25 16:18:00 +00002837 UNLESS (str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838 goto finally;
2839
Guido van Rossum053b8df1998-11-25 16:18:00 +00002840 free(s);
2841 PDATA_PUSH(self->stack, str, -1);
2842 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
2844finally:
2845 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
2847 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002848
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002849insecure:
2850 free(s);
2851 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2852 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002853}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
2855
2856static int
2857load_binstring(Unpicklerobject *self) {
2858 PyObject *py_string = 0;
2859 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860 char *s;
2861
Guido van Rossum053b8df1998-11-25 16:18:00 +00002862 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
2864 l = calc_binint(s, 4);
2865
2866 if ((*self->read_func)(self, &s, l) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002867 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002868
Guido van Rossum053b8df1998-11-25 16:18:00 +00002869 UNLESS (py_string = PyString_FromStringAndSize(s, l))
2870 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871
Guido van Rossum053b8df1998-11-25 16:18:00 +00002872 PDATA_PUSH(self->stack, py_string, -1);
2873 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002874}
2875
2876
2877static int
2878load_short_binstring(Unpicklerobject *self) {
2879 PyObject *py_string = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002880 unsigned char l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002881 char *s;
2882
2883 if ((*self->read_func)(self, &s, 1) < 0)
2884 return -1;
2885
2886 l = (unsigned char)s[0];
2887
Guido van Rossum053b8df1998-11-25 16:18:00 +00002888 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Guido van Rossum053b8df1998-11-25 16:18:00 +00002890 UNLESS (py_string = PyString_FromStringAndSize(s, l)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891
Guido van Rossum053b8df1998-11-25 16:18:00 +00002892 PDATA_PUSH(self->stack, py_string, -1);
2893 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002894}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002895
2896
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002897#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002898static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002899load_unicode(Unpicklerobject *self) {
2900 PyObject *str = 0;
2901 int len, res = -1;
2902 char *s;
2903
2904 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00002905 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002906
2907 UNLESS (str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))
2908 goto finally;
2909
2910 PDATA_PUSH(self->stack, str, -1);
2911 return 0;
2912
2913finally:
2914 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002915}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002916#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002917
2918
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002919#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002920static int
2921load_binunicode(Unpicklerobject *self) {
2922 PyObject *unicode;
2923 long l;
2924 char *s;
2925
2926 if ((*self->read_func)(self, &s, 4) < 0) return -1;
2927
2928 l = calc_binint(s, 4);
2929
2930 if ((*self->read_func)(self, &s, l) < 0)
2931 return -1;
2932
2933 UNLESS (unicode = PyUnicode_DecodeUTF8(s, l, NULL))
2934 return -1;
2935
2936 PDATA_PUSH(self->stack, unicode, -1);
2937 return 0;
2938}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002939#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002940
2941
2942static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943load_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002944 PyObject *tup;
2945 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Guido van Rossum053b8df1998-11-25 16:18:00 +00002947 if ((i = marker(self)) < 0) return -1;
2948 UNLESS (tup=Pdata_popTuple(self->stack, i)) return -1;
2949 PDATA_PUSH(self->stack, tup, -1);
2950 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951}
2952
2953static int
2954load_empty_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002955 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002956
Guido van Rossum053b8df1998-11-25 16:18:00 +00002957 UNLESS (tup=PyTuple_New(0)) return -1;
2958 PDATA_PUSH(self->stack, tup, -1);
2959 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960}
2961
2962static int
2963load_empty_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002964 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Guido van Rossum053b8df1998-11-25 16:18:00 +00002966 UNLESS (list=PyList_New(0)) return -1;
2967 PDATA_PUSH(self->stack, list, -1);
2968 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969}
2970
2971static int
2972load_empty_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002973 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974
Guido van Rossum053b8df1998-11-25 16:18:00 +00002975 UNLESS (dict=PyDict_New()) return -1;
2976 PDATA_PUSH(self->stack, dict, -1);
2977 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978}
2979
2980
2981static int
2982load_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002983 PyObject *list = 0;
2984 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985
Guido van Rossum053b8df1998-11-25 16:18:00 +00002986 if ((i = marker(self)) < 0) return -1;
2987 UNLESS (list=Pdata_popList(self->stack, i)) return -1;
2988 PDATA_PUSH(self->stack, list, -1);
2989 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002990}
2991
2992static int
2993load_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002994 PyObject *dict, *key, *value;
2995 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Guido van Rossum053b8df1998-11-25 16:18:00 +00002997 if ((i = marker(self)) < 0) return -1;
2998 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002999
Guido van Rossum053b8df1998-11-25 16:18:00 +00003000 UNLESS (dict = PyDict_New()) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Guido van Rossum053b8df1998-11-25 16:18:00 +00003002 for (k = i+1; k < j; k += 2) {
3003 key =self->stack->data[k-1];
3004 value=self->stack->data[k ];
3005 if (PyDict_SetItem(dict, key, value) < 0) {
3006 Py_DECREF(dict);
3007 return -1;
3008 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003010 Pdata_clear(self->stack, i);
3011 PDATA_PUSH(self->stack, dict, -1);
3012 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013}
3014
3015static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003016Instance_New(PyObject *cls, PyObject *args) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003017 int has_key;
3018 PyObject *safe=0, *r=0;
3019
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003020 if (PyClass_Check(cls)) {
3021 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003022
Jeremy Hylton03657cf2000-07-12 13:05:33 +00003023 if ((l=PyObject_Size(args)) < 0) goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003024 UNLESS (l) {
3025 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003026
Guido van Rossum053b8df1998-11-25 16:18:00 +00003027 UNLESS (__getinitargs__=PyObject_GetAttr(cls, __getinitargs___str)) {
3028 /* We have a class with no __getinitargs__, so bypass usual
3029 construction */
Fred Drake2c773552001-03-22 17:52:17 +00003030 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003031
Guido van Rossum053b8df1998-11-25 16:18:00 +00003032 PyErr_Clear();
Fred Drake2c773552001-03-22 17:52:17 +00003033 UNLESS (inst=PyInstance_NewRaw(cls, NULL))
Guido van Rossum053b8df1998-11-25 16:18:00 +00003034 goto err;
Fred Drake2c773552001-03-22 17:52:17 +00003035 return inst;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003036 }
3037 Py_DECREF(__getinitargs__);
3038 }
Tim Peters84e87f32001-03-17 04:50:51 +00003039
Guido van Rossum053b8df1998-11-25 16:18:00 +00003040 if ((r=PyInstance_New(cls, args, NULL))) return r;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003041 else goto err;
3042 }
Tim Peters84e87f32001-03-17 04:50:51 +00003043
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003044 /* Is safe_constructors always a dict? */
3045 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046 if (!has_key)
Guido van Rossum053b8df1998-11-25 16:18:00 +00003047 if (!(safe = PyObject_GetAttr(cls, __safe_for_unpickling___str)) ||
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048 !PyObject_IsTrue(safe)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003049 cPickle_ErrFormat(UnpicklingError,
3050 "%s is not safe for unpickling", "O", cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051 Py_XDECREF(safe);
3052 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003053 }
3054
Guido van Rossum053b8df1998-11-25 16:18:00 +00003055 if (args==Py_None) {
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003056 /* Special case, call cls.__basicnew__() */
3057 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003058
Guido van Rossum053b8df1998-11-25 16:18:00 +00003059 UNLESS (basicnew=PyObject_GetAttr(cls, __basicnew___str)) return NULL;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003060 r=PyObject_CallObject(basicnew, NULL);
3061 Py_DECREF(basicnew);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003062 if (r) return r;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003063 }
3064
Guido van Rossum053b8df1998-11-25 16:18:00 +00003065 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003066
Guido van Rossum60456fd1997-04-09 17:36:32 +00003067err:
3068 {
3069 PyObject *tp, *v, *tb;
3070
3071 PyErr_Fetch(&tp, &v, &tb);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003072 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3073 Py_XDECREF(v);
3074 v=r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075 }
3076 PyErr_Restore(tp,v,tb);
3077 }
3078 return NULL;
3079}
Tim Peters84e87f32001-03-17 04:50:51 +00003080
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
3082static int
3083load_obj(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003084 PyObject *class, *tup, *obj=0;
3085 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086
Guido van Rossum053b8df1998-11-25 16:18:00 +00003087 if ((i = marker(self)) < 0) return -1;
3088 UNLESS (tup=Pdata_popTuple(self->stack, i+1)) return -1;
3089 PDATA_POP(self->stack, class);
3090 if (class) {
3091 obj = Instance_New(class, tup);
3092 Py_DECREF(class);
3093 }
3094 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003095
Guido van Rossum053b8df1998-11-25 16:18:00 +00003096 if (! obj) return -1;
3097 PDATA_PUSH(self->stack, obj, -1);
3098 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099}
3100
3101
3102static int
3103load_inst(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003104 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003105 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106 char *s;
3107
Guido van Rossum053b8df1998-11-25 16:18:00 +00003108 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003109
Guido van Rossum053b8df1998-11-25 16:18:00 +00003110 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003111 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003112 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003113
Guido van Rossum053b8df1998-11-25 16:18:00 +00003114 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003115 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003116 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003117 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003118 Py_DECREF(class_name);
3119 }
3120 }
3121 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003122
Guido van Rossum053b8df1998-11-25 16:18:00 +00003123 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003124
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003125 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003126 obj = Instance_New(class, tup);
3127 Py_DECREF(tup);
3128 }
3129 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003130
Guido van Rossum053b8df1998-11-25 16:18:00 +00003131 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003132
Guido van Rossum053b8df1998-11-25 16:18:00 +00003133 PDATA_PUSH(self->stack, obj, -1);
3134 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135}
3136
3137
3138static int
3139load_global(Unpicklerobject *self) {
3140 PyObject *class = 0, *module_name = 0, *class_name = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003141 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142 char *s;
3143
Guido van Rossum053b8df1998-11-25 16:18:00 +00003144 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003145 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003146 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147
Guido van Rossum053b8df1998-11-25 16:18:00 +00003148 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003149 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003150 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003151 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003152 Py_DECREF(class_name);
3153 }
3154 }
3155 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Guido van Rossum053b8df1998-11-25 16:18:00 +00003157 if (! class) return -1;
3158 PDATA_PUSH(self->stack, class, -1);
3159 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003160}
3161
3162
3163static int
3164load_persid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003165 PyObject *pid = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003166 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167 char *s;
3168
3169 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003170 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003171 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003172
Guido van Rossum053b8df1998-11-25 16:18:00 +00003173 UNLESS (pid = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Guido van Rossum053b8df1998-11-25 16:18:00 +00003175 if (PyList_Check(self->pers_func)) {
3176 if (PyList_Append(self->pers_func, pid) < 0) {
3177 Py_DECREF(pid);
3178 return -1;
3179 }
3180 }
3181 else {
3182 ARG_TUP(self, pid);
3183 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003184 pid = PyObject_Call(self->pers_func, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003185 FREE_ARG_TUP(self);
3186 }
3187 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188
Guido van Rossum053b8df1998-11-25 16:18:00 +00003189 if (! pid) return -1;
3190
3191 PDATA_PUSH(self->stack, pid, -1);
3192 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003193 }
3194 else {
3195 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003196 "A load persistent id instruction was encountered,\n"
3197 "but no persistent_load function was specified.");
3198 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200}
3201
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202static int
3203load_binpersid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003204 PyObject *pid = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205
3206 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003207 PDATA_POP(self->stack, pid);
3208 if (! pid) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Guido van Rossum053b8df1998-11-25 16:18:00 +00003210 if (PyList_Check(self->pers_func)) {
3211 if (PyList_Append(self->pers_func, pid) < 0) {
3212 Py_DECREF(pid);
3213 return -1;
3214 }
3215 }
3216 else {
3217 ARG_TUP(self, pid);
3218 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003219 pid = PyObject_Call(self->pers_func, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003220 FREE_ARG_TUP(self);
3221 }
3222 if (! pid) return -1;
3223 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Guido van Rossum053b8df1998-11-25 16:18:00 +00003225 PDATA_PUSH(self->stack, pid, -1);
3226 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003228 else {
3229 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003230 "A load persistent id instruction was encountered,\n"
3231 "but no persistent_load function was specified.");
3232 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003233 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234}
3235
3236
3237static int
3238load_pop(Unpicklerobject *self) {
3239 int len;
3240
Guido van Rossum053b8df1998-11-25 16:18:00 +00003241 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003242
Tim Peters84e87f32001-03-17 04:50:51 +00003243 /* Note that we split the (pickle.py) stack into two stacks,
Guido van Rossumea2b7152000-05-09 18:14:50 +00003244 an object stack and a mark stack. We have to be clever and
3245 pop the right one. We do this by looking at the top of the
3246 mark stack.
3247 */
3248
Tim Peters84e87f32001-03-17 04:50:51 +00003249 if ((self->num_marks > 0) &&
Guido van Rossum60456fd1997-04-09 17:36:32 +00003250 (self->marks[self->num_marks - 1] == len))
3251 self->num_marks--;
Tim Peters84e87f32001-03-17 04:50:51 +00003252 else {
Guido van Rossumea2b7152000-05-09 18:14:50 +00003253 len--;
3254 Py_DECREF(self->stack->data[len]);
3255 self->stack->length=len;
3256 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257
3258 return 0;
3259}
3260
3261
3262static int
3263load_pop_mark(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003264 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003265
3266 if ((i = marker(self)) < 0)
3267 return -1;
3268
Guido van Rossum053b8df1998-11-25 16:18:00 +00003269 Pdata_clear(self->stack, i);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003270
3271 return 0;
3272}
3273
3274
3275static int
3276load_dup(Unpicklerobject *self) {
3277 PyObject *last;
3278 int len;
3279
Guido van Rossum053b8df1998-11-25 16:18:00 +00003280 if ((len = self->stack->length) <= 0) return stackUnderflow();
3281 last=self->stack->data[len-1];
3282 Py_INCREF(last);
3283 PDATA_PUSH(self->stack, last, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003284 return 0;
3285}
3286
3287
3288static int
3289load_get(Unpicklerobject *self) {
3290 PyObject *py_str = 0, *value = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003291 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003293 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003294
Guido van Rossum053b8df1998-11-25 16:18:00 +00003295 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003296 if (len < 2) return bad_readline();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003297
Guido van Rossum053b8df1998-11-25 16:18:00 +00003298 UNLESS (py_str = PyString_FromStringAndSize(s, len - 1)) return -1;
3299
3300 value = PyDict_GetItem(self->memo, py_str);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003301 if (! value) {
3302 PyErr_SetObject(BadPickleGet, py_str);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003303 rc = -1;
3304 } else {
3305 PDATA_APPEND(self->stack, value, -1);
3306 rc = 0;
3307 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Guido van Rossum2f80d961999-07-13 15:18:58 +00003309 Py_DECREF(py_str);
3310 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311}
3312
3313
3314static int
3315load_binget(Unpicklerobject *self) {
3316 PyObject *py_key = 0, *value = 0;
3317 unsigned char key;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003319 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003320
Guido van Rossum053b8df1998-11-25 16:18:00 +00003321 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003322
3323 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003324 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003325
Guido van Rossum053b8df1998-11-25 16:18:00 +00003326 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003327 if (! value) {
3328 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003329 rc = -1;
3330 } else {
3331 PDATA_APPEND(self->stack, value, -1);
3332 rc = 0;
3333 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334
Guido van Rossum2f80d961999-07-13 15:18:58 +00003335 Py_DECREF(py_key);
3336 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003337}
3338
3339
3340static int
3341load_long_binget(Unpicklerobject *self) {
3342 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003343 unsigned char c;
3344 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345 long key;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003346 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347
Guido van Rossum053b8df1998-11-25 16:18:00 +00003348 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003349
3350 c = (unsigned char)s[0];
3351 key = (long)c;
3352 c = (unsigned char)s[1];
3353 key |= (long)c << 8;
3354 c = (unsigned char)s[2];
3355 key |= (long)c << 16;
3356 c = (unsigned char)s[3];
3357 key |= (long)c << 24;
3358
Guido van Rossum053b8df1998-11-25 16:18:00 +00003359 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003360
Guido van Rossum053b8df1998-11-25 16:18:00 +00003361 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003362 if (! value) {
3363 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003364 rc = -1;
3365 } else {
3366 PDATA_APPEND(self->stack, value, -1);
3367 rc = 0;
3368 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003369
Guido van Rossum2f80d961999-07-13 15:18:58 +00003370 Py_DECREF(py_key);
3371 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372}
3373
3374
3375static int
3376load_put(Unpicklerobject *self) {
3377 PyObject *py_str = 0, *value = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003378 int len, l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379 char *s;
3380
Guido van Rossum053b8df1998-11-25 16:18:00 +00003381 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumd1f66dc1999-02-08 22:38:25 +00003382 if (l < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003383 UNLESS (len=self->stack->length) return stackUnderflow();
3384 UNLESS (py_str = PyString_FromStringAndSize(s, l - 1)) return -1;
3385 value=self->stack->data[len-1];
3386 l=PyDict_SetItem(self->memo, py_str, value);
3387 Py_DECREF(py_str);
3388 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389}
3390
3391
3392static int
3393load_binput(Unpicklerobject *self) {
3394 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003395 unsigned char key;
3396 char *s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003397 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003398
Guido van Rossum053b8df1998-11-25 16:18:00 +00003399 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3400 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003401
3402 key = (unsigned char)s[0];
3403
Guido van Rossum053b8df1998-11-25 16:18:00 +00003404 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3405 value=self->stack->data[len-1];
3406 len=PyDict_SetItem(self->memo, py_key, value);
3407 Py_DECREF(py_key);
3408 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409}
3410
3411
3412static int
3413load_long_binput(Unpicklerobject *self) {
3414 PyObject *py_key = 0, *value = 0;
3415 long key;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003416 unsigned char c;
3417 char *s;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003418 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Guido van Rossum053b8df1998-11-25 16:18:00 +00003420 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3421 UNLESS (len=self->stack->length) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
3423 c = (unsigned char)s[0];
3424 key = (long)c;
3425 c = (unsigned char)s[1];
3426 key |= (long)c << 8;
3427 c = (unsigned char)s[2];
3428 key |= (long)c << 16;
3429 c = (unsigned char)s[3];
3430 key |= (long)c << 24;
3431
Guido van Rossum053b8df1998-11-25 16:18:00 +00003432 UNLESS (py_key = PyInt_FromLong(key)) return -1;
3433 value=self->stack->data[len-1];
3434 len=PyDict_SetItem(self->memo, py_key, value);
3435 Py_DECREF(py_key);
3436 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437}
3438
3439
Tim Peters84e87f32001-03-17 04:50:51 +00003440static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441do_append(Unpicklerobject *self, int x) {
3442 PyObject *value = 0, *list = 0, *append_method = 0;
3443 int len, i;
3444
Guido van Rossum053b8df1998-11-25 16:18:00 +00003445 UNLESS ((len=self->stack->length) >= x && x > 0) return stackUnderflow();
3446 if (len==x) return 0; /* nothing to do */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003447
Guido van Rossum053b8df1998-11-25 16:18:00 +00003448 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449
3450 if (PyList_Check(list)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003451 PyObject *slice;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003453
Guido van Rossum053b8df1998-11-25 16:18:00 +00003454 slice=Pdata_popList(self->stack, x);
3455 list_len = PyList_GET_SIZE(list);
3456 i=PyList_SetSlice(list, list_len, list_len, slice);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457 Py_DECREF(slice);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003458 return i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459 }
3460 else {
3461
Guido van Rossum053b8df1998-11-25 16:18:00 +00003462 UNLESS (append_method = PyObject_GetAttr(list, append_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003464
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465 for (i = x; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003466 PyObject *junk;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Guido van Rossum053b8df1998-11-25 16:18:00 +00003468 value=self->stack->data[i];
3469 junk=0;
3470 ARG_TUP(self, value);
3471 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003472 junk = PyObject_Call(append_method, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003473 FREE_ARG_TUP(self);
3474 }
3475 if (! junk) {
3476 Pdata_clear(self->stack, i+1);
3477 self->stack->length=x;
3478 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003480 }
3481 Py_DECREF(junk);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003483 self->stack->length=x;
3484 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485 }
3486
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488}
3489
Tim Peters84e87f32001-03-17 04:50:51 +00003490
Guido van Rossum60456fd1997-04-09 17:36:32 +00003491static int
3492load_append(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003493 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003494}
3495
3496
3497static int
3498load_appends(Unpicklerobject *self) {
3499 return do_append(self, marker(self));
3500}
3501
3502
3503static int
3504do_setitems(Unpicklerobject *self, int x) {
3505 PyObject *value = 0, *key = 0, *dict = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003506 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507
Guido van Rossum053b8df1998-11-25 16:18:00 +00003508 UNLESS ((len=self->stack->length) >= x
3509 && x > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510
Guido van Rossum053b8df1998-11-25 16:18:00 +00003511 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003512
Guido van Rossum053b8df1998-11-25 16:18:00 +00003513 for (i = x+1; i < len; i += 2) {
3514 key =self->stack->data[i-1];
3515 value=self->stack->data[i ];
3516 if (PyObject_SetItem(dict, key, value) < 0) {
3517 r=-1;
3518 break;
3519 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520 }
3521
Guido van Rossum053b8df1998-11-25 16:18:00 +00003522 Pdata_clear(self->stack, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003523
Guido van Rossum053b8df1998-11-25 16:18:00 +00003524 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003525}
3526
3527
3528static int
3529load_setitem(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003530 return do_setitems(self, self->stack->length - 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003531}
3532
Guido van Rossum60456fd1997-04-09 17:36:32 +00003533static int
3534load_setitems(Unpicklerobject *self) {
3535 return do_setitems(self, marker(self));
3536}
3537
3538
3539static int
3540load_build(Unpicklerobject *self) {
Tim Peters84e87f32001-03-17 04:50:51 +00003541 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542 *junk = 0, *__setstate__ = 0;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003543 int i, r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Guido van Rossum053b8df1998-11-25 16:18:00 +00003545 if (self->stack->length < 2) return stackUnderflow();
3546 PDATA_POP(self->stack, value);
3547 if (! value) return -1;
3548 inst=self->stack->data[self->stack->length-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003549
Guido van Rossum053b8df1998-11-25 16:18:00 +00003550 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3551 ARG_TUP(self, value);
3552 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003553 junk = PyObject_Call(__setstate__, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003554 FREE_ARG_TUP(self);
3555 }
3556 Py_DECREF(__setstate__);
3557 if (! junk) return -1;
3558 Py_DECREF(junk);
3559 return 0;
3560 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003561
Guido van Rossum053b8df1998-11-25 16:18:00 +00003562 PyErr_Clear();
3563 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564 i = 0;
3565 while (PyDict_Next(value, &i, &d_key, &d_value)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003566 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3567 r=-1;
3568 break;
3569 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003571 Py_DECREF(instdict);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003573 else r=-1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003574
Guido van Rossum053b8df1998-11-25 16:18:00 +00003575 Py_XDECREF(value);
Tim Peters84e87f32001-03-17 04:50:51 +00003576
Guido van Rossum053b8df1998-11-25 16:18:00 +00003577 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578}
3579
3580
3581static int
3582load_mark(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003583 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584
Guido van Rossumea2b7152000-05-09 18:14:50 +00003585 /* Note that we split the (pickle.py) stack into two stacks, an
3586 object stack and a mark stack. Here we push a mark onto the
Tim Peters84e87f32001-03-17 04:50:51 +00003587 mark stack.
Guido van Rossumea2b7152000-05-09 18:14:50 +00003588 */
3589
Guido van Rossum053b8df1998-11-25 16:18:00 +00003590 if ((self->num_marks + 1) >= self->marks_size) {
3591 s=self->marks_size+20;
3592 if (s <= self->num_marks) s=self->num_marks + 1;
Guido van Rossum761fcd01999-04-12 22:51:20 +00003593 if (self->marks == NULL)
Guido van Rossumaa8d1671999-01-25 21:43:51 +00003594 self->marks=(int *)malloc(s * sizeof(int));
3595 else
3596 self->marks=(int *)realloc(self->marks, s * sizeof(int));
Guido van Rossum053b8df1998-11-25 16:18:00 +00003597 if (! self->marks) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598 PyErr_NoMemory();
3599 return -1;
3600 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003601 self->marks_size = s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003602 }
3603
Guido van Rossum053b8df1998-11-25 16:18:00 +00003604 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
3606 return 0;
3607}
3608
3609static int
3610load_reduce(Unpicklerobject *self) {
3611 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003612
Guido van Rossum053b8df1998-11-25 16:18:00 +00003613 PDATA_POP(self->stack, arg_tup);
3614 if (! arg_tup) return -1;
3615 PDATA_POP(self->stack, callable);
3616 if (callable) {
3617 ob = Instance_New(callable, arg_tup);
3618 Py_DECREF(callable);
3619 }
3620 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621
Guido van Rossum053b8df1998-11-25 16:18:00 +00003622 if (! ob) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003623
Guido van Rossum053b8df1998-11-25 16:18:00 +00003624 PDATA_PUSH(self->stack, ob, -1);
3625 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003626}
Tim Peters84e87f32001-03-17 04:50:51 +00003627
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003629load(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003630 PyObject *err = 0, *val = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003631 char *s;
3632
Guido van Rossum60456fd1997-04-09 17:36:32 +00003633 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003634 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003635
3636 while (1) {
3637 if ((*self->read_func)(self, &s, 1) < 0)
3638 break;
3639
3640 switch (s[0]) {
3641 case NONE:
3642 if (load_none(self) < 0)
3643 break;
3644 continue;
3645
3646 case BININT:
3647 if (load_binint(self) < 0)
3648 break;
3649 continue;
3650
3651 case BININT1:
3652 if (load_binint1(self) < 0)
3653 break;
3654 continue;
3655
3656 case BININT2:
3657 if (load_binint2(self) < 0)
3658 break;
3659 continue;
3660
3661 case INT:
3662 if (load_int(self) < 0)
3663 break;
3664 continue;
3665
3666 case LONG:
3667 if (load_long(self) < 0)
3668 break;
3669 continue;
3670
3671 case FLOAT:
3672 if (load_float(self) < 0)
3673 break;
3674 continue;
3675
Guido van Rossum60456fd1997-04-09 17:36:32 +00003676 case BINFLOAT:
3677 if (load_binfloat(self) < 0)
3678 break;
3679 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680
3681 case BINSTRING:
3682 if (load_binstring(self) < 0)
3683 break;
3684 continue;
3685
3686 case SHORT_BINSTRING:
3687 if (load_short_binstring(self) < 0)
3688 break;
3689 continue;
3690
3691 case STRING:
3692 if (load_string(self) < 0)
3693 break;
3694 continue;
3695
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003696#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003697 case UNICODE:
3698 if (load_unicode(self) < 0)
3699 break;
3700 continue;
3701
3702 case BINUNICODE:
3703 if (load_binunicode(self) < 0)
3704 break;
3705 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003706#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003707
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708 case EMPTY_TUPLE:
3709 if (load_empty_tuple(self) < 0)
3710 break;
3711 continue;
3712
3713 case TUPLE:
3714 if (load_tuple(self) < 0)
3715 break;
3716 continue;
3717
3718 case EMPTY_LIST:
3719 if (load_empty_list(self) < 0)
3720 break;
3721 continue;
3722
3723 case LIST:
3724 if (load_list(self) < 0)
3725 break;
3726 continue;
3727
3728 case EMPTY_DICT:
3729 if (load_empty_dict(self) < 0)
3730 break;
3731 continue;
3732
3733 case DICT:
3734 if (load_dict(self) < 0)
3735 break;
3736 continue;
3737
3738 case OBJ:
3739 if (load_obj(self) < 0)
3740 break;
3741 continue;
3742
3743 case INST:
3744 if (load_inst(self) < 0)
3745 break;
3746 continue;
3747
3748 case GLOBAL:
3749 if (load_global(self) < 0)
3750 break;
3751 continue;
3752
3753 case APPEND:
3754 if (load_append(self) < 0)
3755 break;
3756 continue;
3757
3758 case APPENDS:
3759 if (load_appends(self) < 0)
3760 break;
3761 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003762
Guido van Rossum60456fd1997-04-09 17:36:32 +00003763 case BUILD:
3764 if (load_build(self) < 0)
3765 break;
3766 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003767
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768 case DUP:
3769 if (load_dup(self) < 0)
3770 break;
3771 continue;
3772
3773 case BINGET:
3774 if (load_binget(self) < 0)
3775 break;
3776 continue;
3777
3778 case LONG_BINGET:
3779 if (load_long_binget(self) < 0)
3780 break;
3781 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003782
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783 case GET:
3784 if (load_get(self) < 0)
3785 break;
3786 continue;
3787
3788 case MARK:
3789 if (load_mark(self) < 0)
3790 break;
3791 continue;
3792
3793 case BINPUT:
3794 if (load_binput(self) < 0)
3795 break;
3796 continue;
3797
3798 case LONG_BINPUT:
3799 if (load_long_binput(self) < 0)
3800 break;
3801 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003802
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803 case PUT:
3804 if (load_put(self) < 0)
3805 break;
3806 continue;
3807
3808 case POP:
3809 if (load_pop(self) < 0)
3810 break;
3811 continue;
3812
3813 case POP_MARK:
3814 if (load_pop_mark(self) < 0)
3815 break;
3816 continue;
3817
3818 case SETITEM:
3819 if (load_setitem(self) < 0)
3820 break;
3821 continue;
3822
3823 case SETITEMS:
3824 if (load_setitems(self) < 0)
3825 break;
3826 continue;
3827
3828 case STOP:
3829 break;
3830
3831 case PERSID:
3832 if (load_persid(self) < 0)
3833 break;
3834 continue;
3835
3836 case BINPERSID:
3837 if (load_binpersid(self) < 0)
3838 break;
3839 continue;
3840
3841 case REDUCE:
3842 if (load_reduce(self) < 0)
3843 break;
3844 continue;
3845
Tim Peters84e87f32001-03-17 04:50:51 +00003846 default:
3847 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003849 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003850 }
3851
3852 break;
3853 }
3854
Guido van Rossum053b8df1998-11-25 16:18:00 +00003855 if ((err = PyErr_Occurred())) {
3856 if (err == PyExc_EOFError) {
3857 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00003858 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003859 return NULL;
3860 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003861
Tim Peters84e87f32001-03-17 04:50:51 +00003862 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003864}
Tim Peters84e87f32001-03-17 04:50:51 +00003865
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003867/* No-load functions to support noload, which is used to
3868 find persistent references. */
3869
3870static int
3871noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003872 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003873
3874 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003875 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003876}
3877
3878
3879static int
3880noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003881 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003882 char *s;
3883
3884 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003885 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003886 if ((*self->readline_func)(self, &s) < 0) return -1;
3887 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003888 PDATA_APPEND(self->stack, Py_None,-1);
3889 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003890}
3891
3892static int
3893noload_global(Unpicklerobject *self) {
3894 char *s;
3895
3896 if ((*self->readline_func)(self, &s) < 0) return -1;
3897 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003898 PDATA_APPEND(self->stack, Py_None,-1);
3899 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003900}
3901
3902static int
3903noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003904
Guido van Rossum053b8df1998-11-25 16:18:00 +00003905 if (self->stack->length < 2) return stackUnderflow();
3906 Pdata_clear(self->stack, self->stack->length-2);
3907 PDATA_APPEND(self->stack, Py_None,-1);
3908 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003909}
3910
3911static int
3912noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003913
Guido van Rossum053b8df1998-11-25 16:18:00 +00003914 if (self->stack->length < 1) return stackUnderflow();
3915 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003916 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003917}
3918
3919
3920static PyObject *
3921noload(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003922 PyObject *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003923 char *s;
3924
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003925 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003926 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003927
3928 while (1) {
3929 if ((*self->read_func)(self, &s, 1) < 0)
3930 break;
3931
3932 switch (s[0]) {
3933 case NONE:
3934 if (load_none(self) < 0)
3935 break;
3936 continue;
3937
3938 case BININT:
3939 if (load_binint(self) < 0)
3940 break;
3941 continue;
3942
3943 case BININT1:
3944 if (load_binint1(self) < 0)
3945 break;
3946 continue;
3947
3948 case BININT2:
3949 if (load_binint2(self) < 0)
3950 break;
3951 continue;
3952
3953 case INT:
3954 if (load_int(self) < 0)
3955 break;
3956 continue;
3957
3958 case LONG:
3959 if (load_long(self) < 0)
3960 break;
3961 continue;
3962
3963 case FLOAT:
3964 if (load_float(self) < 0)
3965 break;
3966 continue;
3967
3968 case BINFLOAT:
3969 if (load_binfloat(self) < 0)
3970 break;
3971 continue;
3972
3973 case BINSTRING:
3974 if (load_binstring(self) < 0)
3975 break;
3976 continue;
3977
3978 case SHORT_BINSTRING:
3979 if (load_short_binstring(self) < 0)
3980 break;
3981 continue;
3982
3983 case STRING:
3984 if (load_string(self) < 0)
3985 break;
3986 continue;
3987
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003988#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003989 case UNICODE:
3990 if (load_unicode(self) < 0)
3991 break;
3992 continue;
3993
3994 case BINUNICODE:
3995 if (load_binunicode(self) < 0)
3996 break;
3997 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003998#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003999
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004000 case EMPTY_TUPLE:
4001 if (load_empty_tuple(self) < 0)
4002 break;
4003 continue;
4004
4005 case TUPLE:
4006 if (load_tuple(self) < 0)
4007 break;
4008 continue;
4009
4010 case EMPTY_LIST:
4011 if (load_empty_list(self) < 0)
4012 break;
4013 continue;
4014
4015 case LIST:
4016 if (load_list(self) < 0)
4017 break;
4018 continue;
4019
4020 case EMPTY_DICT:
4021 if (load_empty_dict(self) < 0)
4022 break;
4023 continue;
4024
4025 case DICT:
4026 if (load_dict(self) < 0)
4027 break;
4028 continue;
4029
4030 case OBJ:
4031 if (noload_obj(self) < 0)
4032 break;
4033 continue;
4034
4035 case INST:
4036 if (noload_inst(self) < 0)
4037 break;
4038 continue;
4039
4040 case GLOBAL:
4041 if (noload_global(self) < 0)
4042 break;
4043 continue;
4044
4045 case APPEND:
4046 if (load_append(self) < 0)
4047 break;
4048 continue;
4049
4050 case APPENDS:
4051 if (load_appends(self) < 0)
4052 break;
4053 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004054
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004055 case BUILD:
4056 if (noload_build(self) < 0)
4057 break;
4058 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004059
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004060 case DUP:
4061 if (load_dup(self) < 0)
4062 break;
4063 continue;
4064
4065 case BINGET:
4066 if (load_binget(self) < 0)
4067 break;
4068 continue;
4069
4070 case LONG_BINGET:
4071 if (load_long_binget(self) < 0)
4072 break;
4073 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004074
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004075 case GET:
4076 if (load_get(self) < 0)
4077 break;
4078 continue;
4079
4080 case MARK:
4081 if (load_mark(self) < 0)
4082 break;
4083 continue;
4084
4085 case BINPUT:
4086 if (load_binput(self) < 0)
4087 break;
4088 continue;
4089
4090 case LONG_BINPUT:
4091 if (load_long_binput(self) < 0)
4092 break;
4093 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004094
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004095 case PUT:
4096 if (load_put(self) < 0)
4097 break;
4098 continue;
4099
4100 case POP:
4101 if (load_pop(self) < 0)
4102 break;
4103 continue;
4104
4105 case POP_MARK:
4106 if (load_pop_mark(self) < 0)
4107 break;
4108 continue;
4109
4110 case SETITEM:
4111 if (load_setitem(self) < 0)
4112 break;
4113 continue;
4114
4115 case SETITEMS:
4116 if (load_setitems(self) < 0)
4117 break;
4118 continue;
4119
4120 case STOP:
4121 break;
4122
4123 case PERSID:
4124 if (load_persid(self) < 0)
4125 break;
4126 continue;
4127
4128 case BINPERSID:
4129 if (load_binpersid(self) < 0)
4130 break;
4131 continue;
4132
4133 case REDUCE:
4134 if (noload_reduce(self) < 0)
4135 break;
4136 continue;
4137
Tim Peters84e87f32001-03-17 04:50:51 +00004138 default:
4139 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004140 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004141 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004142 }
4143
4144 break;
4145 }
4146
Guido van Rossum053b8df1998-11-25 16:18:00 +00004147 if ((err = PyErr_Occurred())) {
4148 if (err == PyExc_EOFError) {
4149 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00004150 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00004151 return NULL;
4152 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004153
Tim Peters84e87f32001-03-17 04:50:51 +00004154 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004155 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156}
Tim Peters84e87f32001-03-17 04:50:51 +00004157
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004158
Guido van Rossum60456fd1997-04-09 17:36:32 +00004159static PyObject *
4160Unpickler_load(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004161 UNLESS (PyArg_ParseTuple(args, ":load"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004162 return NULL;
4163
4164 return load(self);
4165}
4166
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004167static PyObject *
4168Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004169 UNLESS (PyArg_ParseTuple(args, ":noload"))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004170 return NULL;
4171
4172 return noload(self);
4173}
4174
Guido van Rossum60456fd1997-04-09 17:36:32 +00004175
4176static struct PyMethodDef Unpickler_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004177 {"load", (PyCFunction)Unpickler_load, 1,
4178 "load() -- Load a pickle"
4179 },
4180 {"noload", (PyCFunction)Unpickler_noload, 1,
4181 "noload() -- not load a pickle, but go through most of the motions\n"
4182 "\n"
4183 "This function can be used to read past a pickle without instantiating\n"
4184 "any objects or importing any modules. It can also be used to find all\n"
4185 "persistent references without instantiating any objects or importing\n"
4186 "any modules.\n"
4187 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004188 {NULL, NULL} /* sentinel */
4189};
4190
4191
4192static Unpicklerobject *
4193newUnpicklerobject(PyObject *f) {
4194 Unpicklerobject *self;
4195
Guido van Rossumb18618d2000-05-03 23:44:39 +00004196 UNLESS (self = PyObject_New(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197 return NULL;
4198
4199 self->file = NULL;
4200 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004201 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004202 self->pers_func = NULL;
4203 self->last_string = NULL;
4204 self->marks = NULL;
4205 self->num_marks = 0;
4206 self->marks_size = 0;
4207 self->buf_size = 0;
4208 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00004209 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00004210 self->safe_constructors = NULL;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004211 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004212
Tim Peters84e87f32001-03-17 04:50:51 +00004213 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00004214 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004215
4216 Py_INCREF(f);
4217 self->file = f;
4218
4219 /* Set read, readline based on type of f */
4220 if (PyFile_Check(f)) {
4221 self->fp = PyFile_AsFile(f);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004222 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00004223 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
4224 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004225 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004226 self->read_func = read_file;
4227 self->readline_func = readline_file;
4228 }
4229 else if (PycStringIO_InputCheck(f)) {
4230 self->fp = NULL;
4231 self->read_func = read_cStringIO;
4232 self->readline_func = readline_cStringIO;
4233 }
4234 else {
4235
4236 self->fp = NULL;
4237 self->read_func = read_other;
4238 self->readline_func = readline_other;
4239
Guido van Rossum053b8df1998-11-25 16:18:00 +00004240 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004241 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004242 PyErr_Clear();
4243 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
4244 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00004245 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246 }
4247 }
4248
Guido van Rossum053b8df1998-11-25 16:18:00 +00004249 if (PyEval_GetRestricted()) {
4250 /* Restricted execution, get private tables */
4251 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004252
Guido van Rossum053b8df1998-11-25 16:18:00 +00004253 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
4254 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
4255 Py_DECREF(m);
4256 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004257 }
4258 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004259 self->safe_constructors=safe_constructors;
4260 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004261 }
4262
Guido van Rossum60456fd1997-04-09 17:36:32 +00004263 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
4265err:
4266 Py_DECREF((PyObject *)self);
4267 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004268}
4269
4270
4271static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004272get_Unpickler(PyObject *self, PyObject *args) {
4273 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004274
Guido van Rossum43713e52000-02-29 13:59:29 +00004275 UNLESS (PyArg_ParseTuple(args, "O:Unpickler", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276 return NULL;
4277 return (PyObject *)newUnpicklerobject(file);
4278}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004279
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004280
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281static void
4282Unpickler_dealloc(Unpicklerobject *self) {
4283 Py_XDECREF(self->readline);
4284 Py_XDECREF(self->read);
4285 Py_XDECREF(self->file);
4286 Py_XDECREF(self->memo);
4287 Py_XDECREF(self->stack);
4288 Py_XDECREF(self->pers_func);
4289 Py_XDECREF(self->arg);
4290 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004291 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004292
Guido van Rossum60456fd1997-04-09 17:36:32 +00004293 if (self->marks) {
4294 free(self->marks);
4295 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004296
Guido van Rossum60456fd1997-04-09 17:36:32 +00004297 if (self->buf_size) {
4298 free(self->buf);
4299 }
Tim Peters84e87f32001-03-17 04:50:51 +00004300
Guido van Rossumb18618d2000-05-03 23:44:39 +00004301 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004302}
4303
4304
4305static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306Unpickler_getattr(Unpicklerobject *self, char *name) {
4307 if (!strcmp(name, "persistent_load")) {
4308 if (!self->pers_func) {
4309 PyErr_SetString(PyExc_AttributeError, name);
4310 return NULL;
4311 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004312
Guido van Rossum60456fd1997-04-09 17:36:32 +00004313 Py_INCREF(self->pers_func);
4314 return self->pers_func;
4315 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004316
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004317 if (!strcmp(name, "find_global")) {
4318 if (!self->find_class) {
4319 PyErr_SetString(PyExc_AttributeError, name);
4320 return NULL;
4321 }
4322
4323 Py_INCREF(self->find_class);
4324 return self->find_class;
4325 }
4326
Guido van Rossum60456fd1997-04-09 17:36:32 +00004327 if (!strcmp(name, "memo")) {
4328 if (!self->memo) {
4329 PyErr_SetString(PyExc_AttributeError, name);
4330 return NULL;
4331 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004332
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333 Py_INCREF(self->memo);
4334 return self->memo;
4335 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004336
Guido van Rossum60456fd1997-04-09 17:36:32 +00004337 if (!strcmp(name, "UnpicklingError")) {
4338 Py_INCREF(UnpicklingError);
4339 return UnpicklingError;
4340 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004341
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
4343}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004344
Guido van Rossum60456fd1997-04-09 17:36:32 +00004345
4346static int
4347Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004348
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004349 if (!strcmp(name, "persistent_load")) {
4350 Py_XDECREF(self->pers_func);
4351 self->pers_func = value;
4352 Py_XINCREF(value);
4353 return 0;
4354 }
4355
4356 if (!strcmp(name, "find_global")) {
4357 Py_XDECREF(self->find_class);
4358 self->find_class = value;
4359 Py_XINCREF(value);
4360 return 0;
4361 }
4362
Guido van Rossum053b8df1998-11-25 16:18:00 +00004363 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004364 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00004365 "attribute deletion is not supported");
4366 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004367 }
4368
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004369 if (strcmp(name, "memo") == 0) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004370 if (!PyDict_Check(value)) {
4371 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4372 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004373 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004374 Py_XDECREF(self->memo);
4375 self->memo = value;
4376 Py_INCREF(value);
4377 return 0;
4378 }
4379
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380 PyErr_SetString(PyExc_AttributeError, name);
4381 return -1;
4382}
4383
4384
4385static PyObject *
4386cpm_dump(PyObject *self, PyObject *args) {
4387 PyObject *ob, *file, *res = NULL;
4388 Picklerobject *pickler = 0;
4389 int bin = 0;
4390
Guido van Rossum053b8df1998-11-25 16:18:00 +00004391 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004392 goto finally;
4393
Guido van Rossum053b8df1998-11-25 16:18:00 +00004394 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004395 goto finally;
4396
4397 if (dump(pickler, ob) < 0)
4398 goto finally;
4399
4400 Py_INCREF(Py_None);
4401 res = Py_None;
4402
4403finally:
4404 Py_XDECREF(pickler);
4405
4406 return res;
4407}
4408
4409
4410static PyObject *
4411cpm_dumps(PyObject *self, PyObject *args) {
4412 PyObject *ob, *file = 0, *res = NULL;
4413 Picklerobject *pickler = 0;
4414 int bin = 0;
4415
Guido van Rossum43713e52000-02-29 13:59:29 +00004416 UNLESS (PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004417 goto finally;
4418
Guido van Rossum053b8df1998-11-25 16:18:00 +00004419 UNLESS (file = PycStringIO->NewOutput(128))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004420 goto finally;
4421
Guido van Rossum053b8df1998-11-25 16:18:00 +00004422 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004423 goto finally;
4424
4425 if (dump(pickler, ob) < 0)
4426 goto finally;
4427
4428 res = PycStringIO->cgetvalue(file);
4429
4430finally:
4431 Py_XDECREF(pickler);
4432 Py_XDECREF(file);
4433
4434 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004435}
4436
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004437
4438static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004439cpm_load(PyObject *self, PyObject *args) {
4440 Unpicklerobject *unpickler = 0;
4441 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004442
Guido van Rossum43713e52000-02-29 13:59:29 +00004443 UNLESS (PyArg_ParseTuple(args, "O:load", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004445
Guido van Rossum053b8df1998-11-25 16:18:00 +00004446 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004448
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004450
Guido van Rossum60456fd1997-04-09 17:36:32 +00004451finally:
4452 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004453
Guido van Rossum60456fd1997-04-09 17:36:32 +00004454 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004455}
4456
4457
4458static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004459cpm_loads(PyObject *self, PyObject *args) {
4460 PyObject *ob, *file = 0, *res = NULL;
4461 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004462
Guido van Rossum43713e52000-02-29 13:59:29 +00004463 UNLESS (PyArg_ParseTuple(args, "S:loads", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004465
Guido van Rossum053b8df1998-11-25 16:18:00 +00004466 UNLESS (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004467 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004468
Guido van Rossum053b8df1998-11-25 16:18:00 +00004469 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004471
Guido van Rossum60456fd1997-04-09 17:36:32 +00004472 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004473
Guido van Rossum60456fd1997-04-09 17:36:32 +00004474finally:
4475 Py_XDECREF(file);
4476 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004477
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004479}
4480
4481
Tim Peters84e87f32001-03-17 04:50:51 +00004482static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004483"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004484
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004485static PyTypeObject Unpicklertype = {
4486 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004487 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004488 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004489 sizeof(Unpicklerobject), /*tp_basicsize*/
4490 0, /*tp_itemsize*/
4491 /* methods */
4492 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4493 (printfunc)0, /*tp_print*/
4494 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4495 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4496 (cmpfunc)0, /*tp_compare*/
4497 (reprfunc)0, /*tp_repr*/
4498 0, /*tp_as_number*/
4499 0, /*tp_as_sequence*/
4500 0, /*tp_as_mapping*/
4501 (hashfunc)0, /*tp_hash*/
4502 (ternaryfunc)0, /*tp_call*/
4503 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004504
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505 /* Space for future expansion */
4506 0L,0L,0L,0L,
4507 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004508};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004509
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510static struct PyMethodDef cPickle_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004511 {"dump", (PyCFunction)cpm_dump, 1,
4512 "dump(object, file, [binary]) --"
4513 "Write an object in pickle format to the given file\n"
4514 "\n"
4515 "If the optional argument, binary, is provided and is true, then the\n"
4516 "pickle will be written in binary format, which is more space and\n"
4517 "computationally efficient. \n"
4518 },
4519 {"dumps", (PyCFunction)cpm_dumps, 1,
4520 "dumps(object, [binary]) --"
4521 "Return a string containing an object in pickle format\n"
4522 "\n"
4523 "If the optional argument, binary, is provided and is true, then the\n"
4524 "pickle will be written in binary format, which is more space and\n"
4525 "computationally efficient. \n"
4526 },
4527 {"load", (PyCFunction)cpm_load, 1,
4528 "load(file) -- Load a pickle from the given file"},
4529 {"loads", (PyCFunction)cpm_loads, 1,
4530 "loads(string) -- Load a pickle from the given string"},
4531 {"Pickler", (PyCFunction)get_Pickler, 1,
4532 "Pickler(file, [binary]) -- Create a pickler\n"
4533 "\n"
4534 "If the optional argument, binary, is provided and is true, then\n"
4535 "pickles will be written in binary format, which is more space and\n"
4536 "computationally efficient. \n"
4537 },
4538 {"Unpickler", (PyCFunction)get_Unpickler, 1,
4539 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004540 { NULL, NULL }
4541};
4542
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543static int
Guido van Rossumebba4202000-09-07 14:35:37 +00004544init_stuff(PyObject *module_dict) {
Fred Drake2c7a6852001-07-17 18:34:03 +00004545 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004547#define INIT_STR(S) UNLESS(S ## _str=PyString_InternFromString(#S)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
4549 INIT_STR(__class__);
4550 INIT_STR(__getinitargs__);
4551 INIT_STR(__dict__);
4552 INIT_STR(__getstate__);
4553 INIT_STR(__setstate__);
4554 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004555 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556 INIT_STR(__reduce__);
4557 INIT_STR(write);
4558 INIT_STR(__safe_for_unpickling__);
4559 INIT_STR(append);
4560 INIT_STR(read);
4561 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004562 INIT_STR(copy_reg);
4563 INIT_STR(dispatch_table);
4564 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004565 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Guido van Rossum053b8df1998-11-25 16:18:00 +00004567 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004568 return -1;
4569
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004570 /* These next few are special because we want to use different
4571 ones in restricted mode. */
4572
Guido van Rossum053b8df1998-11-25 16:18:00 +00004573 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004574 return -1;
4575
Guido van Rossum053b8df1998-11-25 16:18:00 +00004576 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004577 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578 return -1;
4579
4580 Py_DECREF(copy_reg);
4581
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004582 /* Down to here ********************************** */
4583
Guido van Rossum053b8df1998-11-25 16:18:00 +00004584 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004585 return -1;
4586
Guido van Rossumc03158b1999-06-09 15:23:31 +00004587 /* Ugh */
4588 UNLESS (t=PyImport_ImportModule("__builtin__")) return -1;
4589 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4590 return -1;
4591
4592 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004593 UNLESS (r=PyRun_String(
4594 "def __init__(self, *args): self.args=args\n\n"
4595 "def __str__(self):\n"
4596 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4597 Py_file_input,
4598 module_dict, t) ) return -1;
4599 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004600
4601 UNLESS (PickleError = PyErr_NewException("cPickle.PickleError", NULL, t))
4602 return -1;
4603
4604 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004605
Tim Peters84e87f32001-03-17 04:50:51 +00004606
4607 UNLESS (PicklingError = PyErr_NewException("cPickle.PicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004608 PickleError, NULL))
4609 return -1;
4610
4611 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004612 UNLESS (r=PyRun_String(
4613 "def __init__(self, *args): self.args=args\n\n"
4614 "def __str__(self):\n"
4615 " a=self.args\n"
4616 " a=a and type(a[0]) or '(what)'\n"
4617 " return 'Cannot pickle %s objects' % a\n"
4618 , Py_file_input,
4619 module_dict, t) ) return -1;
4620 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004621
4622 UNLESS (UnpickleableError = PyErr_NewException(
4623 "cPickle.UnpickleableError", PicklingError, t))
4624 return -1;
4625
4626 Py_DECREF(t);
4627
Tim Peters84e87f32001-03-17 04:50:51 +00004628 UNLESS (UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004629 PickleError, NULL))
4630 return -1;
4631
Tim Peters84e87f32001-03-17 04:50:51 +00004632 if (PyDict_SetItemString(module_dict, "PickleError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004633 PickleError) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004634 return -1;
4635
Tim Peters84e87f32001-03-17 04:50:51 +00004636 if (PyDict_SetItemString(module_dict, "PicklingError",
Guido van Rossum60456fd1997-04-09 17:36:32 +00004637 PicklingError) < 0)
4638 return -1;
4639
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4641 UnpicklingError) < 0)
4642 return -1;
4643
Guido van Rossumc03158b1999-06-09 15:23:31 +00004644 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4645 UnpickleableError) < 0)
4646 return -1;
4647
Guido van Rossum053b8df1998-11-25 16:18:00 +00004648 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4649 return -1;
4650
4651 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4652 BadPickleGet) < 0)
4653 return -1;
4654
Guido van Rossum60456fd1997-04-09 17:36:32 +00004655 PycString_IMPORT;
Tim Peters84e87f32001-03-17 04:50:51 +00004656
Guido van Rossum60456fd1997-04-09 17:36:32 +00004657 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004658}
4659
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004660#ifndef DL_EXPORT /* declarations for DLL import/export */
4661#define DL_EXPORT(RTYPE) RTYPE
4662#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004663DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +00004664initcPickle(void) {
Guido van Rossumebba4202000-09-07 14:35:37 +00004665 PyObject *m, *d, *di, *v, *k;
4666 int i;
Guido van Rossum2f80d961999-07-13 15:18:58 +00004667 char *rev="1.71";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004668 PyObject *format_version;
4669 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004670
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004671 Picklertype.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00004672 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4673 Picklertype.tp_setattro = PyObject_GenericSetAttr;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004674 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004675 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004676
Tim Peters84e87f32001-03-17 04:50:51 +00004677 /* Initialize some pieces. We need to do this before module creation,
4678 so we're forced to use a temporary dictionary. :(
Guido van Rossumebba4202000-09-07 14:35:37 +00004679 */
4680 di=PyDict_New();
4681 if (!di) return;
4682 if (init_stuff(di) < 0) return;
4683
Guido van Rossum60456fd1997-04-09 17:36:32 +00004684 /* Create the module and add the functions */
4685 m = Py_InitModule4("cPickle", cPickle_methods,
4686 cPickle_module_documentation,
4687 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004688
Guido van Rossum60456fd1997-04-09 17:36:32 +00004689 /* Add some symbolic constants to the module */
4690 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004691 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004692 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004693
Guido van Rossumebba4202000-09-07 14:35:37 +00004694 /* Copy data from di. Waaa. */
4695 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4696 if (PyObject_SetItem(d, k, v) < 0) {
4697 Py_DECREF(di);
4698 return;
4699 }
4700 }
4701 Py_DECREF(di);
4702
Guido van Rossum60456fd1997-04-09 17:36:32 +00004703 format_version = PyString_FromString("1.3");
4704 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004705
Guido van Rossum60456fd1997-04-09 17:36:32 +00004706 PyDict_SetItemString(d, "format_version", format_version);
4707 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004708 Py_XDECREF(format_version);
4709 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004710}