blob: 4b29c27284b937accf6e9b37cf2dcf8a948b8888 [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[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00002262 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
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 },
Neal Norwitzb0493252002-03-31 14:44:22 +00002266 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002267 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002268 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002269 "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
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003846 case '\0':
3847 /* end of file */
3848 PyErr_SetNone(PyExc_EOFError);
3849 break;
3850
Tim Peters84e87f32001-03-17 04:50:51 +00003851 default:
3852 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003854 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855 }
3856
3857 break;
3858 }
3859
Guido van Rossum053b8df1998-11-25 16:18:00 +00003860 if ((err = PyErr_Occurred())) {
3861 if (err == PyExc_EOFError) {
3862 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00003863 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003864 return NULL;
3865 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866
Tim Peters84e87f32001-03-17 04:50:51 +00003867 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003869}
Tim Peters84e87f32001-03-17 04:50:51 +00003870
Guido van Rossum60456fd1997-04-09 17:36:32 +00003871
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003872/* No-load functions to support noload, which is used to
3873 find persistent references. */
3874
3875static int
3876noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003877 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003878
3879 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003880 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003881}
3882
3883
3884static int
3885noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003886 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003887 char *s;
3888
3889 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003890 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003891 if ((*self->readline_func)(self, &s) < 0) return -1;
3892 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003893 PDATA_APPEND(self->stack, Py_None,-1);
3894 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003895}
3896
3897static int
3898noload_global(Unpicklerobject *self) {
3899 char *s;
3900
3901 if ((*self->readline_func)(self, &s) < 0) return -1;
3902 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003903 PDATA_APPEND(self->stack, Py_None,-1);
3904 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003905}
3906
3907static int
3908noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003909
Guido van Rossum053b8df1998-11-25 16:18:00 +00003910 if (self->stack->length < 2) return stackUnderflow();
3911 Pdata_clear(self->stack, self->stack->length-2);
3912 PDATA_APPEND(self->stack, Py_None,-1);
3913 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003914}
3915
3916static int
3917noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003918
Guido van Rossum053b8df1998-11-25 16:18:00 +00003919 if (self->stack->length < 1) return stackUnderflow();
3920 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003921 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003922}
3923
3924
3925static PyObject *
3926noload(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003927 PyObject *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003928 char *s;
3929
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003930 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003931 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003932
3933 while (1) {
3934 if ((*self->read_func)(self, &s, 1) < 0)
3935 break;
3936
3937 switch (s[0]) {
3938 case NONE:
3939 if (load_none(self) < 0)
3940 break;
3941 continue;
3942
3943 case BININT:
3944 if (load_binint(self) < 0)
3945 break;
3946 continue;
3947
3948 case BININT1:
3949 if (load_binint1(self) < 0)
3950 break;
3951 continue;
3952
3953 case BININT2:
3954 if (load_binint2(self) < 0)
3955 break;
3956 continue;
3957
3958 case INT:
3959 if (load_int(self) < 0)
3960 break;
3961 continue;
3962
3963 case LONG:
3964 if (load_long(self) < 0)
3965 break;
3966 continue;
3967
3968 case FLOAT:
3969 if (load_float(self) < 0)
3970 break;
3971 continue;
3972
3973 case BINFLOAT:
3974 if (load_binfloat(self) < 0)
3975 break;
3976 continue;
3977
3978 case BINSTRING:
3979 if (load_binstring(self) < 0)
3980 break;
3981 continue;
3982
3983 case SHORT_BINSTRING:
3984 if (load_short_binstring(self) < 0)
3985 break;
3986 continue;
3987
3988 case STRING:
3989 if (load_string(self) < 0)
3990 break;
3991 continue;
3992
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003993#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003994 case UNICODE:
3995 if (load_unicode(self) < 0)
3996 break;
3997 continue;
3998
3999 case BINUNICODE:
4000 if (load_binunicode(self) < 0)
4001 break;
4002 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004003#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004004
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004005 case EMPTY_TUPLE:
4006 if (load_empty_tuple(self) < 0)
4007 break;
4008 continue;
4009
4010 case TUPLE:
4011 if (load_tuple(self) < 0)
4012 break;
4013 continue;
4014
4015 case EMPTY_LIST:
4016 if (load_empty_list(self) < 0)
4017 break;
4018 continue;
4019
4020 case LIST:
4021 if (load_list(self) < 0)
4022 break;
4023 continue;
4024
4025 case EMPTY_DICT:
4026 if (load_empty_dict(self) < 0)
4027 break;
4028 continue;
4029
4030 case DICT:
4031 if (load_dict(self) < 0)
4032 break;
4033 continue;
4034
4035 case OBJ:
4036 if (noload_obj(self) < 0)
4037 break;
4038 continue;
4039
4040 case INST:
4041 if (noload_inst(self) < 0)
4042 break;
4043 continue;
4044
4045 case GLOBAL:
4046 if (noload_global(self) < 0)
4047 break;
4048 continue;
4049
4050 case APPEND:
4051 if (load_append(self) < 0)
4052 break;
4053 continue;
4054
4055 case APPENDS:
4056 if (load_appends(self) < 0)
4057 break;
4058 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004059
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004060 case BUILD:
4061 if (noload_build(self) < 0)
4062 break;
4063 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004064
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004065 case DUP:
4066 if (load_dup(self) < 0)
4067 break;
4068 continue;
4069
4070 case BINGET:
4071 if (load_binget(self) < 0)
4072 break;
4073 continue;
4074
4075 case LONG_BINGET:
4076 if (load_long_binget(self) < 0)
4077 break;
4078 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004079
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004080 case GET:
4081 if (load_get(self) < 0)
4082 break;
4083 continue;
4084
4085 case MARK:
4086 if (load_mark(self) < 0)
4087 break;
4088 continue;
4089
4090 case BINPUT:
4091 if (load_binput(self) < 0)
4092 break;
4093 continue;
4094
4095 case LONG_BINPUT:
4096 if (load_long_binput(self) < 0)
4097 break;
4098 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004099
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004100 case PUT:
4101 if (load_put(self) < 0)
4102 break;
4103 continue;
4104
4105 case POP:
4106 if (load_pop(self) < 0)
4107 break;
4108 continue;
4109
4110 case POP_MARK:
4111 if (load_pop_mark(self) < 0)
4112 break;
4113 continue;
4114
4115 case SETITEM:
4116 if (load_setitem(self) < 0)
4117 break;
4118 continue;
4119
4120 case SETITEMS:
4121 if (load_setitems(self) < 0)
4122 break;
4123 continue;
4124
4125 case STOP:
4126 break;
4127
4128 case PERSID:
4129 if (load_persid(self) < 0)
4130 break;
4131 continue;
4132
4133 case BINPERSID:
4134 if (load_binpersid(self) < 0)
4135 break;
4136 continue;
4137
4138 case REDUCE:
4139 if (noload_reduce(self) < 0)
4140 break;
4141 continue;
4142
Tim Peters84e87f32001-03-17 04:50:51 +00004143 default:
4144 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004145 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004146 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004147 }
4148
4149 break;
4150 }
4151
Guido van Rossum053b8df1998-11-25 16:18:00 +00004152 if ((err = PyErr_Occurred())) {
4153 if (err == PyExc_EOFError) {
4154 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00004155 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00004156 return NULL;
4157 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004158
Tim Peters84e87f32001-03-17 04:50:51 +00004159 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004160 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161}
Tim Peters84e87f32001-03-17 04:50:51 +00004162
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004163
Guido van Rossum60456fd1997-04-09 17:36:32 +00004164static PyObject *
4165Unpickler_load(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004166 UNLESS (PyArg_ParseTuple(args, ":load"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167 return NULL;
4168
4169 return load(self);
4170}
4171
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004172static PyObject *
4173Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004174 UNLESS (PyArg_ParseTuple(args, ":noload"))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004175 return NULL;
4176
4177 return noload(self);
4178}
4179
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180
4181static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004182 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004183 "load() -- Load a pickle"
4184 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004185 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004186 "noload() -- not load a pickle, but go through most of the motions\n"
4187 "\n"
4188 "This function can be used to read past a pickle without instantiating\n"
4189 "any objects or importing any modules. It can also be used to find all\n"
4190 "persistent references without instantiating any objects or importing\n"
4191 "any modules.\n"
4192 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193 {NULL, NULL} /* sentinel */
4194};
4195
4196
4197static Unpicklerobject *
4198newUnpicklerobject(PyObject *f) {
4199 Unpicklerobject *self;
4200
Guido van Rossumb18618d2000-05-03 23:44:39 +00004201 UNLESS (self = PyObject_New(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004202 return NULL;
4203
4204 self->file = NULL;
4205 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004206 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004207 self->pers_func = NULL;
4208 self->last_string = NULL;
4209 self->marks = NULL;
4210 self->num_marks = 0;
4211 self->marks_size = 0;
4212 self->buf_size = 0;
4213 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00004214 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00004215 self->safe_constructors = NULL;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004216 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004217
Tim Peters84e87f32001-03-17 04:50:51 +00004218 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00004219 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220
4221 Py_INCREF(f);
4222 self->file = f;
4223
4224 /* Set read, readline based on type of f */
4225 if (PyFile_Check(f)) {
4226 self->fp = PyFile_AsFile(f);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004227 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00004228 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
4229 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004230 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004231 self->read_func = read_file;
4232 self->readline_func = readline_file;
4233 }
4234 else if (PycStringIO_InputCheck(f)) {
4235 self->fp = NULL;
4236 self->read_func = read_cStringIO;
4237 self->readline_func = readline_cStringIO;
4238 }
4239 else {
4240
4241 self->fp = NULL;
4242 self->read_func = read_other;
4243 self->readline_func = readline_other;
4244
Guido van Rossum053b8df1998-11-25 16:18:00 +00004245 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004246 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247 PyErr_Clear();
4248 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
4249 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00004250 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004251 }
4252 }
4253
Guido van Rossum053b8df1998-11-25 16:18:00 +00004254 if (PyEval_GetRestricted()) {
4255 /* Restricted execution, get private tables */
4256 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004257
Guido van Rossum053b8df1998-11-25 16:18:00 +00004258 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
4259 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
4260 Py_DECREF(m);
4261 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004262 }
4263 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004264 self->safe_constructors=safe_constructors;
4265 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004266 }
4267
Guido van Rossum60456fd1997-04-09 17:36:32 +00004268 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
4270err:
4271 Py_DECREF((PyObject *)self);
4272 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004273}
4274
4275
4276static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277get_Unpickler(PyObject *self, PyObject *args) {
4278 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004279
Guido van Rossum43713e52000-02-29 13:59:29 +00004280 UNLESS (PyArg_ParseTuple(args, "O:Unpickler", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281 return NULL;
4282 return (PyObject *)newUnpicklerobject(file);
4283}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004284
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004285
Guido van Rossum60456fd1997-04-09 17:36:32 +00004286static void
4287Unpickler_dealloc(Unpicklerobject *self) {
4288 Py_XDECREF(self->readline);
4289 Py_XDECREF(self->read);
4290 Py_XDECREF(self->file);
4291 Py_XDECREF(self->memo);
4292 Py_XDECREF(self->stack);
4293 Py_XDECREF(self->pers_func);
4294 Py_XDECREF(self->arg);
4295 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004297
Guido van Rossum60456fd1997-04-09 17:36:32 +00004298 if (self->marks) {
4299 free(self->marks);
4300 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004301
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302 if (self->buf_size) {
4303 free(self->buf);
4304 }
Tim Peters84e87f32001-03-17 04:50:51 +00004305
Guido van Rossumb18618d2000-05-03 23:44:39 +00004306 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004307}
4308
4309
4310static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004311Unpickler_getattr(Unpicklerobject *self, char *name) {
4312 if (!strcmp(name, "persistent_load")) {
4313 if (!self->pers_func) {
4314 PyErr_SetString(PyExc_AttributeError, name);
4315 return NULL;
4316 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004317
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318 Py_INCREF(self->pers_func);
4319 return self->pers_func;
4320 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004321
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004322 if (!strcmp(name, "find_global")) {
4323 if (!self->find_class) {
4324 PyErr_SetString(PyExc_AttributeError, name);
4325 return NULL;
4326 }
4327
4328 Py_INCREF(self->find_class);
4329 return self->find_class;
4330 }
4331
Guido van Rossum60456fd1997-04-09 17:36:32 +00004332 if (!strcmp(name, "memo")) {
4333 if (!self->memo) {
4334 PyErr_SetString(PyExc_AttributeError, name);
4335 return NULL;
4336 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004337
Guido van Rossum60456fd1997-04-09 17:36:32 +00004338 Py_INCREF(self->memo);
4339 return self->memo;
4340 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004341
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342 if (!strcmp(name, "UnpicklingError")) {
4343 Py_INCREF(UnpicklingError);
4344 return UnpicklingError;
4345 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004346
Guido van Rossum60456fd1997-04-09 17:36:32 +00004347 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
4348}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004349
Guido van Rossum60456fd1997-04-09 17:36:32 +00004350
4351static int
4352Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004353
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004354 if (!strcmp(name, "persistent_load")) {
4355 Py_XDECREF(self->pers_func);
4356 self->pers_func = value;
4357 Py_XINCREF(value);
4358 return 0;
4359 }
4360
4361 if (!strcmp(name, "find_global")) {
4362 Py_XDECREF(self->find_class);
4363 self->find_class = value;
4364 Py_XINCREF(value);
4365 return 0;
4366 }
4367
Guido van Rossum053b8df1998-11-25 16:18:00 +00004368 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004369 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00004370 "attribute deletion is not supported");
4371 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004372 }
4373
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004374 if (strcmp(name, "memo") == 0) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004375 if (!PyDict_Check(value)) {
4376 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4377 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004378 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004379 Py_XDECREF(self->memo);
4380 self->memo = value;
4381 Py_INCREF(value);
4382 return 0;
4383 }
4384
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385 PyErr_SetString(PyExc_AttributeError, name);
4386 return -1;
4387}
4388
4389
4390static PyObject *
4391cpm_dump(PyObject *self, PyObject *args) {
4392 PyObject *ob, *file, *res = NULL;
4393 Picklerobject *pickler = 0;
4394 int bin = 0;
4395
Guido van Rossum053b8df1998-11-25 16:18:00 +00004396 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004397 goto finally;
4398
Guido van Rossum053b8df1998-11-25 16:18:00 +00004399 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400 goto finally;
4401
4402 if (dump(pickler, ob) < 0)
4403 goto finally;
4404
4405 Py_INCREF(Py_None);
4406 res = Py_None;
4407
4408finally:
4409 Py_XDECREF(pickler);
4410
4411 return res;
4412}
4413
4414
4415static PyObject *
4416cpm_dumps(PyObject *self, PyObject *args) {
4417 PyObject *ob, *file = 0, *res = NULL;
4418 Picklerobject *pickler = 0;
4419 int bin = 0;
4420
Guido van Rossum43713e52000-02-29 13:59:29 +00004421 UNLESS (PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004422 goto finally;
4423
Guido van Rossum053b8df1998-11-25 16:18:00 +00004424 UNLESS (file = PycStringIO->NewOutput(128))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004425 goto finally;
4426
Guido van Rossum053b8df1998-11-25 16:18:00 +00004427 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428 goto finally;
4429
4430 if (dump(pickler, ob) < 0)
4431 goto finally;
4432
4433 res = PycStringIO->cgetvalue(file);
4434
4435finally:
4436 Py_XDECREF(pickler);
4437 Py_XDECREF(file);
4438
4439 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004440}
4441
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004442
4443static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444cpm_load(PyObject *self, PyObject *args) {
4445 Unpicklerobject *unpickler = 0;
4446 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004447
Guido van Rossum43713e52000-02-29 13:59:29 +00004448 UNLESS (PyArg_ParseTuple(args, "O:load", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004450
Guido van Rossum053b8df1998-11-25 16:18:00 +00004451 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004452 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004453
Guido van Rossum60456fd1997-04-09 17:36:32 +00004454 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004455
Guido van Rossum60456fd1997-04-09 17:36:32 +00004456finally:
4457 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004458
Guido van Rossum60456fd1997-04-09 17:36:32 +00004459 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004460}
4461
4462
4463static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464cpm_loads(PyObject *self, PyObject *args) {
4465 PyObject *ob, *file = 0, *res = NULL;
4466 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004467
Guido van Rossum43713e52000-02-29 13:59:29 +00004468 UNLESS (PyArg_ParseTuple(args, "S:loads", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004470
Guido van Rossum053b8df1998-11-25 16:18:00 +00004471 UNLESS (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004472 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004473
Guido van Rossum053b8df1998-11-25 16:18:00 +00004474 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004476
Guido van Rossum60456fd1997-04-09 17:36:32 +00004477 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004478
Guido van Rossum60456fd1997-04-09 17:36:32 +00004479finally:
4480 Py_XDECREF(file);
4481 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004482
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004484}
4485
4486
Tim Peters84e87f32001-03-17 04:50:51 +00004487static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004488"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004489
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004490static PyTypeObject Unpicklertype = {
4491 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004492 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004493 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494 sizeof(Unpicklerobject), /*tp_basicsize*/
4495 0, /*tp_itemsize*/
4496 /* methods */
4497 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4498 (printfunc)0, /*tp_print*/
4499 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4500 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4501 (cmpfunc)0, /*tp_compare*/
4502 (reprfunc)0, /*tp_repr*/
4503 0, /*tp_as_number*/
4504 0, /*tp_as_sequence*/
4505 0, /*tp_as_mapping*/
4506 (hashfunc)0, /*tp_hash*/
4507 (ternaryfunc)0, /*tp_call*/
4508 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004509
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510 /* Space for future expansion */
4511 0L,0L,0L,0L,
4512 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004513};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004514
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004516 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004517 "dump(object, file, [binary]) --"
4518 "Write an object in pickle format to the given file\n"
4519 "\n"
4520 "If the optional argument, binary, is provided and is true, then the\n"
4521 "pickle will be written in binary format, which is more space and\n"
4522 "computationally efficient. \n"
4523 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004524 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004525 "dumps(object, [binary]) --"
4526 "Return a string containing an object in pickle format\n"
4527 "\n"
4528 "If the optional argument, binary, is provided and is true, then the\n"
4529 "pickle will be written in binary format, which is more space and\n"
4530 "computationally efficient. \n"
4531 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004532 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004533 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004534 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004535 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004536 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004537 "Pickler(file, [binary]) -- Create a pickler\n"
4538 "\n"
4539 "If the optional argument, binary, is provided and is true, then\n"
4540 "pickles will be written in binary format, which is more space and\n"
4541 "computationally efficient. \n"
4542 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004543 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004544 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004545 { NULL, NULL }
4546};
4547
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548static int
Guido van Rossumebba4202000-09-07 14:35:37 +00004549init_stuff(PyObject *module_dict) {
Fred Drake2c7a6852001-07-17 18:34:03 +00004550 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004552#define INIT_STR(S) UNLESS(S ## _str=PyString_InternFromString(#S)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004553
4554 INIT_STR(__class__);
4555 INIT_STR(__getinitargs__);
4556 INIT_STR(__dict__);
4557 INIT_STR(__getstate__);
4558 INIT_STR(__setstate__);
4559 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004560 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561 INIT_STR(__reduce__);
4562 INIT_STR(write);
4563 INIT_STR(__safe_for_unpickling__);
4564 INIT_STR(append);
4565 INIT_STR(read);
4566 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004567 INIT_STR(copy_reg);
4568 INIT_STR(dispatch_table);
4569 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004570 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004571
Guido van Rossum053b8df1998-11-25 16:18:00 +00004572 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004573 return -1;
4574
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004575 /* These next few are special because we want to use different
4576 ones in restricted mode. */
4577
Guido van Rossum053b8df1998-11-25 16:18:00 +00004578 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004579 return -1;
4580
Guido van Rossum053b8df1998-11-25 16:18:00 +00004581 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004582 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004583 return -1;
4584
4585 Py_DECREF(copy_reg);
4586
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004587 /* Down to here ********************************** */
4588
Guido van Rossum053b8df1998-11-25 16:18:00 +00004589 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004590 return -1;
4591
Guido van Rossumc03158b1999-06-09 15:23:31 +00004592 /* Ugh */
4593 UNLESS (t=PyImport_ImportModule("__builtin__")) return -1;
4594 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4595 return -1;
4596
4597 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004598 UNLESS (r=PyRun_String(
4599 "def __init__(self, *args): self.args=args\n\n"
4600 "def __str__(self):\n"
4601 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4602 Py_file_input,
4603 module_dict, t) ) return -1;
4604 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004605
4606 UNLESS (PickleError = PyErr_NewException("cPickle.PickleError", NULL, t))
4607 return -1;
4608
4609 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004610
Tim Peters84e87f32001-03-17 04:50:51 +00004611
4612 UNLESS (PicklingError = PyErr_NewException("cPickle.PicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004613 PickleError, NULL))
4614 return -1;
4615
4616 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004617 UNLESS (r=PyRun_String(
4618 "def __init__(self, *args): self.args=args\n\n"
4619 "def __str__(self):\n"
4620 " a=self.args\n"
4621 " a=a and type(a[0]) or '(what)'\n"
4622 " return 'Cannot pickle %s objects' % a\n"
4623 , Py_file_input,
4624 module_dict, t) ) return -1;
4625 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004626
4627 UNLESS (UnpickleableError = PyErr_NewException(
4628 "cPickle.UnpickleableError", PicklingError, t))
4629 return -1;
4630
4631 Py_DECREF(t);
4632
Tim Peters84e87f32001-03-17 04:50:51 +00004633 UNLESS (UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004634 PickleError, NULL))
4635 return -1;
4636
Tim Peters84e87f32001-03-17 04:50:51 +00004637 if (PyDict_SetItemString(module_dict, "PickleError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004638 PickleError) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004639 return -1;
4640
Tim Peters84e87f32001-03-17 04:50:51 +00004641 if (PyDict_SetItemString(module_dict, "PicklingError",
Guido van Rossum60456fd1997-04-09 17:36:32 +00004642 PicklingError) < 0)
4643 return -1;
4644
Guido van Rossum60456fd1997-04-09 17:36:32 +00004645 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4646 UnpicklingError) < 0)
4647 return -1;
4648
Guido van Rossumc03158b1999-06-09 15:23:31 +00004649 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4650 UnpickleableError) < 0)
4651 return -1;
4652
Guido van Rossum053b8df1998-11-25 16:18:00 +00004653 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4654 return -1;
4655
4656 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4657 BadPickleGet) < 0)
4658 return -1;
4659
Guido van Rossum60456fd1997-04-09 17:36:32 +00004660 PycString_IMPORT;
Tim Peters84e87f32001-03-17 04:50:51 +00004661
Guido van Rossum60456fd1997-04-09 17:36:32 +00004662 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004663}
4664
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004665#ifndef DL_EXPORT /* declarations for DLL import/export */
4666#define DL_EXPORT(RTYPE) RTYPE
4667#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004668DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +00004669initcPickle(void) {
Guido van Rossumebba4202000-09-07 14:35:37 +00004670 PyObject *m, *d, *di, *v, *k;
4671 int i;
Guido van Rossum2f80d961999-07-13 15:18:58 +00004672 char *rev="1.71";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004673 PyObject *format_version;
4674 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004675
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004676 Picklertype.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00004677 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4678 Picklertype.tp_setattro = PyObject_GenericSetAttr;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004679 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004680 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004681
Tim Peters84e87f32001-03-17 04:50:51 +00004682 /* Initialize some pieces. We need to do this before module creation,
4683 so we're forced to use a temporary dictionary. :(
Guido van Rossumebba4202000-09-07 14:35:37 +00004684 */
4685 di=PyDict_New();
4686 if (!di) return;
4687 if (init_stuff(di) < 0) return;
4688
Guido van Rossum60456fd1997-04-09 17:36:32 +00004689 /* Create the module and add the functions */
4690 m = Py_InitModule4("cPickle", cPickle_methods,
4691 cPickle_module_documentation,
4692 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004693
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694 /* Add some symbolic constants to the module */
4695 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004696 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004697 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004698
Guido van Rossumebba4202000-09-07 14:35:37 +00004699 /* Copy data from di. Waaa. */
4700 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4701 if (PyObject_SetItem(d, k, v) < 0) {
4702 Py_DECREF(di);
4703 return;
4704 }
4705 }
4706 Py_DECREF(di);
4707
Guido van Rossum60456fd1997-04-09 17:36:32 +00004708 format_version = PyString_FromString("1.3");
4709 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004710
Guido van Rossum60456fd1997-04-09 17:36:32 +00004711 PyDict_SetItemString(d, "format_version", format_version);
4712 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004713 Py_XDECREF(format_version);
4714 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004715}