blob: 425ff10bb0eae21acd9fedc8b01306351ab34dd5 [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
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000324#define FAST_LIMIT 2000
325
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000326staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000327
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000328typedef struct Unpicklerobject {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000329 PyObject_HEAD
330 FILE *fp;
331 PyObject *file;
332 PyObject *readline;
333 PyObject *read;
334 PyObject *memo;
335 PyObject *arg;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000336 Pdata *stack;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000337 PyObject *mark;
338 PyObject *pers_func;
339 PyObject *last_string;
340 int *marks;
341 int num_marks;
342 int marks_size;
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000343 int (*read_func)(struct Unpicklerobject *, char **, int);
344 int (*readline_func)(struct Unpicklerobject *, char **);
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000345 int buf_size;
346 char *buf;
347 PyObject *safe_constructors;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +0000348 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000350
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000351staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000352
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000353/* Forward decls that need the above structs */
354static int save(Picklerobject *, PyObject *, int);
355static int put2(Picklerobject *, PyObject *);
356
Tim Peters84e87f32001-03-17 04:50:51 +0000357int
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000358cPickle_PyMapping_HasKey(PyObject *o, PyObject *key) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000359 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000360
Guido van Rossum053b8df1998-11-25 16:18:00 +0000361 if ((v = PyObject_GetItem(o,key))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000362 Py_DECREF(v);
363 return 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000364 }
365
Guido van Rossum60456fd1997-04-09 17:36:32 +0000366 PyErr_Clear();
367 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000368}
369
Guido van Rossumd385d591997-04-09 17:47:47 +0000370static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000371PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000372cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
373{
Guido van Rossum60456fd1997-04-09 17:36:32 +0000374 va_list va;
375 PyObject *args=0, *retval=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000376 va_start(va, format);
Tim Peters84e87f32001-03-17 04:50:51 +0000377
Guido van Rossum053b8df1998-11-25 16:18:00 +0000378 if (format) args = Py_VaBuildValue(format, va);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000379 va_end(va);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000380 if (format && ! args) return NULL;
381 if (stringformat && !(retval=PyString_FromString(stringformat))) return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000382
Guido van Rossum053b8df1998-11-25 16:18:00 +0000383 if (retval) {
384 if (args) {
385 PyObject *v;
386 v=PyString_Format(retval, args);
387 Py_DECREF(retval);
388 Py_DECREF(args);
389 if (! v) return NULL;
390 retval=v;
391 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000394 if (args) retval=args;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000395 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000396 PyErr_SetObject(ErrType,Py_None);
397 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000398 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000399 PyErr_SetObject(ErrType,retval);
400 Py_DECREF(retval);
401 return NULL;
402}
403
Tim Peters84e87f32001-03-17 04:50:51 +0000404static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000405write_file(Picklerobject *self, char *s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000406 size_t nbyteswritten;
407
Guido van Rossum60456fd1997-04-09 17:36:32 +0000408 if (s == NULL) {
409 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000410 }
411
Tim Peters84e87f32001-03-17 04:50:51 +0000412 Py_BEGIN_ALLOW_THREADS
413 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
414 Py_END_ALLOW_THREADS
415 if (nbyteswritten != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000416 PyErr_SetFromErrno(PyExc_IOError);
417 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000418 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000419
420 return n;
421}
422
Tim Peters84e87f32001-03-17 04:50:51 +0000423static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000424write_cStringIO(Picklerobject *self, char *s, int n) {
425 if (s == NULL) {
426 return 0;
427 }
428
429 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
430 return -1;
431 }
432
433 return n;
434}
435
Tim Peters84e87f32001-03-17 04:50:51 +0000436static int
Guido van Rossum142eeb81997-08-13 03:14:41 +0000437write_none(Picklerobject *self, char *s, int n) {
438 if (s == NULL) return 0;
439 return n;
440}
441
Tim Peters84e87f32001-03-17 04:50:51 +0000442static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443write_other(Picklerobject *self, char *s, int n) {
444 PyObject *py_str = 0, *junk = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000445
446 if (s == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000447 UNLESS (self->buf_size) return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000448 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000449 PyString_FromStringAndSize(self->write_buf, self->buf_size))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000450 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000451 }
452 else {
453 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
454 if (write_other(self, NULL, 0) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000455 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000456 }
457
Tim Peters84e87f32001-03-17 04:50:51 +0000458 if (n > WRITE_BUF_SIZE) {
459 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460 PyString_FromStringAndSize(s, n))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000461 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000462 }
463 else {
464 memcpy(self->write_buf + self->buf_size, s, n);
465 self->buf_size += n;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000466 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000467 }
468 }
469
Guido van Rossum053b8df1998-11-25 16:18:00 +0000470 if (self->write) {
471 /* object with write method */
472 ARG_TUP(self, py_str);
473 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000474 junk = PyObject_Call(self->write, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000475 FREE_ARG_TUP(self);
476 }
477 if (junk) Py_DECREF(junk);
478 else return -1;
479 }
Tim Peters84e87f32001-03-17 04:50:51 +0000480 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000481 PDATA_PUSH(self->file, py_str, -1);
Tim Peters84e87f32001-03-17 04:50:51 +0000482
483 self->buf_size = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000484 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000485}
486
487
Tim Peters84e87f32001-03-17 04:50:51 +0000488static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000489read_file(Unpicklerobject *self, char **s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000490 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491
492 if (self->buf_size == 0) {
493 int size;
494
Tim Peters84e87f32001-03-17 04:50:51 +0000495 size = ((n < 32) ? 32 : n);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000496 UNLESS (self->buf = (char *)malloc(size * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497 PyErr_NoMemory();
498 return -1;
499 }
500
501 self->buf_size = size;
502 }
503 else if (n > self->buf_size) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000504 UNLESS (self->buf = (char *)realloc(self->buf, n * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505 PyErr_NoMemory();
506 return -1;
507 }
Tim Peters84e87f32001-03-17 04:50:51 +0000508
Guido van Rossum60456fd1997-04-09 17:36:32 +0000509 self->buf_size = n;
510 }
Tim Peters84e87f32001-03-17 04:50:51 +0000511
512 Py_BEGIN_ALLOW_THREADS
513 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
514 Py_END_ALLOW_THREADS
515 if (nbytesread != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516 if (feof(self->fp)) {
517 PyErr_SetNone(PyExc_EOFError);
518 return -1;
519 }
520
521 PyErr_SetFromErrno(PyExc_IOError);
522 return -1;
523 }
524
525 *s = self->buf;
526
527 return n;
528}
529
530
Tim Peters84e87f32001-03-17 04:50:51 +0000531static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532readline_file(Unpicklerobject *self, char **s) {
533 int i;
534
535 if (self->buf_size == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000536 UNLESS (self->buf = (char *)malloc(40 * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000537 PyErr_NoMemory();
538 return -1;
539 }
Tim Peters84e87f32001-03-17 04:50:51 +0000540
Guido van Rossum60456fd1997-04-09 17:36:32 +0000541 self->buf_size = 40;
542 }
543
544 i = 0;
545 while (1) {
546 for (; i < (self->buf_size - 1); i++) {
547 if (feof(self->fp) || (self->buf[i] = getc(self->fp)) == '\n') {
548 self->buf[i + 1] = '\0';
549 *s = self->buf;
550 return i + 1;
551 }
552 }
553
Tim Peters84e87f32001-03-17 04:50:51 +0000554 UNLESS (self->buf = (char *)realloc(self->buf,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000555 (self->buf_size * 2) * sizeof(char))) {
556 PyErr_NoMemory();
557 return -1;
558 }
559
560 self->buf_size *= 2;
561 }
562
Tim Peters84e87f32001-03-17 04:50:51 +0000563}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000564
565
Tim Peters84e87f32001-03-17 04:50:51 +0000566static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567read_cStringIO(Unpicklerobject *self, char **s, int n) {
568 char *ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000569
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
571 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000572 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000573 }
574
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575 *s = ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000576
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577 return n;
578}
579
580
Tim Peters84e87f32001-03-17 04:50:51 +0000581static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000582readline_cStringIO(Unpicklerobject *self, char **s) {
583 int n;
584 char *ptr;
585
586 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
587 return -1;
588 }
589
590 *s = ptr;
591
592 return n;
593}
594
595
Tim Peters84e87f32001-03-17 04:50:51 +0000596static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000597read_other(Unpicklerobject *self, char **s, int n) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000598 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000599
Guido van Rossum053b8df1998-11-25 16:18:00 +0000600 UNLESS (bytes = PyInt_FromLong(n)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601
Guido van Rossum053b8df1998-11-25 16:18:00 +0000602 ARG_TUP(self, bytes);
603 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000604 str = PyObject_Call(self->read, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000605 FREE_ARG_TUP(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000606 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000607 if (! str) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608
609 Py_XDECREF(self->last_string);
610 self->last_string = str;
611
Guido van Rossum053b8df1998-11-25 16:18:00 +0000612 if (! (*s = PyString_AsString(str))) return -1;
613 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000614}
615
616
Tim Peters84e87f32001-03-17 04:50:51 +0000617static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618readline_other(Unpicklerobject *self, char **s) {
619 PyObject *str;
620 int str_size;
621
Guido van Rossum053b8df1998-11-25 16:18:00 +0000622 UNLESS (str = PyObject_CallObject(self->readline, empty_tuple)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623 return -1;
624 }
625
Guido van Rossum053b8df1998-11-25 16:18:00 +0000626 if ((str_size = PyString_Size(str)) < 0)
627 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000628
629 Py_XDECREF(self->last_string);
630 self->last_string = str;
631
Guido van Rossum053b8df1998-11-25 16:18:00 +0000632 if (! (*s = PyString_AsString(str)))
633 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634
635 return str_size;
636}
637
638
639static char *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000640pystrndup(char *s, int l) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641 char *r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000642 UNLESS (r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory();
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643 memcpy(r,s,l);
644 r[l]=0;
645 return r;
646}
647
648
649static int
650get(Picklerobject *self, PyObject *id) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000651 PyObject *value, *mv;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000652 long c_value;
653 char s[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000654 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000655
Guido van Rossum053b8df1998-11-25 16:18:00 +0000656 UNLESS (mv = PyDict_GetItem(self->memo, id)) {
657 PyErr_SetObject(PyExc_KeyError, id);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000658 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000659 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000660
Guido van Rossum053b8df1998-11-25 16:18:00 +0000661 UNLESS (value = PyTuple_GetItem(mv, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000663
Guido van Rossum053b8df1998-11-25 16:18:00 +0000664 UNLESS (PyInt_Check(value)) {
665 PyErr_SetString(PicklingError, "no int where int expected in memo");
666 return -1;
667 }
668 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000669
670 if (!self->bin) {
671 s[0] = GET;
Jeremy Hylton179c48c2001-11-28 21:49:51 +0000672 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673 len = strlen(s);
674 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000675 else if (Pdata_Check(self->file)) {
676 if (write_other(self, NULL, 0) < 0) return -1;
677 PDATA_APPEND(self->file, mv, -1);
678 return 0;
679 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680 else {
681 if (c_value < 256) {
682 s[0] = BINGET;
683 s[1] = (int)(c_value & 0xff);
684 len = 2;
685 }
686 else {
687 s[0] = LONG_BINGET;
688 s[1] = (int)(c_value & 0xff);
689 s[2] = (int)((c_value >> 8) & 0xff);
690 s[3] = (int)((c_value >> 16) & 0xff);
691 s[4] = (int)((c_value >> 24) & 0xff);
692 len = 5;
693 }
694 }
695
696 if ((*self->write_func)(self, s, len) < 0)
697 return -1;
698
699 return 0;
700}
Tim Peters84e87f32001-03-17 04:50:51 +0000701
Guido van Rossum60456fd1997-04-09 17:36:32 +0000702
703static int
704put(Picklerobject *self, PyObject *ob) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000705 if (ob->ob_refcnt < 2 || self->fast)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000706 return 0;
707
708 return put2(self, ob);
709}
710
Tim Peters84e87f32001-03-17 04:50:51 +0000711
Guido van Rossum60456fd1997-04-09 17:36:32 +0000712static int
713put2(Picklerobject *self, PyObject *ob) {
714 char c_str[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000715 int p;
716 size_t len;
717 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000718 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000719
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000720 if (self->fast)
721 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000722
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723 if ((p = PyDict_Size(self->memo)) < 0)
724 goto finally;
725
Guido van Rossum053b8df1998-11-25 16:18:00 +0000726 p++; /* Make sure memo keys are positive! */
727
Guido van Rossum534b7c52000-06-28 22:23:56 +0000728 UNLESS (py_ob_id = PyLong_FromVoidPtr(ob))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000729 goto finally;
730
731 UNLESS (memo_len = PyInt_FromLong(p))
732 goto finally;
733
734 UNLESS (t = PyTuple_New(2))
735 goto finally;
736
737 PyTuple_SET_ITEM(t, 0, memo_len);
738 Py_INCREF(memo_len);
739 PyTuple_SET_ITEM(t, 1, ob);
740 Py_INCREF(ob);
741
742 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
743 goto finally;
744
Guido van Rossum60456fd1997-04-09 17:36:32 +0000745 if (!self->bin) {
746 c_str[0] = PUT;
Jeremy Hylton179c48c2001-11-28 21:49:51 +0000747 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000748 len = strlen(c_str);
749 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000750 else if (Pdata_Check(self->file)) {
751 if (write_other(self, NULL, 0) < 0) return -1;
752 PDATA_APPEND(self->file, memo_len, -1);
753 res=0; /* Job well done ;) */
754 goto finally;
755 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000756 else {
757 if (p >= 256) {
758 c_str[0] = LONG_BINPUT;
759 c_str[1] = (int)(p & 0xff);
760 c_str[2] = (int)((p >> 8) & 0xff);
761 c_str[3] = (int)((p >> 16) & 0xff);
762 c_str[4] = (int)((p >> 24) & 0xff);
763 len = 5;
764 }
765 else {
766 c_str[0] = BINPUT;
767 c_str[1] = p;
Tim Peters84e87f32001-03-17 04:50:51 +0000768 len = 2;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769 }
770 }
771
772 if ((*self->write_func)(self, c_str, len) < 0)
773 goto finally;
774
Guido van Rossum60456fd1997-04-09 17:36:32 +0000775 res = 0;
776
777finally:
778 Py_XDECREF(py_ob_id);
779 Py_XDECREF(memo_len);
780 Py_XDECREF(t);
781
782 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000783}
784
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000785#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000786
787static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000788PyImport_Import(PyObject *module_name) {
789 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
790 static PyObject *standard_builtins=0;
791 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
792
Guido van Rossum053b8df1998-11-25 16:18:00 +0000793 UNLESS (silly_list) {
794 UNLESS (__import___str=PyString_FromString("__import__"))
795 return NULL;
796 UNLESS (__builtins___str=PyString_FromString("__builtins__"))
797 return NULL;
798 UNLESS (silly_list=Py_BuildValue("[s]","__doc__"))
799 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000800 }
801
Guido van Rossum053b8df1998-11-25 16:18:00 +0000802 if ((globals=PyEval_GetGlobals())) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000803 Py_INCREF(globals);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000804 UNLESS (__builtins__=PyObject_GetItem(globals,__builtins___str))
805 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000806 }
807 else {
808 PyErr_Clear();
809
Guido van Rossum053b8df1998-11-25 16:18:00 +0000810 UNLESS (standard_builtins ||
811 (standard_builtins=PyImport_ImportModule("__builtin__")))
812 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000813
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000814 __builtins__=standard_builtins;
815 Py_INCREF(__builtins__);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000816 UNLESS (globals = Py_BuildValue("{sO}", "__builtins__", __builtins__))
817 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000818 }
819
Guido van Rossum053b8df1998-11-25 16:18:00 +0000820 if (PyDict_Check(__builtins__)) {
821 UNLESS (__import__=PyObject_GetItem(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000822 }
823 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000824 UNLESS (__import__=PyObject_GetAttr(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000825 }
826
Guido van Rossum053b8df1998-11-25 16:18:00 +0000827 UNLESS (r=PyObject_CallFunction(__import__,"OOOO",
828 module_name, globals, globals, silly_list))
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000829 goto err;
830
831 Py_DECREF(globals);
832 Py_DECREF(__builtins__);
833 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000834
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000835 return r;
836err:
837 Py_XDECREF(globals);
838 Py_XDECREF(__builtins__);
839 Py_XDECREF(__import__);
840 return NULL;
841}
842
843static PyObject *
Guido van Rossume2d81cd1998-08-08 19:40:10 +0000844whichmodule(PyObject *global, PyObject *global_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000845 int i, j;
846 PyObject *module = 0, *modules_dict = 0,
847 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848
Guido van Rossum45188231997-09-28 05:38:51 +0000849 module = PyObject_GetAttrString(global, "__module__");
850 if (module) return module;
851 PyErr_Clear();
852
Guido van Rossum053b8df1998-11-25 16:18:00 +0000853 UNLESS (modules_dict = PySys_GetObject("modules"))
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000854 return NULL;
855
Guido van Rossum60456fd1997-04-09 17:36:32 +0000856 i = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000857 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
858
Guido van Rossum053b8df1998-11-25 16:18:00 +0000859 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000860
Guido van Rossum053b8df1998-11-25 16:18:00 +0000861 UNLESS (global_name_attr = PyObject_GetAttr(module, global_name)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000862 PyErr_Clear();
863 continue;
864 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000865
Guido van Rossum60456fd1997-04-09 17:36:32 +0000866 if (global_name_attr != global) {
867 Py_DECREF(global_name_attr);
868 continue;
869 }
870
871 Py_DECREF(global_name_attr);
872
873 break;
874 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000875
876 /* The following implements the rule in pickle.py added in 1.5
877 that used __main__ if no module is found. I don't actually
878 like this rule. jlf
879 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000880 if (!j) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000881 j=1;
882 name=__main___str;
883 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000884
885 Py_INCREF(name);
886 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000887}
888
889
Guido van Rossum60456fd1997-04-09 17:36:32 +0000890static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000891fast_save_enter(Picklerobject *self, PyObject *obj)
892{
893 /* if fast_container < 0, we're doing an error exit. */
894 if (++self->fast_container >= FAST_LIMIT) {
895 PyObject *key = NULL;
896 if (self->fast_memo == NULL) {
897 self->fast_memo = PyDict_New();
898 if (self->fast_memo == NULL) {
899 self->fast_container = -1;
900 return 0;
901 }
902 }
903 key = PyLong_FromVoidPtr(obj);
904 if (key == NULL)
905 return 0;
906 if (PyDict_GetItem(self->fast_memo, key)) {
907 PyErr_Format(PyExc_ValueError,
908 "fast mode: can't pickle cyclic objects including object type %s at %p",
909 obj->ob_type->tp_name, obj);
910 self->fast_container = -1;
911 return 0;
912 }
913 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
914 self->fast_container = -1;
915 return 0;
916 }
917 }
918 return 1;
919}
920
921int
922fast_save_leave(Picklerobject *self, PyObject *obj)
923{
924 if (self->fast_container-- >= FAST_LIMIT) {
925 PyObject *key = PyLong_FromVoidPtr(obj);
926 if (key == NULL)
927 return 0;
928 if (PyDict_DelItem(self->fast_memo, key) < 0) {
929 return 0;
930 }
931 }
932 return 1;
933}
934
935static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000936save_none(Picklerobject *self, PyObject *args) {
937 static char none = NONE;
Tim Peters84e87f32001-03-17 04:50:51 +0000938 if ((*self->write_func)(self, &none, 1) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000939 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000940
Guido van Rossum60456fd1997-04-09 17:36:32 +0000941 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000942}
943
Tim Peters84e87f32001-03-17 04:50:51 +0000944
Guido van Rossum60456fd1997-04-09 17:36:32 +0000945static int
946save_int(Picklerobject *self, PyObject *args) {
947 char c_str[32];
948 long l = PyInt_AS_LONG((PyIntObject *)args);
949 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000950
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000951 if (!self->bin
952#if SIZEOF_LONG > 4
Tim Peters3906eb82001-04-10 04:22:00 +0000953 || l > 0x7fffffffL
954 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000955#endif
Tim Peters3906eb82001-04-10 04:22:00 +0000956 ) {
957 /* Text-mode pickle, or long too big to fit in the 4-byte
958 * signed BININT format: store as a string.
959 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000960 c_str[0] = INT;
Jeremy Hylton179c48c2001-11-28 21:49:51 +0000961 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000962 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
963 return -1;
964 }
965 else {
Tim Petersd8ae7c22001-04-10 04:35:28 +0000966 /* Binary pickle and l fits in a signed 4-byte int. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000967 c_str[1] = (int)( l & 0xff);
968 c_str[2] = (int)((l >> 8) & 0xff);
969 c_str[3] = (int)((l >> 16) & 0xff);
970 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000971
Guido van Rossum60456fd1997-04-09 17:36:32 +0000972 if ((c_str[4] == 0) && (c_str[3] == 0)) {
973 if (c_str[2] == 0) {
974 c_str[0] = BININT1;
975 len = 2;
976 }
977 else {
978 c_str[0] = BININT2;
979 len = 3;
980 }
981 }
982 else {
983 c_str[0] = BININT;
984 len = 5;
985 }
986
987 if ((*self->write_func)(self, c_str, len) < 0)
988 return -1;
989 }
990
991 return 0;
992}
993
994
995static int
996save_long(Picklerobject *self, PyObject *args) {
997 int size, res = -1;
998 PyObject *repr = 0;
999
1000 static char l = LONG;
1001
Guido van Rossum053b8df1998-11-25 16:18:00 +00001002 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001003 goto finally;
1004
1005 if ((size = PyString_Size(repr)) < 0)
1006 goto finally;
1007
1008 if ((*self->write_func)(self, &l, 1) < 0)
1009 goto finally;
1010
Tim Peters84e87f32001-03-17 04:50:51 +00001011 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001012 PyString_AS_STRING((PyStringObject *)repr), size) < 0)
1013 goto finally;
1014
1015 if ((*self->write_func)(self, "\n", 1) < 0)
1016 goto finally;
1017
1018 res = 0;
1019
1020finally:
1021 Py_XDECREF(repr);
1022
1023 return res;
1024}
1025
1026
1027static int
1028save_float(Picklerobject *self, PyObject *args) {
1029 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
1030
Guido van Rossum60456fd1997-04-09 17:36:32 +00001031 if (self->bin) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001032 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033 double f;
1034 long fhi, flo;
Fred Drake2c7a6852001-07-17 18:34:03 +00001035 char str[9];
1036 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001037
1038 *p = BINFLOAT;
1039 p++;
1040
1041 if (x < 0) {
1042 s = 1;
1043 x = -x;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001044 }
1045 else
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046 s = 0;
1047
1048 f = frexp(x, &e);
1049
1050 /* Normalize f to be in the range [1.0, 2.0) */
1051 if (0.5 <= f && f < 1.0) {
1052 f *= 2.0;
1053 e--;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001054 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001055 else if (f == 0.0) {
1056 e = 0;
1057 }
1058 else {
1059 PyErr_SetString(PyExc_SystemError,
1060 "frexp() result out of range");
1061 return -1;
1062 }
1063
1064 if (e >= 1024) {
1065 /* XXX 1024 itself is reserved for Inf/NaN */
1066 PyErr_SetString(PyExc_OverflowError,
1067 "float too large to pack with d format");
1068 return -1;
1069 }
1070 else if (e < -1022) {
1071 /* Gradual underflow */
1072 f = ldexp(f, 1022 + e);
1073 e = 0;
1074 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001075 else if (!(e == 0 && f == 0.0)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001076 e += 1023;
1077 f -= 1.0; /* Get rid of leading 1 */
1078 }
1079
1080 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
1081 f *= 268435456.0; /* 2**28 */
1082 fhi = (long) floor(f); /* Truncate */
1083 f -= (double)fhi;
1084 f *= 16777216.0; /* 2**24 */
1085 flo = (long) floor(f + 0.5); /* Round */
1086
1087 /* First byte */
1088 *p = (s<<7) | (e>>4);
1089 p++;
1090
1091 /* Second byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001092 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
Guido van Rossum60456fd1997-04-09 17:36:32 +00001093 p++;
1094
1095 /* Third byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001096 *p = (unsigned char) ((fhi>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001097 p++;
1098
1099 /* Fourth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001100 *p = (unsigned char) ((fhi>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001101 p++;
1102
1103 /* Fifth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001104 *p = (unsigned char) (fhi & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001105 p++;
1106
1107 /* Sixth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001108 *p = (unsigned char) ((flo>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001109 p++;
1110
1111 /* Seventh byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001112 *p = (unsigned char) ((flo>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001113 p++;
1114
1115 /* Eighth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001116 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001117
1118 if ((*self->write_func)(self, str, 9) < 0)
1119 return -1;
1120 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001121 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122 char c_str[250];
1123 c_str[0] = FLOAT;
Jeremy Hylton179c48c2001-11-28 21:49:51 +00001124 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
1126 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1127 return -1;
1128 }
1129
1130 return 0;
1131}
1132
1133
1134static int
Guido van Rossum142eeb81997-08-13 03:14:41 +00001135save_string(Picklerobject *self, PyObject *args, int doput) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136 int size, len;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001137 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Guido van Rossum053b8df1998-11-25 16:18:00 +00001139 if ((size = PyString_Size(args)) < 0)
1140 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
1142 if (!self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143 char *repr_str;
1144
1145 static char string = STRING;
1146
Guido van Rossum053b8df1998-11-25 16:18:00 +00001147 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001148 return -1;
1149
Guido van Rossum053b8df1998-11-25 16:18:00 +00001150 if ((len = PyString_Size(repr)) < 0)
1151 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
1154 if ((*self->write_func)(self, &string, 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001155 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
1157 if ((*self->write_func)(self, repr_str, len) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001158 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
1160 if ((*self->write_func)(self, "\n", 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001161 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
1163 Py_XDECREF(repr);
1164 }
1165 else {
1166 int i;
1167 char c_str[5];
1168
Guido van Rossum053b8df1998-11-25 16:18:00 +00001169 if ((size = PyString_Size(args)) < 0)
1170 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
1172 if (size < 256) {
1173 c_str[0] = SHORT_BINSTRING;
1174 c_str[1] = size;
1175 len = 2;
1176 }
1177 else {
1178 c_str[0] = BINSTRING;
1179 for (i = 1; i < 5; i++)
1180 c_str[i] = (int)(size >> ((i - 1) * 8));
1181 len = 5;
1182 }
1183
1184 if ((*self->write_func)(self, c_str, len) < 0)
1185 return -1;
1186
Guido van Rossum053b8df1998-11-25 16:18:00 +00001187 if (size > 128 && Pdata_Check(self->file)) {
1188 if (write_other(self, NULL, 0) < 0) return -1;
1189 PDATA_APPEND(self->file, args, -1);
1190 }
1191 else {
Tim Peters84e87f32001-03-17 04:50:51 +00001192 if ((*self->write_func)(self,
Guido van Rossum053b8df1998-11-25 16:18:00 +00001193 PyString_AS_STRING((PyStringObject *)args), size) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001195 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196 }
1197
Guido van Rossum142eeb81997-08-13 03:14:41 +00001198 if (doput)
1199 if (put(self, args) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001200 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
1202 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001203
1204err:
1205 Py_XDECREF(repr);
1206 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207}
1208
1209
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001210#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001211/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1212 backslash and newline characters to \uXXXX escapes. */
1213static PyObject *
1214modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1215{
1216 PyObject *repr;
1217 char *p;
1218 char *q;
1219
1220 static const char *hexdigit = "0123456789ABCDEF";
1221
1222 repr = PyString_FromStringAndSize(NULL, 6 * size);
1223 if (repr == NULL)
1224 return NULL;
1225 if (size == 0)
1226 return repr;
1227
1228 p = q = PyString_AS_STRING(repr);
1229 while (size-- > 0) {
1230 Py_UNICODE ch = *s++;
1231 /* Map 16-bit characters to '\uxxxx' */
1232 if (ch >= 256 || ch == '\\' || ch == '\n') {
1233 *p++ = '\\';
1234 *p++ = 'u';
1235 *p++ = hexdigit[(ch >> 12) & 0xf];
1236 *p++ = hexdigit[(ch >> 8) & 0xf];
1237 *p++ = hexdigit[(ch >> 4) & 0xf];
1238 *p++ = hexdigit[ch & 15];
1239 }
1240 /* Copy everything else as-is */
1241 else
1242 *p++ = (char) ch;
1243 }
1244 *p = '\0';
1245 if (_PyString_Resize(&repr, p - q))
1246 goto onError;
1247
1248 return repr;
1249
1250 onError:
1251 Py_DECREF(repr);
1252 return NULL;
1253}
1254
1255
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001257save_unicode(Picklerobject *self, PyObject *args, int doput) {
1258 int size, len;
1259 PyObject *repr=0;
1260
1261 if (!PyUnicode_Check(args))
1262 return -1;
1263
1264 if (!self->bin) {
1265 char *repr_str;
1266 static char string = UNICODE;
1267
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001268 UNLESS(repr = modified_EncodeRawUnicodeEscape(
1269 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)))
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001270 return -1;
1271
1272 if ((len = PyString_Size(repr)) < 0)
1273 goto err;
1274 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1275
1276 if ((*self->write_func)(self, &string, 1) < 0)
1277 goto err;
1278
1279 if ((*self->write_func)(self, repr_str, len) < 0)
1280 goto err;
1281
1282 if ((*self->write_func)(self, "\n", 1) < 0)
1283 goto err;
1284
1285 Py_XDECREF(repr);
1286 }
1287 else {
1288 int i;
1289 char c_str[5];
1290
1291 UNLESS (repr = PyUnicode_AsUTF8String(args))
1292 return -1;
1293
1294 if ((size = PyString_Size(repr)) < 0)
1295 goto err;
1296
1297 c_str[0] = BINUNICODE;
1298 for (i = 1; i < 5; i++)
1299 c_str[i] = (int)(size >> ((i - 1) * 8));
1300 len = 5;
1301
1302 if ((*self->write_func)(self, c_str, len) < 0)
1303 goto err;
1304
1305 if (size > 128 && Pdata_Check(self->file)) {
1306 if (write_other(self, NULL, 0) < 0)
1307 goto err;
1308 PDATA_APPEND(self->file, repr, -1);
1309 }
1310 else {
1311 if ((*self->write_func)(self, PyString_AS_STRING(repr), size) < 0)
1312 goto err;
1313 }
1314
1315 Py_DECREF(repr);
1316 }
1317
1318 if (doput)
1319 if (put(self, args) < 0)
1320 return -1;
1321
1322 return 0;
1323
1324err:
1325 Py_XDECREF(repr);
1326 return -1;
1327}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001328#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
1330
1331static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001332save_tuple(Picklerobject *self, PyObject *args) {
1333 PyObject *element = 0, *py_tuple_id = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001334 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001335
1336 static char tuple = TUPLE;
1337
1338 if ((*self->write_func)(self, &MARKv, 1) < 0)
1339 goto finally;
1340
Tim Peters84e87f32001-03-17 04:50:51 +00001341 if ((len = PyTuple_Size(args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001342 goto finally;
1343
1344 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001345 UNLESS (element = PyTuple_GET_ITEM((PyTupleObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001346 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001347
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348 if (save(self, element, 0) < 0)
1349 goto finally;
1350 }
1351
Guido van Rossum534b7c52000-06-28 22:23:56 +00001352 UNLESS (py_tuple_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001353 goto finally;
1354
1355 if (len) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001356 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001357 if (self->bin) {
1358 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001359
Guido van Rossum60456fd1997-04-09 17:36:32 +00001360 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1361 goto finally;
1362 }
1363 else {
1364 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001365
Guido van Rossum60456fd1997-04-09 17:36:32 +00001366 for (i = 0; i <= len; i++) {
1367 if ((*self->write_func)(self, &pop, 1) < 0)
1368 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001369 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001370 }
Tim Peters84e87f32001-03-17 04:50:51 +00001371
Guido van Rossum60456fd1997-04-09 17:36:32 +00001372 if (get(self, py_tuple_id) < 0)
1373 goto finally;
1374
1375 res = 0;
1376 goto finally;
1377 }
1378 }
1379
1380 if ((*self->write_func)(self, &tuple, 1) < 0) {
1381 goto finally;
1382 }
1383
1384 if (put(self, args) < 0)
1385 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001386
Guido van Rossum60456fd1997-04-09 17:36:32 +00001387 res = 0;
1388
1389finally:
1390 Py_XDECREF(py_tuple_id);
1391
1392 return res;
1393}
1394
1395static int
1396save_empty_tuple(Picklerobject *self, PyObject *args) {
1397 static char tuple = EMPTY_TUPLE;
1398
1399 return (*self->write_func)(self, &tuple, 1);
1400}
1401
1402
1403static int
1404save_list(Picklerobject *self, PyObject *args) {
1405 PyObject *element = 0;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001406 int s_len, len, i, using_appends, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001407 char s[3];
1408
1409 static char append = APPEND, appends = APPENDS;
1410
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001411 if (self->fast && !fast_save_enter(self, args))
1412 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001413
Guido van Rossum053b8df1998-11-25 16:18:00 +00001414 if (self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001415 s[0] = EMPTY_LIST;
1416 s_len = 1;
Tim Peters84e87f32001-03-17 04:50:51 +00001417 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001418 else {
1419 s[0] = MARK;
1420 s[1] = LIST;
1421 s_len = 2;
1422 }
1423
1424 if ((len = PyList_Size(args)) < 0)
1425 goto finally;
1426
1427 if ((*self->write_func)(self, s, s_len) < 0)
1428 goto finally;
1429
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001430 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001431 if (put(self, args) < 0)
1432 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001433 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001434 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435 if (put2(self, args) < 0)
1436 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001437 }
1438
Guido van Rossum142eeb81997-08-13 03:14:41 +00001439 if ((using_appends = (self->bin && (len > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001440 if ((*self->write_func)(self, &MARKv, 1) < 0)
1441 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001442
Guido van Rossum60456fd1997-04-09 17:36:32 +00001443 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001444 UNLESS (element = PyList_GET_ITEM((PyListObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445 goto finally;
1446
Tim Peters84e87f32001-03-17 04:50:51 +00001447 if (save(self, element, 0) < 0)
1448 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001449
1450 if (!using_appends) {
1451 if ((*self->write_func)(self, &append, 1) < 0)
1452 goto finally;
1453 }
1454 }
1455
1456 if (using_appends) {
1457 if ((*self->write_func)(self, &appends, 1) < 0)
1458 goto finally;
1459 }
1460
1461 res = 0;
1462
1463finally:
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001464 if (self->fast && !fast_save_leave(self, args))
1465 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
1467 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001468}
1469
1470
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471static int
1472save_dict(Picklerobject *self, PyObject *args) {
1473 PyObject *key = 0, *value = 0;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001474 int i, len, res = -1, using_setitems;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001475 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001476
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001478
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001479 if (self->fast && !fast_save_enter(self, args))
1480 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001481
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482 if (self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001483 s[0] = EMPTY_DICT;
1484 len = 1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001485 }
1486 else {
1487 s[0] = MARK;
1488 s[1] = DICT;
1489 len = 2;
1490 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001491
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492 if ((*self->write_func)(self, s, len) < 0)
1493 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001494
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495 if ((len = PyDict_Size(args)) < 0)
1496 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001497
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001498 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001499 if (put(self, args) < 0)
1500 goto finally;
1501 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001502 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001503 if (put2(self, args) < 0)
1504 goto finally;
1505 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001506
Guido van Rossum142eeb81997-08-13 03:14:41 +00001507 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508 if ((*self->write_func)(self, &MARKv, 1) < 0)
1509 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001510
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511 i = 0;
1512 while (PyDict_Next(args, &i, &key, &value)) {
1513 if (save(self, key, 0) < 0)
1514 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001515
Guido van Rossum60456fd1997-04-09 17:36:32 +00001516 if (save(self, value, 0) < 0)
1517 goto finally;
1518
1519 if (!using_setitems) {
1520 if ((*self->write_func)(self, &setitem, 1) < 0)
1521 goto finally;
1522 }
1523 }
1524
1525 if (using_setitems) {
1526 if ((*self->write_func)(self, &setitems, 1) < 0)
1527 goto finally;
1528 }
1529
1530 res = 0;
1531
1532finally:
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001533 if (self->fast && !fast_save_leave(self, args))
1534 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001535
1536 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001537}
1538
1539
Tim Peters84e87f32001-03-17 04:50:51 +00001540static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541save_inst(Picklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00001542 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1544 char *module_str, *name_str;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001545 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001546
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001548
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001549 if (self->fast && !fast_save_enter(self, args))
1550 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001551
Guido van Rossum60456fd1997-04-09 17:36:32 +00001552 if ((*self->write_func)(self, &MARKv, 1) < 0)
1553 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001554
Guido van Rossum053b8df1998-11-25 16:18:00 +00001555 UNLESS (class = PyObject_GetAttr(args, __class___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001556 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001557
Guido van Rossum60456fd1997-04-09 17:36:32 +00001558 if (self->bin) {
1559 if (save(self, class, 0) < 0)
1560 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561 }
1562
Guido van Rossum142eeb81997-08-13 03:14:41 +00001563 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001564 PyObject *element = 0;
1565 int i, len;
1566
Tim Peters84e87f32001-03-17 04:50:51 +00001567 UNLESS (class_args =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001568 PyObject_Call(getinitargs_func, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001569 goto finally;
1570
Tim Peters84e87f32001-03-17 04:50:51 +00001571 if ((len = PyObject_Size(class_args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001572 goto finally;
1573
1574 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001575 UNLESS (element = PySequence_GetItem(class_args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001576 goto finally;
1577
1578 if (save(self, element, 0) < 0) {
1579 Py_DECREF(element);
1580 goto finally;
1581 }
1582
1583 Py_DECREF(element);
1584 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001585 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001586 else {
1587 PyErr_Clear();
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001588 }
1589
Guido van Rossum60456fd1997-04-09 17:36:32 +00001590 if (!self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001591 UNLESS (name = ((PyClassObject *)class)->cl_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001592 PyErr_SetString(PicklingError, "class has no name");
1593 goto finally;
1594 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001595
Guido van Rossum053b8df1998-11-25 16:18:00 +00001596 UNLESS (module = whichmodule(class, name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001597 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001598
Tim Peters84e87f32001-03-17 04:50:51 +00001599
Guido van Rossum053b8df1998-11-25 16:18:00 +00001600 if ((module_size = PyString_Size(module)) < 0 ||
1601 (name_size = PyString_Size(name)) < 0)
1602 goto finally;
1603
Guido van Rossum60456fd1997-04-09 17:36:32 +00001604 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001605 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001606
Guido van Rossum60456fd1997-04-09 17:36:32 +00001607 if ((*self->write_func)(self, &inst, 1) < 0)
1608 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001609
Guido van Rossum60456fd1997-04-09 17:36:32 +00001610 if ((*self->write_func)(self, module_str, module_size) < 0)
1611 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001612
Guido van Rossum60456fd1997-04-09 17:36:32 +00001613 if ((*self->write_func)(self, "\n", 1) < 0)
1614 goto finally;
1615
1616 if ((*self->write_func)(self, name_str, name_size) < 0)
1617 goto finally;
1618
1619 if ((*self->write_func)(self, "\n", 1) < 0)
1620 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001622 else if ((*self->write_func)(self, &obj, 1) < 0) {
1623 goto finally;
1624 }
1625
Guido van Rossum142eeb81997-08-13 03:14:41 +00001626 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001627 UNLESS (state = PyObject_Call(getstate_func, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628 goto finally;
1629 }
1630 else {
1631 PyErr_Clear();
1632
Guido van Rossum053b8df1998-11-25 16:18:00 +00001633 UNLESS (state = PyObject_GetAttr(args, __dict___str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001634 PyErr_Clear();
1635 res = 0;
1636 goto finally;
1637 }
1638 }
1639
1640 if (!PyDict_Check(state)) {
1641 if (put2(self, args) < 0)
1642 goto finally;
1643 }
1644 else {
1645 if (put(self, args) < 0)
1646 goto finally;
1647 }
Tim Peters84e87f32001-03-17 04:50:51 +00001648
Guido van Rossum60456fd1997-04-09 17:36:32 +00001649 if (save(self, state, 0) < 0)
1650 goto finally;
1651
1652 if ((*self->write_func)(self, &build, 1) < 0)
1653 goto finally;
1654
1655 res = 0;
1656
1657finally:
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001658 if (self->fast && !fast_save_leave(self, args))
1659 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001660
Guido van Rossum60456fd1997-04-09 17:36:32 +00001661 Py_XDECREF(module);
1662 Py_XDECREF(class);
1663 Py_XDECREF(state);
1664 Py_XDECREF(getinitargs_func);
1665 Py_XDECREF(getstate_func);
1666 Py_XDECREF(class_args);
1667
1668 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001669}
1670
1671
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672static int
1673save_global(Picklerobject *self, PyObject *args, PyObject *name) {
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001674 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00001675 char *name_str, *module_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001676 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001677
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001679
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001680 if (name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001681 global_name = name;
1682 Py_INCREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001683 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001684 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001685 UNLESS (global_name = PyObject_GetAttr(args, __name___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001687 }
1688
Guido van Rossum053b8df1998-11-25 16:18:00 +00001689 UNLESS (module = whichmodule(args, global_name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001690 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001691
Guido van Rossum053b8df1998-11-25 16:18:00 +00001692 if ((module_size = PyString_Size(module)) < 0 ||
1693 (name_size = PyString_Size(global_name)) < 0)
1694 goto finally;
1695
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001696 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001697 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001698
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001699 mod = PyImport_ImportModule(module_str);
1700 if (mod == NULL) {
1701 /* Py_ErrClear(); ?? */
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00001702 cPickle_ErrFormat(PicklingError,
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001703 "Can't pickle %s: it's not found as %s.%s",
1704 "OSS", args, module, global_name);
1705 goto finally;
1706 }
1707 moddict = PyModule_GetDict(mod); /* borrowed ref */
1708 klass = PyDict_GetItemString(moddict, name_str); /* borrowed ref */
1709 if (klass == NULL) {
1710 cPickle_ErrFormat(PicklingError,
1711 "Can't pickle %s: it's not found as %s.%s",
1712 "OSS", args, module, global_name);
1713 goto finally;
1714 }
1715 if (klass != args) {
1716 cPickle_ErrFormat(PicklingError,
1717 "Can't pickle %s: it's not the same object as %s.%s",
1718 "OSS", args, module, global_name);
1719 goto finally;
1720 }
1721
Guido van Rossum60456fd1997-04-09 17:36:32 +00001722 if ((*self->write_func)(self, &global, 1) < 0)
1723 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001724
Guido van Rossum60456fd1997-04-09 17:36:32 +00001725 if ((*self->write_func)(self, module_str, module_size) < 0)
1726 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001727
Guido van Rossum60456fd1997-04-09 17:36:32 +00001728 if ((*self->write_func)(self, "\n", 1) < 0)
1729 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001730
Guido van Rossum60456fd1997-04-09 17:36:32 +00001731 if ((*self->write_func)(self, name_str, name_size) < 0)
1732 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001733
Guido van Rossum60456fd1997-04-09 17:36:32 +00001734 if ((*self->write_func)(self, "\n", 1) < 0)
1735 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001736
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737 if (put(self, args) < 0)
1738 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001739
Guido van Rossum60456fd1997-04-09 17:36:32 +00001740 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001741
Guido van Rossum60456fd1997-04-09 17:36:32 +00001742finally:
1743 Py_XDECREF(module);
1744 Py_XDECREF(global_name);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001745 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Guido van Rossum60456fd1997-04-09 17:36:32 +00001747 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748}
1749
Guido van Rossum60456fd1997-04-09 17:36:32 +00001750static int
1751save_pers(Picklerobject *self, PyObject *args, PyObject *f) {
1752 PyObject *pid = 0;
1753 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001754
Guido van Rossum60456fd1997-04-09 17:36:32 +00001755 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Guido van Rossum053b8df1998-11-25 16:18:00 +00001757 Py_INCREF(args);
1758 ARG_TUP(self, args);
1759 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001760 pid = PyObject_Call(f, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001761 FREE_ARG_TUP(self);
1762 }
1763 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001764
Guido van Rossum60456fd1997-04-09 17:36:32 +00001765 if (pid != Py_None) {
1766 if (!self->bin) {
1767 if (!PyString_Check(pid)) {
Tim Peters84e87f32001-03-17 04:50:51 +00001768 PyErr_SetString(PicklingError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001769 "persistent id must be string");
1770 goto finally;
1771 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Guido van Rossum60456fd1997-04-09 17:36:32 +00001773 if ((*self->write_func)(self, &persid, 1) < 0)
1774 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001775
Guido van Rossum60456fd1997-04-09 17:36:32 +00001776 if ((size = PyString_Size(pid)) < 0)
1777 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001778
Tim Peters84e87f32001-03-17 04:50:51 +00001779 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001780 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1781 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001782
Guido van Rossum60456fd1997-04-09 17:36:32 +00001783 if ((*self->write_func)(self, "\n", 1) < 0)
1784 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001785
Guido van Rossum60456fd1997-04-09 17:36:32 +00001786 res = 1;
1787 goto finally;
1788 }
1789 else if (save(self, pid, 1) >= 0) {
1790 if ((*self->write_func)(self, &binpersid, 1) < 0)
1791 res = -1;
1792 else
1793 res = 1;
1794 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Tim Peters84e87f32001-03-17 04:50:51 +00001796 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001797 }
1798
Guido van Rossum60456fd1997-04-09 17:36:32 +00001799 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001800
Guido van Rossum60456fd1997-04-09 17:36:32 +00001801finally:
1802 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803
Guido van Rossum60456fd1997-04-09 17:36:32 +00001804 return res;
1805}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001806
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Tim Peters84e87f32001-03-17 04:50:51 +00001808static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001809save_reduce(Picklerobject *self, PyObject *callable,
1810 PyObject *tup, PyObject *state, PyObject *ob) {
1811 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Guido van Rossum60456fd1997-04-09 17:36:32 +00001813 if (save(self, callable, 0) < 0)
1814 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Guido van Rossum60456fd1997-04-09 17:36:32 +00001816 if (save(self, tup, 0) < 0)
1817 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Guido van Rossum60456fd1997-04-09 17:36:32 +00001819 if ((*self->write_func)(self, &reduce, 1) < 0)
1820 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001822 if (ob != NULL) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001823 if (state && !PyDict_Check(state)) {
1824 if (put2(self, ob) < 0)
1825 return -1;
1826 }
1827 else {
1828 if (put(self, ob) < 0)
1829 return -1;
1830 }
1831 }
Tim Peters84e87f32001-03-17 04:50:51 +00001832
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001833 if (state) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001834 if (save(self, state, 0) < 0)
1835 return -1;
1836
1837 if ((*self->write_func)(self, &build, 1) < 0)
1838 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839 }
1840
Guido van Rossum60456fd1997-04-09 17:36:32 +00001841 return 0;
1842}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001843
Guido van Rossum60456fd1997-04-09 17:36:32 +00001844static int
1845save(Picklerobject *self, PyObject *args, int pers_save) {
1846 PyTypeObject *type;
1847 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
Guido van Rossum142eeb81997-08-13 03:14:41 +00001848 *callable = 0, *state = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001849 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001850
Guido van Rossum60456fd1997-04-09 17:36:32 +00001851 if (!pers_save && self->pers_func) {
1852 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1853 res = tmp;
1854 goto finally;
1855 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856 }
1857
Guido van Rossum60456fd1997-04-09 17:36:32 +00001858 if (args == Py_None) {
1859 res = save_none(self, args);
1860 goto finally;
1861 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001862
Guido van Rossum60456fd1997-04-09 17:36:32 +00001863 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865 switch (type->tp_name[0]) {
1866 case 'i':
1867 if (type == &PyInt_Type) {
1868 res = save_int(self, args);
1869 goto finally;
1870 }
1871 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Guido van Rossum60456fd1997-04-09 17:36:32 +00001873 case 'l':
1874 if (type == &PyLong_Type) {
1875 res = save_long(self, args);
1876 goto finally;
1877 }
1878 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001879
Guido van Rossum60456fd1997-04-09 17:36:32 +00001880 case 'f':
1881 if (type == &PyFloat_Type) {
1882 res = save_float(self, args);
1883 goto finally;
1884 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001885 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001886
Guido van Rossum60456fd1997-04-09 17:36:32 +00001887 case 't':
1888 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001889 if (self->bin) res = save_empty_tuple(self, args);
1890 else res = save_tuple(self, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001891 goto finally;
1892 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001893 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001894
Guido van Rossum60456fd1997-04-09 17:36:32 +00001895 case 's':
Guido van Rossum053b8df1998-11-25 16:18:00 +00001896 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001897 res = save_string(self, args, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001898 goto finally;
1899 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001900
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001901#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001902 case 'u':
1903 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1904 res = save_unicode(self, args, 0);
1905 goto finally;
1906 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001907#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00001908 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001909
Guido van Rossum60456fd1997-04-09 17:36:32 +00001910 if (args->ob_refcnt > 1) {
Guido van Rossum534b7c52000-06-28 22:23:56 +00001911 UNLESS (py_ob_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001912 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001913
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001914 if (PyDict_GetItem(self->memo, py_ob_id)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001915 if (get(self, py_ob_id) < 0)
1916 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001917
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918 res = 0;
1919 goto finally;
1920 }
1921 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Guido van Rossum60456fd1997-04-09 17:36:32 +00001923 switch (type->tp_name[0]) {
1924 case 's':
1925 if (type == &PyString_Type) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001926 res = save_string(self, args, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001927 goto finally;
1928 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001929 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001930
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001931#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001932 case 'u':
1933 if (type == &PyUnicode_Type) {
1934 res = save_unicode(self, args, 1);
1935 goto finally;
1936 }
1937 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001938#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001939
Guido van Rossum60456fd1997-04-09 17:36:32 +00001940 case 't':
1941 if (type == &PyTuple_Type) {
1942 res = save_tuple(self, args);
1943 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001944 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001945 if (type == &PyType_Type) {
1946 res = save_global(self, args, NULL);
1947 goto finally;
1948 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001949 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001950
Guido van Rossum60456fd1997-04-09 17:36:32 +00001951 case 'l':
1952 if (type == &PyList_Type) {
1953 res = save_list(self, args);
1954 goto finally;
1955 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001956 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001957
1958 case 'd':
1959 if (type == &PyDict_Type) {
1960 res = save_dict(self, args);
Tim Peters84e87f32001-03-17 04:50:51 +00001961 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001962 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001963 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964
1965 case 'i':
1966 if (type == &PyInstance_Type) {
1967 res = save_inst(self, args);
1968 goto finally;
1969 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001970 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001971
1972 case 'c':
1973 if (type == &PyClass_Type) {
1974 res = save_global(self, args, NULL);
1975 goto finally;
1976 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001977 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001978
1979 case 'f':
1980 if (type == &PyFunction_Type) {
1981 res = save_global(self, args, NULL);
1982 goto finally;
1983 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001984 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001985
1986 case 'b':
1987 if (type == &PyCFunction_Type) {
1988 res = save_global(self, args, NULL);
1989 goto finally;
1990 }
1991 }
1992
1993 if (!pers_save && self->inst_pers_func) {
1994 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
1995 res = tmp;
1996 goto finally;
1997 }
1998 }
1999
Guido van Rossum142eeb81997-08-13 03:14:41 +00002000 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002001 Py_INCREF(__reduce__);
2002
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003 Py_INCREF(args);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002004 ARG_TUP(self, args);
2005 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002006 t = PyObject_Call(__reduce__, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002007 FREE_ARG_TUP(self);
2008 }
2009 if (! t) goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002010 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002011 else {
2012 PyErr_Clear();
2013
Guido van Rossum142eeb81997-08-13 03:14:41 +00002014 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002015 UNLESS (t = PyObject_Call(__reduce__, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002016 goto finally;
2017 }
2018 else {
2019 PyErr_Clear();
2020 }
2021 }
2022
2023 if (t) {
2024 if (PyString_Check(t)) {
2025 res = save_global(self, args, t);
2026 goto finally;
2027 }
Tim Peters84e87f32001-03-17 04:50:51 +00002028
Guido van Rossum60456fd1997-04-09 17:36:32 +00002029 if (!PyTuple_Check(t)) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00002030 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031 "be a tuple", "O", __reduce__);
2032 goto finally;
2033 }
2034
2035 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002036
Guido van Rossum60456fd1997-04-09 17:36:32 +00002037 if ((size != 3) && (size != 2)) {
Tim Peters84e87f32001-03-17 04:50:51 +00002038 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002039 "contain only two or three elements", "O", __reduce__);
2040 goto finally;
2041 }
Tim Peters84e87f32001-03-17 04:50:51 +00002042
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002044
Guido van Rossum60456fd1997-04-09 17:36:32 +00002045 arg_tup = PyTuple_GET_ITEM(t, 1);
2046
2047 if (size > 2) {
2048 state = PyTuple_GET_ITEM(t, 2);
2049 }
2050
Guido van Rossum053b8df1998-11-25 16:18:00 +00002051 UNLESS (PyTuple_Check(arg_tup) || arg_tup==Py_None) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00002052 cPickle_ErrFormat(PicklingError, "Second element of tuple "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002053 "returned by %s must be a tuple", "O", __reduce__);
2054 goto finally;
2055 }
2056
2057 res = save_reduce(self, callable, arg_tup, state, args);
2058 goto finally;
2059 }
2060
Guido van Rossumc03158b1999-06-09 15:23:31 +00002061 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002062
2063finally:
2064 Py_XDECREF(py_ob_id);
2065 Py_XDECREF(__reduce__);
2066 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002067
Guido van Rossum60456fd1997-04-09 17:36:32 +00002068 return res;
2069}
2070
2071
2072static int
2073dump(Picklerobject *self, PyObject *args) {
2074 static char stop = STOP;
2075
2076 if (save(self, args, 0) < 0)
2077 return -1;
2078
2079 if ((*self->write_func)(self, &stop, 1) < 0)
2080 return -1;
2081
2082 if ((*self->write_func)(self, NULL, 0) < 0)
2083 return -1;
2084
2085 return 0;
2086}
2087
2088static PyObject *
Guido van Rossum053b8df1998-11-25 16:18:00 +00002089Pickle_clear_memo(Picklerobject *self, PyObject *args) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002090 if (!PyArg_ParseTuple(args,":clear_memo"))
2091 return NULL;
2092 if (self->memo)
2093 PyDict_Clear(self->memo);
2094 Py_INCREF(Py_None);
2095 return Py_None;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002096}
2097
2098static PyObject *
2099Pickle_getvalue(Picklerobject *self, PyObject *args) {
2100 int l, i, rsize, ssize, clear=1, lm;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002101 long ik;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002102 PyObject *k, *r;
2103 char *s, *p, *have_get;
2104 Pdata *data;
2105
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002106 /* Can be called by Python code or C code */
2107 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2108 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002109
2110 /* Check to make sure we are based on a list */
2111 if (! Pdata_Check(self->file)) {
2112 PyErr_SetString(PicklingError,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002113 "Attempt to getvalue() a non-list-based pickler");
Guido van Rossum053b8df1998-11-25 16:18:00 +00002114 return NULL;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002115 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002116
2117 /* flush write buffer */
2118 if (write_other(self, NULL, 0) < 0) return NULL;
2119
2120 data=(Pdata*)self->file;
2121 l=data->length;
2122
2123 /* set up an array to hold get/put status */
2124 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2125 lm++;
Tim Peters84e87f32001-03-17 04:50:51 +00002126 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002127 memset(have_get,0,lm);
2128
2129 /* Scan for gets. */
2130 for (rsize=0, i=l; --i >= 0; ) {
2131 k=data->data[i];
Tim Peters84e87f32001-03-17 04:50:51 +00002132
Guido van Rossum053b8df1998-11-25 16:18:00 +00002133 if (PyString_Check(k)) {
2134 rsize += PyString_GET_SIZE(k);
2135 }
2136
2137 else if (PyInt_Check(k)) { /* put */
2138 ik=PyInt_AS_LONG((PyIntObject*)k);
2139 if (ik >= lm || ik==0) {
2140 PyErr_SetString(PicklingError,
2141 "Invalid get data");
2142 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002143 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002144 if (have_get[ik]) { /* with matching get */
2145 if (ik < 256) rsize += 2;
2146 else rsize+=5;
2147 }
2148 }
2149
2150 else if (! (PyTuple_Check(k) &&
2151 PyTuple_GET_SIZE(k) == 2 &&
2152 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2153 ) {
2154 PyErr_SetString(PicklingError,
2155 "Unexpected data in internal list");
2156 return NULL;
2157 }
2158
2159 else { /* put */
2160 ik=PyInt_AS_LONG((PyIntObject*)k);
2161 if (ik >= lm || ik==0) {
2162 PyErr_SetString(PicklingError,
2163 "Invalid get data");
2164 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002165 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002166 have_get[ik]=1;
2167 if (ik < 256) rsize += 2;
2168 else rsize+=5;
2169 }
2170
2171 }
2172
2173 /* Now generate the result */
2174 UNLESS (r=PyString_FromStringAndSize(NULL,rsize)) goto err;
2175 s=PyString_AS_STRING((PyStringObject*)r);
2176
2177 for (i=0; i<l; i++) {
2178 k=data->data[i];
2179
2180 if (PyString_Check(k)) {
2181 ssize=PyString_GET_SIZE(k);
2182 if (ssize) {
2183 p=PyString_AS_STRING((PyStringObject*)k);
2184 while (--ssize >= 0) *s++=*p++;
2185 }
2186 }
2187
2188 else if (PyTuple_Check(k)) { /* get */
2189 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2190 if (ik < 256) {
2191 *s++ = BINGET;
2192 *s++ = (int)(ik & 0xff);
2193 }
2194 else {
2195 *s++ = LONG_BINGET;
2196 *s++ = (int)(ik & 0xff);
2197 *s++ = (int)((ik >> 8) & 0xff);
2198 *s++ = (int)((ik >> 16) & 0xff);
2199 *s++ = (int)((ik >> 24) & 0xff);
2200 }
2201 }
2202
2203 else { /* put */
2204 ik=PyInt_AS_LONG((PyIntObject*)k);
2205
2206 if (have_get[ik]) { /* with matching get */
2207 if (ik < 256) {
2208 *s++ = BINPUT;
2209 *s++ = (int)(ik & 0xff);
2210 }
2211 else {
2212 *s++ = LONG_BINPUT;
2213 *s++ = (int)(ik & 0xff);
2214 *s++ = (int)((ik >> 8) & 0xff);
2215 *s++ = (int)((ik >> 16) & 0xff);
2216 *s++ = (int)((ik >> 24) & 0xff);
2217 }
2218 }
2219 }
2220
2221 }
2222
2223 if (clear) {
2224 PyDict_Clear(self->memo);
2225 Pdata_clear(data,0);
2226 }
Tim Peters84e87f32001-03-17 04:50:51 +00002227
Guido van Rossum053b8df1998-11-25 16:18:00 +00002228 free(have_get);
2229 return r;
2230err:
2231 free(have_get);
2232 return NULL;
2233}
2234
2235static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002236Pickler_dump(Picklerobject *self, PyObject *args) {
2237 PyObject *ob;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002238 int get=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002239
Guido van Rossum43713e52000-02-29 13:59:29 +00002240 UNLESS (PyArg_ParseTuple(args, "O|i:dump", &ob, &get))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002241 return NULL;
2242
2243 if (dump(self, ob) < 0)
2244 return NULL;
2245
Guido van Rossum053b8df1998-11-25 16:18:00 +00002246 if (get) return Pickle_getvalue(self, NULL);
2247
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002248 /* XXX Why does dump() return self? */
Guido van Rossum053b8df1998-11-25 16:18:00 +00002249 Py_INCREF(self);
2250 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002251}
2252
2253
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002254static struct PyMethodDef Pickler_methods[] = {
Guido van Rossum142eeb81997-08-13 03:14:41 +00002255 {"dump", (PyCFunction)Pickler_dump, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002256 "dump(object) --"
2257 "Write an object in pickle format to the object's pickle stream\n"
2258 },
Guido van Rossum142eeb81997-08-13 03:14:41 +00002259 {"clear_memo", (PyCFunction)Pickle_clear_memo, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002260 "clear_memo() -- Clear the picklers memo"},
Guido van Rossum053b8df1998-11-25 16:18:00 +00002261 {"getvalue", (PyCFunction)Pickle_getvalue, 1,
2262 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002263 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002264};
2265
2266
2267static Picklerobject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002268newPicklerobject(PyObject *file, int bin) {
2269 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002270
Guido van Rossumb18618d2000-05-03 23:44:39 +00002271 UNLESS (self = PyObject_New(Picklerobject, &Picklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002272 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002273
2274 self->fp = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002275 self->write = NULL;
2276 self->memo = NULL;
2277 self->arg = NULL;
2278 self->pers_func = NULL;
2279 self->inst_pers_func = NULL;
2280 self->write_buf = NULL;
2281 self->bin = bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002282 self->fast = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002283 self->fast_container = 0;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00002284 self->fast_memo = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002285 self->buf_size = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002286 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002287
Guido van Rossum053b8df1998-11-25 16:18:00 +00002288 if (file)
2289 Py_INCREF(file);
2290 else
Guido van Rossum50f385c1998-12-04 18:48:44 +00002291 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002292
2293 UNLESS (self->file = file)
Guido van Rossum83addc72000-04-21 20:49:36 +00002294 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002295
Tim Peters84e87f32001-03-17 04:50:51 +00002296 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00002297 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002298
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299 if (PyFile_Check(file)) {
2300 self->fp = PyFile_AsFile(file);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002301 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00002302 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2303 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002304 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002305 self->write_func = write_file;
2306 }
2307 else if (PycStringIO_OutputCheck(file)) {
2308 self->write_func = write_cStringIO;
2309 }
Guido van Rossum142eeb81997-08-13 03:14:41 +00002310 else if (file == Py_None) {
2311 self->write_func = write_none;
2312 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002313 else {
2314 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002315
Guido van Rossum053b8df1998-11-25 16:18:00 +00002316 if (! Pdata_Check(file)) {
2317 UNLESS (self->write = PyObject_GetAttr(file, write_str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002318 PyErr_Clear();
2319 PyErr_SetString(PyExc_TypeError, "argument must have 'write' "
Guido van Rossum053b8df1998-11-25 16:18:00 +00002320 "attribute");
2321 goto err;
2322 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002323 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002324
Tim Peters84e87f32001-03-17 04:50:51 +00002325 UNLESS (self->write_buf =
2326 (char *)malloc(WRITE_BUF_SIZE * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002327 PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002328 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002329 }
2330 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Guido van Rossum053b8df1998-11-25 16:18:00 +00002332 if (PyEval_GetRestricted()) {
2333 /* Restricted execution, get private tables */
2334 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002335
Guido van Rossum053b8df1998-11-25 16:18:00 +00002336 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
2337 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2338 Py_DECREF(m);
2339 UNLESS (self->dispatch_table) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002340 }
2341 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002342 self->dispatch_table=dispatch_table;
2343 Py_INCREF(dispatch_table);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002344 }
2345
Guido van Rossum60456fd1997-04-09 17:36:32 +00002346 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002347
2348err:
2349 Py_DECREF((PyObject *)self);
2350 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002351}
2352
2353
2354static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002355get_Pickler(PyObject *self, PyObject *args) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002356 PyObject *file = NULL;
2357 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002358
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002359 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002360 PyErr_Clear();
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002361 bin = 0;
2362 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2363 return NULL;
2364 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002365 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002366}
2367
2368
2369static void
Guido van Rossum60456fd1997-04-09 17:36:32 +00002370Pickler_dealloc(Picklerobject *self) {
2371 Py_XDECREF(self->write);
2372 Py_XDECREF(self->memo);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +00002373 Py_XDECREF(self->fast_memo);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002374 Py_XDECREF(self->arg);
2375 Py_XDECREF(self->file);
2376 Py_XDECREF(self->pers_func);
2377 Py_XDECREF(self->inst_pers_func);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002378 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002379
Tim Peters84e87f32001-03-17 04:50:51 +00002380 if (self->write_buf) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002381 free(self->write_buf);
2382 }
2383
Guido van Rossumb18618d2000-05-03 23:44:39 +00002384 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002385}
2386
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002387static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002388Pickler_get_pers_func(Picklerobject *p)
2389{
2390 if (p->pers_func == NULL)
2391 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2392 else
2393 Py_INCREF(p->pers_func);
2394 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002395}
2396
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002397static int
2398Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2399{
2400 if (v == NULL) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002401 PyErr_SetString(PyExc_TypeError,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002402 "attribute deletion is not supported");
Guido van Rossum053b8df1998-11-25 16:18:00 +00002403 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002404 }
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002405 Py_XDECREF(p->pers_func);
2406 Py_INCREF(v);
2407 p->pers_func = v;
2408 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002409}
2410
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002411static int
2412Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2413{
2414 if (v == NULL) {
2415 PyErr_SetString(PyExc_TypeError,
2416 "attribute deletion is not supported");
2417 return -1;
2418 }
2419 Py_XDECREF(p->inst_pers_func);
2420 Py_INCREF(v);
2421 p->inst_pers_func = v;
2422 return 0;
2423}
2424
2425static PyObject *
2426Pickler_get_memo(Picklerobject *p)
2427{
2428 if (p->memo == NULL)
2429 PyErr_SetString(PyExc_AttributeError, "memo");
2430 else
2431 Py_INCREF(p->memo);
2432 return p->memo;
2433}
2434
2435static int
2436Pickler_set_memo(Picklerobject *p, PyObject *v)
2437{
2438 if (v == NULL) {
2439 PyErr_SetString(PyExc_TypeError,
2440 "attribute deletion is not supported");
2441 return -1;
2442 }
2443 if (!PyDict_Check(v)) {
2444 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2445 return -1;
2446 }
2447 Py_XDECREF(p->memo);
2448 Py_INCREF(v);
2449 p->memo = v;
2450 return 0;
2451}
2452
2453static PyObject *
2454Pickler_get_error(Picklerobject *p)
2455{
2456 /* why is this an attribute on the Pickler? */
2457 Py_INCREF(PicklingError);
2458 return PicklingError;
2459}
2460
2461static PyMemberDef Pickler_members[] = {
2462 {"binary", T_INT, offsetof(Picklerobject, bin)},
2463 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002464 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002465};
2466
2467static PyGetSetDef Pickler_getsets[] = {
2468 {"persistent_id", (getter)Pickler_get_pers_func,
2469 (setter)Pickler_set_pers_func},
2470 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2471 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002472 {"PicklingError", (getter)Pickler_get_error, NULL},
2473 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002474};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002475
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002476static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002477"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002478
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002479static PyTypeObject Picklertype = {
2480 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002481 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002482 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002483 sizeof(Picklerobject), /*tp_basicsize*/
2484 0,
2485 (destructor)Pickler_dealloc, /* tp_dealloc */
2486 0, /* tp_print */
2487 0, /* tp_getattr */
2488 0, /* tp_setattr */
2489 0, /* tp_compare */
2490 0, /* tp_repr */
2491 0, /* tp_as_number */
2492 0, /* tp_as_sequence */
2493 0, /* tp_as_mapping */
2494 0, /* tp_hash */
2495 0, /* tp_call */
2496 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002497 0, /* set below */ /* tp_getattro */
2498 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002499 0, /* tp_as_buffer */
2500 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2501 Picklertype__doc__, /* tp_doc */
2502 0, /* tp_traverse */
2503 0, /* tp_clear */
2504 0, /* tp_richcompare */
2505 0, /* tp_weaklistoffset */
2506 0, /* tp_iter */
2507 0, /* tp_iternext */
2508 Pickler_methods, /* tp_methods */
2509 Pickler_members, /* tp_members */
2510 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002511};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002512
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002513static PyObject *
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002514find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) {
Guido van Rossume2d81cd1998-08-08 19:40:10 +00002515 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002516
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002517 if (fc) {
2518 if (fc==Py_None) {
Tim Peters84e87f32001-03-17 04:50:51 +00002519 PyErr_SetString(UnpicklingError,
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002520 "Global and instance pickles are not supported.");
2521 return NULL;
2522 }
2523 return PyObject_CallFunction(fc, "OO", py_module_name, py_global_name);
2524 }
2525
Jeremy Hyltond1055231998-08-11 19:52:51 +00002526 module = PySys_GetObject("modules");
2527 if (module == NULL)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002528 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002529
2530 module = PyDict_GetItem(module, py_module_name);
2531 if (module == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002532 module = PyImport_Import(py_module_name);
2533 if (!module)
2534 return NULL;
2535 global = PyObject_GetAttr(module, py_global_name);
2536 Py_DECREF(module);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002537 }
Jeremy Hyltond1055231998-08-11 19:52:51 +00002538 else
Guido van Rossum053b8df1998-11-25 16:18:00 +00002539 global = PyObject_GetAttr(module, py_global_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002540 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002541}
2542
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002543static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002544marker(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002545 if (self->num_marks < 1) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002546 PyErr_SetString(UnpicklingError, "could not find MARK");
2547 return -1;
2548 }
2549
2550 return self->marks[--self->num_marks];
2551}
2552
Tim Peters84e87f32001-03-17 04:50:51 +00002553
Guido van Rossum60456fd1997-04-09 17:36:32 +00002554static int
2555load_none(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002556 PDATA_APPEND(self->stack, Py_None, -1);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002557 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002558}
2559
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002560static int
Thomas Wouters58d05102000-07-24 14:43:35 +00002561bad_readline(void) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002562 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2563 return -1;
2564}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002565
2566static int
2567load_int(Unpicklerobject *self) {
2568 PyObject *py_int = 0;
2569 char *endptr, *s;
2570 int len, res = -1;
2571 long l;
2572
2573 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002574 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002575 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002576
2577 errno = 0;
2578 l = strtol(s, &endptr, 0);
2579
2580 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2581 /* Hm, maybe we've got something long. Let's try reading
Guido van Rossum053b8df1998-11-25 16:18:00 +00002582 it as a Python long object. */
Tim Peters12778e32001-08-28 22:08:34 +00002583 errno = 0;
2584 py_int = PyLong_FromString(s, NULL, 0);
2585 if (py_int == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002586 PyErr_SetString(PyExc_ValueError,
2587 "could not convert string to int");
2588 goto finally;
2589 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002590 }
2591 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002592 UNLESS (py_int = PyInt_FromLong(l)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002593 }
2594
Guido van Rossum053b8df1998-11-25 16:18:00 +00002595 free(s);
2596 PDATA_PUSH(self->stack, py_int, -1);
2597 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002598
2599finally:
2600 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002601
2602 return res;
2603}
2604
2605
Tim Peters84e87f32001-03-17 04:50:51 +00002606static long
Guido van Rossum60456fd1997-04-09 17:36:32 +00002607calc_binint(char *s, int x) {
2608 unsigned char c;
2609 int i;
2610 long l;
2611
2612 for (i = 0, l = 0L; i < x; i++) {
2613 c = (unsigned char)s[i];
2614 l |= (long)c << (i * 8);
2615 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002616#if SIZEOF_LONG > 4
2617 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2618 * is signed, so on a box with longs bigger than 4 bytes we need
2619 * to extend a BININT's sign bit to the full width.
2620 */
2621 if (x == 4 && l & (1L << 31))
2622 l |= (~0L) << 32;
2623#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00002624 return l;
2625}
2626
2627
2628static int
2629load_binintx(Unpicklerobject *self, char *s, int x) {
2630 PyObject *py_int = 0;
2631 long l;
2632
2633 l = calc_binint(s, x);
2634
Guido van Rossum053b8df1998-11-25 16:18:00 +00002635 UNLESS (py_int = PyInt_FromLong(l))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002637
Guido van Rossum053b8df1998-11-25 16:18:00 +00002638 PDATA_PUSH(self->stack, py_int, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002639 return 0;
2640}
2641
2642
2643static int
2644load_binint(Unpicklerobject *self) {
2645 char *s;
2646
2647 if ((*self->read_func)(self, &s, 4) < 0)
2648 return -1;
2649
2650 return load_binintx(self, s, 4);
2651}
2652
2653
2654static int
2655load_binint1(Unpicklerobject *self) {
2656 char *s;
2657
2658 if ((*self->read_func)(self, &s, 1) < 0)
2659 return -1;
2660
2661 return load_binintx(self, s, 1);
2662}
2663
2664
2665static int
2666load_binint2(Unpicklerobject *self) {
2667 char *s;
2668
2669 if ((*self->read_func)(self, &s, 2) < 0)
2670 return -1;
2671
2672 return load_binintx(self, s, 2);
2673}
Tim Peters84e87f32001-03-17 04:50:51 +00002674
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675static int
2676load_long(Unpicklerobject *self) {
2677 PyObject *l = 0;
2678 char *end, *s;
2679 int len, res = -1;
2680
Guido van Rossum60456fd1997-04-09 17:36:32 +00002681 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002682 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002683 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684
Guido van Rossum053b8df1998-11-25 16:18:00 +00002685 UNLESS (l = PyLong_FromString(s, &end, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686 goto finally;
2687
Guido van Rossum053b8df1998-11-25 16:18:00 +00002688 free(s);
2689 PDATA_PUSH(self->stack, l, -1);
2690 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002691
2692finally:
2693 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694
2695 return res;
2696}
2697
Tim Peters84e87f32001-03-17 04:50:51 +00002698
Guido van Rossum60456fd1997-04-09 17:36:32 +00002699static int
2700load_float(Unpicklerobject *self) {
2701 PyObject *py_float = 0;
2702 char *endptr, *s;
2703 int len, res = -1;
2704 double d;
2705
2706 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002707 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002708 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002709
2710 errno = 0;
2711 d = strtod(s, &endptr);
2712
2713 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
Tim Peters84e87f32001-03-17 04:50:51 +00002714 PyErr_SetString(PyExc_ValueError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00002715 "could not convert string to float");
2716 goto finally;
2717 }
2718
Guido van Rossum053b8df1998-11-25 16:18:00 +00002719 UNLESS (py_float = PyFloat_FromDouble(d))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002720 goto finally;
2721
Guido van Rossum053b8df1998-11-25 16:18:00 +00002722 free(s);
2723 PDATA_PUSH(self->stack, py_float, -1);
2724 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002725
2726finally:
2727 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728
2729 return res;
2730}
2731
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732static int
2733load_binfloat(Unpicklerobject *self) {
2734 PyObject *py_float = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00002735 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002736 long fhi, flo;
2737 double x;
2738 char *p;
2739
2740 if ((*self->read_func)(self, &p, 8) < 0)
2741 return -1;
2742
2743 /* First byte */
2744 s = (*p>>7) & 1;
2745 e = (*p & 0x7F) << 4;
2746 p++;
2747
2748 /* Second byte */
2749 e |= (*p>>4) & 0xF;
2750 fhi = (*p & 0xF) << 24;
2751 p++;
2752
2753 /* Third byte */
2754 fhi |= (*p & 0xFF) << 16;
2755 p++;
2756
2757 /* Fourth byte */
2758 fhi |= (*p & 0xFF) << 8;
2759 p++;
2760
2761 /* Fifth byte */
2762 fhi |= *p & 0xFF;
2763 p++;
2764
2765 /* Sixth byte */
2766 flo = (*p & 0xFF) << 16;
2767 p++;
2768
2769 /* Seventh byte */
2770 flo |= (*p & 0xFF) << 8;
2771 p++;
2772
2773 /* Eighth byte */
2774 flo |= *p & 0xFF;
2775
2776 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2777 x /= 268435456.0; /* 2**28 */
2778
2779 /* XXX This sadly ignores Inf/NaN */
2780 if (e == 0)
2781 e = -1022;
2782 else {
2783 x += 1.0;
2784 e -= 1023;
2785 }
2786 x = ldexp(x, e);
2787
2788 if (s)
2789 x = -x;
2790
Guido van Rossum053b8df1998-11-25 16:18:00 +00002791 UNLESS (py_float = PyFloat_FromDouble(x)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Guido van Rossum053b8df1998-11-25 16:18:00 +00002793 PDATA_PUSH(self->stack, py_float, -1);
2794 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002795}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796
2797static int
2798load_string(Unpicklerobject *self) {
2799 PyObject *str = 0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002800 int len, res = -1, nslash;
2801 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002802
2803 static PyObject *eval_dict = 0;
2804
2805 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002806 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002807 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002809 /* Check for unquoted quotes (evil strings) */
2810 q=*s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002811 if (q != '"' && q != '\'') goto insecure;
2812 for (p=s+1, nslash=0; *p; p++) {
2813 if (*p==q && nslash%2==0) break;
2814 if (*p=='\\') nslash++;
2815 else nslash=0;
Tim Petersbf5ca652001-11-12 22:26:10 +00002816 }
2817 if (*p == q) {
2818 for (p++; *p; p++)
2819 if (*(unsigned char *)p > ' ')
2820 goto insecure;
2821 }
2822 else
2823 goto insecure;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002824 /********************************************/
2825
Guido van Rossum053b8df1998-11-25 16:18:00 +00002826 UNLESS (eval_dict)
2827 UNLESS (eval_dict = Py_BuildValue("{s{}}", "__builtins__"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828 goto finally;
2829
Guido van Rossum053b8df1998-11-25 16:18:00 +00002830 UNLESS (str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002831 goto finally;
2832
Guido van Rossum053b8df1998-11-25 16:18:00 +00002833 free(s);
2834 PDATA_PUSH(self->stack, str, -1);
2835 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
2837finally:
2838 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839
2840 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002841
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002842insecure:
2843 free(s);
2844 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2845 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002846}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002847
2848
2849static int
2850load_binstring(Unpicklerobject *self) {
2851 PyObject *py_string = 0;
2852 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853 char *s;
2854
Guido van Rossum053b8df1998-11-25 16:18:00 +00002855 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
2857 l = calc_binint(s, 4);
2858
2859 if ((*self->read_func)(self, &s, l) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002860 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Guido van Rossum053b8df1998-11-25 16:18:00 +00002862 UNLESS (py_string = PyString_FromStringAndSize(s, l))
2863 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
Guido van Rossum053b8df1998-11-25 16:18:00 +00002865 PDATA_PUSH(self->stack, py_string, -1);
2866 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867}
2868
2869
2870static int
2871load_short_binstring(Unpicklerobject *self) {
2872 PyObject *py_string = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002873 unsigned char l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002874 char *s;
2875
2876 if ((*self->read_func)(self, &s, 1) < 0)
2877 return -1;
2878
2879 l = (unsigned char)s[0];
2880
Guido van Rossum053b8df1998-11-25 16:18:00 +00002881 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002882
Guido van Rossum053b8df1998-11-25 16:18:00 +00002883 UNLESS (py_string = PyString_FromStringAndSize(s, l)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002884
Guido van Rossum053b8df1998-11-25 16:18:00 +00002885 PDATA_PUSH(self->stack, py_string, -1);
2886 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002887}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002888
2889
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002890#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002892load_unicode(Unpicklerobject *self) {
2893 PyObject *str = 0;
2894 int len, res = -1;
2895 char *s;
2896
2897 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00002898 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002899
2900 UNLESS (str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))
2901 goto finally;
2902
2903 PDATA_PUSH(self->stack, str, -1);
2904 return 0;
2905
2906finally:
2907 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002908}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002909#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002910
2911
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002912#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002913static int
2914load_binunicode(Unpicklerobject *self) {
2915 PyObject *unicode;
2916 long l;
2917 char *s;
2918
2919 if ((*self->read_func)(self, &s, 4) < 0) return -1;
2920
2921 l = calc_binint(s, 4);
2922
2923 if ((*self->read_func)(self, &s, l) < 0)
2924 return -1;
2925
2926 UNLESS (unicode = PyUnicode_DecodeUTF8(s, l, NULL))
2927 return -1;
2928
2929 PDATA_PUSH(self->stack, unicode, -1);
2930 return 0;
2931}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002932#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002933
2934
2935static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936load_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002937 PyObject *tup;
2938 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Guido van Rossum053b8df1998-11-25 16:18:00 +00002940 if ((i = marker(self)) < 0) return -1;
2941 UNLESS (tup=Pdata_popTuple(self->stack, i)) return -1;
2942 PDATA_PUSH(self->stack, tup, -1);
2943 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944}
2945
2946static int
2947load_empty_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002948 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Guido van Rossum053b8df1998-11-25 16:18:00 +00002950 UNLESS (tup=PyTuple_New(0)) return -1;
2951 PDATA_PUSH(self->stack, tup, -1);
2952 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953}
2954
2955static int
2956load_empty_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002957 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002958
Guido van Rossum053b8df1998-11-25 16:18:00 +00002959 UNLESS (list=PyList_New(0)) return -1;
2960 PDATA_PUSH(self->stack, list, -1);
2961 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962}
2963
2964static int
2965load_empty_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002966 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
Guido van Rossum053b8df1998-11-25 16:18:00 +00002968 UNLESS (dict=PyDict_New()) return -1;
2969 PDATA_PUSH(self->stack, dict, -1);
2970 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971}
2972
2973
2974static int
2975load_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002976 PyObject *list = 0;
2977 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978
Guido van Rossum053b8df1998-11-25 16:18:00 +00002979 if ((i = marker(self)) < 0) return -1;
2980 UNLESS (list=Pdata_popList(self->stack, i)) return -1;
2981 PDATA_PUSH(self->stack, list, -1);
2982 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983}
2984
2985static int
2986load_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002987 PyObject *dict, *key, *value;
2988 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989
Guido van Rossum053b8df1998-11-25 16:18:00 +00002990 if ((i = marker(self)) < 0) return -1;
2991 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002992
Guido van Rossum053b8df1998-11-25 16:18:00 +00002993 UNLESS (dict = PyDict_New()) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002994
Guido van Rossum053b8df1998-11-25 16:18:00 +00002995 for (k = i+1; k < j; k += 2) {
2996 key =self->stack->data[k-1];
2997 value=self->stack->data[k ];
2998 if (PyDict_SetItem(dict, key, value) < 0) {
2999 Py_DECREF(dict);
3000 return -1;
3001 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003003 Pdata_clear(self->stack, i);
3004 PDATA_PUSH(self->stack, dict, -1);
3005 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006}
3007
3008static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003009Instance_New(PyObject *cls, PyObject *args) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010 int has_key;
3011 PyObject *safe=0, *r=0;
3012
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003013 if (PyClass_Check(cls)) {
3014 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003015
Jeremy Hylton03657cf2000-07-12 13:05:33 +00003016 if ((l=PyObject_Size(args)) < 0) goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003017 UNLESS (l) {
3018 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003019
Guido van Rossum053b8df1998-11-25 16:18:00 +00003020 UNLESS (__getinitargs__=PyObject_GetAttr(cls, __getinitargs___str)) {
3021 /* We have a class with no __getinitargs__, so bypass usual
3022 construction */
Fred Drake2c773552001-03-22 17:52:17 +00003023 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003024
Guido van Rossum053b8df1998-11-25 16:18:00 +00003025 PyErr_Clear();
Fred Drake2c773552001-03-22 17:52:17 +00003026 UNLESS (inst=PyInstance_NewRaw(cls, NULL))
Guido van Rossum053b8df1998-11-25 16:18:00 +00003027 goto err;
Fred Drake2c773552001-03-22 17:52:17 +00003028 return inst;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003029 }
3030 Py_DECREF(__getinitargs__);
3031 }
Tim Peters84e87f32001-03-17 04:50:51 +00003032
Guido van Rossum053b8df1998-11-25 16:18:00 +00003033 if ((r=PyInstance_New(cls, args, NULL))) return r;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003034 else goto err;
3035 }
Tim Peters84e87f32001-03-17 04:50:51 +00003036
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003037 /* Is safe_constructors always a dict? */
3038 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003039 if (!has_key)
Guido van Rossum053b8df1998-11-25 16:18:00 +00003040 if (!(safe = PyObject_GetAttr(cls, __safe_for_unpickling___str)) ||
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041 !PyObject_IsTrue(safe)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003042 cPickle_ErrFormat(UnpicklingError,
3043 "%s is not safe for unpickling", "O", cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044 Py_XDECREF(safe);
3045 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003046 }
3047
Guido van Rossum053b8df1998-11-25 16:18:00 +00003048 if (args==Py_None) {
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003049 /* Special case, call cls.__basicnew__() */
3050 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003051
Guido van Rossum053b8df1998-11-25 16:18:00 +00003052 UNLESS (basicnew=PyObject_GetAttr(cls, __basicnew___str)) return NULL;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003053 r=PyObject_CallObject(basicnew, NULL);
3054 Py_DECREF(basicnew);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003055 if (r) return r;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003056 }
3057
Guido van Rossum053b8df1998-11-25 16:18:00 +00003058 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003059
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060err:
3061 {
3062 PyObject *tp, *v, *tb;
3063
3064 PyErr_Fetch(&tp, &v, &tb);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003065 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3066 Py_XDECREF(v);
3067 v=r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068 }
3069 PyErr_Restore(tp,v,tb);
3070 }
3071 return NULL;
3072}
Tim Peters84e87f32001-03-17 04:50:51 +00003073
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074
3075static int
3076load_obj(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003077 PyObject *class, *tup, *obj=0;
3078 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079
Guido van Rossum053b8df1998-11-25 16:18:00 +00003080 if ((i = marker(self)) < 0) return -1;
3081 UNLESS (tup=Pdata_popTuple(self->stack, i+1)) return -1;
3082 PDATA_POP(self->stack, class);
3083 if (class) {
3084 obj = Instance_New(class, tup);
3085 Py_DECREF(class);
3086 }
3087 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Guido van Rossum053b8df1998-11-25 16:18:00 +00003089 if (! obj) return -1;
3090 PDATA_PUSH(self->stack, obj, -1);
3091 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092}
3093
3094
3095static int
3096load_inst(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003097 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003098 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099 char *s;
3100
Guido van Rossum053b8df1998-11-25 16:18:00 +00003101 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003102
Guido van Rossum053b8df1998-11-25 16:18:00 +00003103 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003104 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003105 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003106
Guido van Rossum053b8df1998-11-25 16:18:00 +00003107 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003108 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003109 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003110 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003111 Py_DECREF(class_name);
3112 }
3113 }
3114 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003115
Guido van Rossum053b8df1998-11-25 16:18:00 +00003116 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003117
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003118 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003119 obj = Instance_New(class, tup);
3120 Py_DECREF(tup);
3121 }
3122 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003123
Guido van Rossum053b8df1998-11-25 16:18:00 +00003124 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003125
Guido van Rossum053b8df1998-11-25 16:18:00 +00003126 PDATA_PUSH(self->stack, obj, -1);
3127 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003128}
3129
3130
3131static int
3132load_global(Unpicklerobject *self) {
3133 PyObject *class = 0, *module_name = 0, *class_name = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003134 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135 char *s;
3136
Guido van Rossum053b8df1998-11-25 16:18:00 +00003137 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003138 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003139 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003140
Guido van Rossum053b8df1998-11-25 16:18:00 +00003141 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003142 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003143 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003144 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003145 Py_DECREF(class_name);
3146 }
3147 }
3148 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Guido van Rossum053b8df1998-11-25 16:18:00 +00003150 if (! class) return -1;
3151 PDATA_PUSH(self->stack, class, -1);
3152 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153}
3154
3155
3156static int
3157load_persid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003158 PyObject *pid = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003159 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003160 char *s;
3161
3162 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003163 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003164 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003165
Guido van Rossum053b8df1998-11-25 16:18:00 +00003166 UNLESS (pid = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167
Guido van Rossum053b8df1998-11-25 16:18:00 +00003168 if (PyList_Check(self->pers_func)) {
3169 if (PyList_Append(self->pers_func, pid) < 0) {
3170 Py_DECREF(pid);
3171 return -1;
3172 }
3173 }
3174 else {
3175 ARG_TUP(self, pid);
3176 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003177 pid = PyObject_Call(self->pers_func, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003178 FREE_ARG_TUP(self);
3179 }
3180 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003181
Guido van Rossum053b8df1998-11-25 16:18:00 +00003182 if (! pid) return -1;
3183
3184 PDATA_PUSH(self->stack, pid, -1);
3185 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003186 }
3187 else {
3188 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003189 "A load persistent id instruction was encountered,\n"
3190 "but no persistent_load function was specified.");
3191 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193}
3194
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195static int
3196load_binpersid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003197 PyObject *pid = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198
3199 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003200 PDATA_POP(self->stack, pid);
3201 if (! pid) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202
Guido van Rossum053b8df1998-11-25 16:18:00 +00003203 if (PyList_Check(self->pers_func)) {
3204 if (PyList_Append(self->pers_func, pid) < 0) {
3205 Py_DECREF(pid);
3206 return -1;
3207 }
3208 }
3209 else {
3210 ARG_TUP(self, pid);
3211 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003212 pid = PyObject_Call(self->pers_func, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003213 FREE_ARG_TUP(self);
3214 }
3215 if (! pid) return -1;
3216 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217
Guido van Rossum053b8df1998-11-25 16:18:00 +00003218 PDATA_PUSH(self->stack, pid, -1);
3219 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003221 else {
3222 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003223 "A load persistent id instruction was encountered,\n"
3224 "but no persistent_load function was specified.");
3225 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003226 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227}
3228
3229
3230static int
3231load_pop(Unpicklerobject *self) {
3232 int len;
3233
Guido van Rossum053b8df1998-11-25 16:18:00 +00003234 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235
Tim Peters84e87f32001-03-17 04:50:51 +00003236 /* Note that we split the (pickle.py) stack into two stacks,
Guido van Rossumea2b7152000-05-09 18:14:50 +00003237 an object stack and a mark stack. We have to be clever and
3238 pop the right one. We do this by looking at the top of the
3239 mark stack.
3240 */
3241
Tim Peters84e87f32001-03-17 04:50:51 +00003242 if ((self->num_marks > 0) &&
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243 (self->marks[self->num_marks - 1] == len))
3244 self->num_marks--;
Tim Peters84e87f32001-03-17 04:50:51 +00003245 else {
Guido van Rossumea2b7152000-05-09 18:14:50 +00003246 len--;
3247 Py_DECREF(self->stack->data[len]);
3248 self->stack->length=len;
3249 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003250
3251 return 0;
3252}
3253
3254
3255static int
3256load_pop_mark(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003257 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003258
3259 if ((i = marker(self)) < 0)
3260 return -1;
3261
Guido van Rossum053b8df1998-11-25 16:18:00 +00003262 Pdata_clear(self->stack, i);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003263
3264 return 0;
3265}
3266
3267
3268static int
3269load_dup(Unpicklerobject *self) {
3270 PyObject *last;
3271 int len;
3272
Guido van Rossum053b8df1998-11-25 16:18:00 +00003273 if ((len = self->stack->length) <= 0) return stackUnderflow();
3274 last=self->stack->data[len-1];
3275 Py_INCREF(last);
3276 PDATA_PUSH(self->stack, last, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277 return 0;
3278}
3279
3280
3281static int
3282load_get(Unpicklerobject *self) {
3283 PyObject *py_str = 0, *value = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003284 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003286 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
Guido van Rossum053b8df1998-11-25 16:18:00 +00003288 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003289 if (len < 2) return bad_readline();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003290
Guido van Rossum053b8df1998-11-25 16:18:00 +00003291 UNLESS (py_str = PyString_FromStringAndSize(s, len - 1)) return -1;
3292
3293 value = PyDict_GetItem(self->memo, py_str);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003294 if (! value) {
3295 PyErr_SetObject(BadPickleGet, py_str);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003296 rc = -1;
3297 } else {
3298 PDATA_APPEND(self->stack, value, -1);
3299 rc = 0;
3300 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003301
Guido van Rossum2f80d961999-07-13 15:18:58 +00003302 Py_DECREF(py_str);
3303 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304}
3305
3306
3307static int
3308load_binget(Unpicklerobject *self) {
3309 PyObject *py_key = 0, *value = 0;
3310 unsigned char key;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003312 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313
Guido van Rossum053b8df1998-11-25 16:18:00 +00003314 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003315
3316 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003317 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003318
Guido van Rossum053b8df1998-11-25 16:18:00 +00003319 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003320 if (! value) {
3321 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003322 rc = -1;
3323 } else {
3324 PDATA_APPEND(self->stack, value, -1);
3325 rc = 0;
3326 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327
Guido van Rossum2f80d961999-07-13 15:18:58 +00003328 Py_DECREF(py_key);
3329 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003330}
3331
3332
3333static int
3334load_long_binget(Unpicklerobject *self) {
3335 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003336 unsigned char c;
3337 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338 long key;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003339 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003340
Guido van Rossum053b8df1998-11-25 16:18:00 +00003341 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342
3343 c = (unsigned char)s[0];
3344 key = (long)c;
3345 c = (unsigned char)s[1];
3346 key |= (long)c << 8;
3347 c = (unsigned char)s[2];
3348 key |= (long)c << 16;
3349 c = (unsigned char)s[3];
3350 key |= (long)c << 24;
3351
Guido van Rossum053b8df1998-11-25 16:18:00 +00003352 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003353
Guido van Rossum053b8df1998-11-25 16:18:00 +00003354 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003355 if (! value) {
3356 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003357 rc = -1;
3358 } else {
3359 PDATA_APPEND(self->stack, value, -1);
3360 rc = 0;
3361 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362
Guido van Rossum2f80d961999-07-13 15:18:58 +00003363 Py_DECREF(py_key);
3364 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365}
3366
3367
3368static int
3369load_put(Unpicklerobject *self) {
3370 PyObject *py_str = 0, *value = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003371 int len, l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372 char *s;
3373
Guido van Rossum053b8df1998-11-25 16:18:00 +00003374 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumd1f66dc1999-02-08 22:38:25 +00003375 if (l < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003376 UNLESS (len=self->stack->length) return stackUnderflow();
3377 UNLESS (py_str = PyString_FromStringAndSize(s, l - 1)) return -1;
3378 value=self->stack->data[len-1];
3379 l=PyDict_SetItem(self->memo, py_str, value);
3380 Py_DECREF(py_str);
3381 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382}
3383
3384
3385static int
3386load_binput(Unpicklerobject *self) {
3387 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003388 unsigned char key;
3389 char *s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003390 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003391
Guido van Rossum053b8df1998-11-25 16:18:00 +00003392 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3393 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003394
3395 key = (unsigned char)s[0];
3396
Guido van Rossum053b8df1998-11-25 16:18:00 +00003397 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3398 value=self->stack->data[len-1];
3399 len=PyDict_SetItem(self->memo, py_key, value);
3400 Py_DECREF(py_key);
3401 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402}
3403
3404
3405static int
3406load_long_binput(Unpicklerobject *self) {
3407 PyObject *py_key = 0, *value = 0;
3408 long key;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003409 unsigned char c;
3410 char *s;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003411 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412
Guido van Rossum053b8df1998-11-25 16:18:00 +00003413 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3414 UNLESS (len=self->stack->length) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
3416 c = (unsigned char)s[0];
3417 key = (long)c;
3418 c = (unsigned char)s[1];
3419 key |= (long)c << 8;
3420 c = (unsigned char)s[2];
3421 key |= (long)c << 16;
3422 c = (unsigned char)s[3];
3423 key |= (long)c << 24;
3424
Guido van Rossum053b8df1998-11-25 16:18:00 +00003425 UNLESS (py_key = PyInt_FromLong(key)) return -1;
3426 value=self->stack->data[len-1];
3427 len=PyDict_SetItem(self->memo, py_key, value);
3428 Py_DECREF(py_key);
3429 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430}
3431
3432
Tim Peters84e87f32001-03-17 04:50:51 +00003433static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434do_append(Unpicklerobject *self, int x) {
3435 PyObject *value = 0, *list = 0, *append_method = 0;
3436 int len, i;
3437
Guido van Rossum053b8df1998-11-25 16:18:00 +00003438 UNLESS ((len=self->stack->length) >= x && x > 0) return stackUnderflow();
3439 if (len==x) return 0; /* nothing to do */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Guido van Rossum053b8df1998-11-25 16:18:00 +00003441 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
3443 if (PyList_Check(list)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003444 PyObject *slice;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003446
Guido van Rossum053b8df1998-11-25 16:18:00 +00003447 slice=Pdata_popList(self->stack, x);
3448 list_len = PyList_GET_SIZE(list);
3449 i=PyList_SetSlice(list, list_len, list_len, slice);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450 Py_DECREF(slice);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003451 return i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452 }
3453 else {
3454
Guido van Rossum053b8df1998-11-25 16:18:00 +00003455 UNLESS (append_method = PyObject_GetAttr(list, append_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003457
Guido van Rossum60456fd1997-04-09 17:36:32 +00003458 for (i = x; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003459 PyObject *junk;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460
Guido van Rossum053b8df1998-11-25 16:18:00 +00003461 value=self->stack->data[i];
3462 junk=0;
3463 ARG_TUP(self, value);
3464 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003465 junk = PyObject_Call(append_method, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003466 FREE_ARG_TUP(self);
3467 }
3468 if (! junk) {
3469 Pdata_clear(self->stack, i+1);
3470 self->stack->length=x;
3471 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003473 }
3474 Py_DECREF(junk);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003476 self->stack->length=x;
3477 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003478 }
3479
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481}
3482
Tim Peters84e87f32001-03-17 04:50:51 +00003483
Guido van Rossum60456fd1997-04-09 17:36:32 +00003484static int
3485load_append(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003486 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487}
3488
3489
3490static int
3491load_appends(Unpicklerobject *self) {
3492 return do_append(self, marker(self));
3493}
3494
3495
3496static int
3497do_setitems(Unpicklerobject *self, int x) {
3498 PyObject *value = 0, *key = 0, *dict = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003499 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003500
Guido van Rossum053b8df1998-11-25 16:18:00 +00003501 UNLESS ((len=self->stack->length) >= x
3502 && x > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003503
Guido van Rossum053b8df1998-11-25 16:18:00 +00003504 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003505
Guido van Rossum053b8df1998-11-25 16:18:00 +00003506 for (i = x+1; i < len; i += 2) {
3507 key =self->stack->data[i-1];
3508 value=self->stack->data[i ];
3509 if (PyObject_SetItem(dict, key, value) < 0) {
3510 r=-1;
3511 break;
3512 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003513 }
3514
Guido van Rossum053b8df1998-11-25 16:18:00 +00003515 Pdata_clear(self->stack, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003516
Guido van Rossum053b8df1998-11-25 16:18:00 +00003517 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003518}
3519
3520
3521static int
3522load_setitem(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003523 return do_setitems(self, self->stack->length - 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003524}
3525
Guido van Rossum60456fd1997-04-09 17:36:32 +00003526static int
3527load_setitems(Unpicklerobject *self) {
3528 return do_setitems(self, marker(self));
3529}
3530
3531
3532static int
3533load_build(Unpicklerobject *self) {
Tim Peters84e87f32001-03-17 04:50:51 +00003534 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535 *junk = 0, *__setstate__ = 0;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003536 int i, r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Guido van Rossum053b8df1998-11-25 16:18:00 +00003538 if (self->stack->length < 2) return stackUnderflow();
3539 PDATA_POP(self->stack, value);
3540 if (! value) return -1;
3541 inst=self->stack->data[self->stack->length-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542
Guido van Rossum053b8df1998-11-25 16:18:00 +00003543 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3544 ARG_TUP(self, value);
3545 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003546 junk = PyObject_Call(__setstate__, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003547 FREE_ARG_TUP(self);
3548 }
3549 Py_DECREF(__setstate__);
3550 if (! junk) return -1;
3551 Py_DECREF(junk);
3552 return 0;
3553 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Guido van Rossum053b8df1998-11-25 16:18:00 +00003555 PyErr_Clear();
3556 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557 i = 0;
3558 while (PyDict_Next(value, &i, &d_key, &d_value)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003559 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3560 r=-1;
3561 break;
3562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003564 Py_DECREF(instdict);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003565 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003566 else r=-1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Guido van Rossum053b8df1998-11-25 16:18:00 +00003568 Py_XDECREF(value);
Tim Peters84e87f32001-03-17 04:50:51 +00003569
Guido van Rossum053b8df1998-11-25 16:18:00 +00003570 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003571}
3572
3573
3574static int
3575load_mark(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003576 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Guido van Rossumea2b7152000-05-09 18:14:50 +00003578 /* Note that we split the (pickle.py) stack into two stacks, an
3579 object stack and a mark stack. Here we push a mark onto the
Tim Peters84e87f32001-03-17 04:50:51 +00003580 mark stack.
Guido van Rossumea2b7152000-05-09 18:14:50 +00003581 */
3582
Guido van Rossum053b8df1998-11-25 16:18:00 +00003583 if ((self->num_marks + 1) >= self->marks_size) {
3584 s=self->marks_size+20;
3585 if (s <= self->num_marks) s=self->num_marks + 1;
Guido van Rossum761fcd01999-04-12 22:51:20 +00003586 if (self->marks == NULL)
Guido van Rossumaa8d1671999-01-25 21:43:51 +00003587 self->marks=(int *)malloc(s * sizeof(int));
3588 else
3589 self->marks=(int *)realloc(self->marks, s * sizeof(int));
Guido van Rossum053b8df1998-11-25 16:18:00 +00003590 if (! self->marks) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591 PyErr_NoMemory();
3592 return -1;
3593 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003594 self->marks_size = s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003595 }
3596
Guido van Rossum053b8df1998-11-25 16:18:00 +00003597 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598
3599 return 0;
3600}
3601
3602static int
3603load_reduce(Unpicklerobject *self) {
3604 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
Guido van Rossum053b8df1998-11-25 16:18:00 +00003606 PDATA_POP(self->stack, arg_tup);
3607 if (! arg_tup) return -1;
3608 PDATA_POP(self->stack, callable);
3609 if (callable) {
3610 ob = Instance_New(callable, arg_tup);
3611 Py_DECREF(callable);
3612 }
3613 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003614
Guido van Rossum053b8df1998-11-25 16:18:00 +00003615 if (! ob) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003616
Guido van Rossum053b8df1998-11-25 16:18:00 +00003617 PDATA_PUSH(self->stack, ob, -1);
3618 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003619}
Tim Peters84e87f32001-03-17 04:50:51 +00003620
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003622load(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003623 PyObject *err = 0, *val = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003624 char *s;
3625
Guido van Rossum60456fd1997-04-09 17:36:32 +00003626 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003627 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628
3629 while (1) {
3630 if ((*self->read_func)(self, &s, 1) < 0)
3631 break;
3632
3633 switch (s[0]) {
3634 case NONE:
3635 if (load_none(self) < 0)
3636 break;
3637 continue;
3638
3639 case BININT:
3640 if (load_binint(self) < 0)
3641 break;
3642 continue;
3643
3644 case BININT1:
3645 if (load_binint1(self) < 0)
3646 break;
3647 continue;
3648
3649 case BININT2:
3650 if (load_binint2(self) < 0)
3651 break;
3652 continue;
3653
3654 case INT:
3655 if (load_int(self) < 0)
3656 break;
3657 continue;
3658
3659 case LONG:
3660 if (load_long(self) < 0)
3661 break;
3662 continue;
3663
3664 case FLOAT:
3665 if (load_float(self) < 0)
3666 break;
3667 continue;
3668
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669 case BINFLOAT:
3670 if (load_binfloat(self) < 0)
3671 break;
3672 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673
3674 case BINSTRING:
3675 if (load_binstring(self) < 0)
3676 break;
3677 continue;
3678
3679 case SHORT_BINSTRING:
3680 if (load_short_binstring(self) < 0)
3681 break;
3682 continue;
3683
3684 case STRING:
3685 if (load_string(self) < 0)
3686 break;
3687 continue;
3688
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003689#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003690 case UNICODE:
3691 if (load_unicode(self) < 0)
3692 break;
3693 continue;
3694
3695 case BINUNICODE:
3696 if (load_binunicode(self) < 0)
3697 break;
3698 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003699#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003700
Guido van Rossum60456fd1997-04-09 17:36:32 +00003701 case EMPTY_TUPLE:
3702 if (load_empty_tuple(self) < 0)
3703 break;
3704 continue;
3705
3706 case TUPLE:
3707 if (load_tuple(self) < 0)
3708 break;
3709 continue;
3710
3711 case EMPTY_LIST:
3712 if (load_empty_list(self) < 0)
3713 break;
3714 continue;
3715
3716 case LIST:
3717 if (load_list(self) < 0)
3718 break;
3719 continue;
3720
3721 case EMPTY_DICT:
3722 if (load_empty_dict(self) < 0)
3723 break;
3724 continue;
3725
3726 case DICT:
3727 if (load_dict(self) < 0)
3728 break;
3729 continue;
3730
3731 case OBJ:
3732 if (load_obj(self) < 0)
3733 break;
3734 continue;
3735
3736 case INST:
3737 if (load_inst(self) < 0)
3738 break;
3739 continue;
3740
3741 case GLOBAL:
3742 if (load_global(self) < 0)
3743 break;
3744 continue;
3745
3746 case APPEND:
3747 if (load_append(self) < 0)
3748 break;
3749 continue;
3750
3751 case APPENDS:
3752 if (load_appends(self) < 0)
3753 break;
3754 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003755
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756 case BUILD:
3757 if (load_build(self) < 0)
3758 break;
3759 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003760
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761 case DUP:
3762 if (load_dup(self) < 0)
3763 break;
3764 continue;
3765
3766 case BINGET:
3767 if (load_binget(self) < 0)
3768 break;
3769 continue;
3770
3771 case LONG_BINGET:
3772 if (load_long_binget(self) < 0)
3773 break;
3774 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003775
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776 case GET:
3777 if (load_get(self) < 0)
3778 break;
3779 continue;
3780
3781 case MARK:
3782 if (load_mark(self) < 0)
3783 break;
3784 continue;
3785
3786 case BINPUT:
3787 if (load_binput(self) < 0)
3788 break;
3789 continue;
3790
3791 case LONG_BINPUT:
3792 if (load_long_binput(self) < 0)
3793 break;
3794 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003795
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796 case PUT:
3797 if (load_put(self) < 0)
3798 break;
3799 continue;
3800
3801 case POP:
3802 if (load_pop(self) < 0)
3803 break;
3804 continue;
3805
3806 case POP_MARK:
3807 if (load_pop_mark(self) < 0)
3808 break;
3809 continue;
3810
3811 case SETITEM:
3812 if (load_setitem(self) < 0)
3813 break;
3814 continue;
3815
3816 case SETITEMS:
3817 if (load_setitems(self) < 0)
3818 break;
3819 continue;
3820
3821 case STOP:
3822 break;
3823
3824 case PERSID:
3825 if (load_persid(self) < 0)
3826 break;
3827 continue;
3828
3829 case BINPERSID:
3830 if (load_binpersid(self) < 0)
3831 break;
3832 continue;
3833
3834 case REDUCE:
3835 if (load_reduce(self) < 0)
3836 break;
3837 continue;
3838
Tim Peters84e87f32001-03-17 04:50:51 +00003839 default:
3840 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003842 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843 }
3844
3845 break;
3846 }
3847
Guido van Rossum053b8df1998-11-25 16:18:00 +00003848 if ((err = PyErr_Occurred())) {
3849 if (err == PyExc_EOFError) {
3850 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00003851 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003852 return NULL;
3853 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003854
Tim Peters84e87f32001-03-17 04:50:51 +00003855 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003856 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003857}
Tim Peters84e87f32001-03-17 04:50:51 +00003858
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003860/* No-load functions to support noload, which is used to
3861 find persistent references. */
3862
3863static int
3864noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003865 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003866
3867 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003868 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003869}
3870
3871
3872static int
3873noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003874 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003875 char *s;
3876
3877 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003878 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003879 if ((*self->readline_func)(self, &s) < 0) return -1;
3880 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003881 PDATA_APPEND(self->stack, Py_None,-1);
3882 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003883}
3884
3885static int
3886noload_global(Unpicklerobject *self) {
3887 char *s;
3888
3889 if ((*self->readline_func)(self, &s) < 0) return -1;
3890 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003891 PDATA_APPEND(self->stack, Py_None,-1);
3892 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003893}
3894
3895static int
3896noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003897
Guido van Rossum053b8df1998-11-25 16:18:00 +00003898 if (self->stack->length < 2) return stackUnderflow();
3899 Pdata_clear(self->stack, self->stack->length-2);
3900 PDATA_APPEND(self->stack, Py_None,-1);
3901 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003902}
3903
3904static int
3905noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003906
Guido van Rossum053b8df1998-11-25 16:18:00 +00003907 if (self->stack->length < 1) return stackUnderflow();
3908 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003909 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003910}
3911
3912
3913static PyObject *
3914noload(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003915 PyObject *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003916 char *s;
3917
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003918 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003919 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003920
3921 while (1) {
3922 if ((*self->read_func)(self, &s, 1) < 0)
3923 break;
3924
3925 switch (s[0]) {
3926 case NONE:
3927 if (load_none(self) < 0)
3928 break;
3929 continue;
3930
3931 case BININT:
3932 if (load_binint(self) < 0)
3933 break;
3934 continue;
3935
3936 case BININT1:
3937 if (load_binint1(self) < 0)
3938 break;
3939 continue;
3940
3941 case BININT2:
3942 if (load_binint2(self) < 0)
3943 break;
3944 continue;
3945
3946 case INT:
3947 if (load_int(self) < 0)
3948 break;
3949 continue;
3950
3951 case LONG:
3952 if (load_long(self) < 0)
3953 break;
3954 continue;
3955
3956 case FLOAT:
3957 if (load_float(self) < 0)
3958 break;
3959 continue;
3960
3961 case BINFLOAT:
3962 if (load_binfloat(self) < 0)
3963 break;
3964 continue;
3965
3966 case BINSTRING:
3967 if (load_binstring(self) < 0)
3968 break;
3969 continue;
3970
3971 case SHORT_BINSTRING:
3972 if (load_short_binstring(self) < 0)
3973 break;
3974 continue;
3975
3976 case STRING:
3977 if (load_string(self) < 0)
3978 break;
3979 continue;
3980
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003981#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003982 case UNICODE:
3983 if (load_unicode(self) < 0)
3984 break;
3985 continue;
3986
3987 case BINUNICODE:
3988 if (load_binunicode(self) < 0)
3989 break;
3990 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003991#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003992
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003993 case EMPTY_TUPLE:
3994 if (load_empty_tuple(self) < 0)
3995 break;
3996 continue;
3997
3998 case TUPLE:
3999 if (load_tuple(self) < 0)
4000 break;
4001 continue;
4002
4003 case EMPTY_LIST:
4004 if (load_empty_list(self) < 0)
4005 break;
4006 continue;
4007
4008 case LIST:
4009 if (load_list(self) < 0)
4010 break;
4011 continue;
4012
4013 case EMPTY_DICT:
4014 if (load_empty_dict(self) < 0)
4015 break;
4016 continue;
4017
4018 case DICT:
4019 if (load_dict(self) < 0)
4020 break;
4021 continue;
4022
4023 case OBJ:
4024 if (noload_obj(self) < 0)
4025 break;
4026 continue;
4027
4028 case INST:
4029 if (noload_inst(self) < 0)
4030 break;
4031 continue;
4032
4033 case GLOBAL:
4034 if (noload_global(self) < 0)
4035 break;
4036 continue;
4037
4038 case APPEND:
4039 if (load_append(self) < 0)
4040 break;
4041 continue;
4042
4043 case APPENDS:
4044 if (load_appends(self) < 0)
4045 break;
4046 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004047
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004048 case BUILD:
4049 if (noload_build(self) < 0)
4050 break;
4051 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004052
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004053 case DUP:
4054 if (load_dup(self) < 0)
4055 break;
4056 continue;
4057
4058 case BINGET:
4059 if (load_binget(self) < 0)
4060 break;
4061 continue;
4062
4063 case LONG_BINGET:
4064 if (load_long_binget(self) < 0)
4065 break;
4066 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004067
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004068 case GET:
4069 if (load_get(self) < 0)
4070 break;
4071 continue;
4072
4073 case MARK:
4074 if (load_mark(self) < 0)
4075 break;
4076 continue;
4077
4078 case BINPUT:
4079 if (load_binput(self) < 0)
4080 break;
4081 continue;
4082
4083 case LONG_BINPUT:
4084 if (load_long_binput(self) < 0)
4085 break;
4086 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004087
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004088 case PUT:
4089 if (load_put(self) < 0)
4090 break;
4091 continue;
4092
4093 case POP:
4094 if (load_pop(self) < 0)
4095 break;
4096 continue;
4097
4098 case POP_MARK:
4099 if (load_pop_mark(self) < 0)
4100 break;
4101 continue;
4102
4103 case SETITEM:
4104 if (load_setitem(self) < 0)
4105 break;
4106 continue;
4107
4108 case SETITEMS:
4109 if (load_setitems(self) < 0)
4110 break;
4111 continue;
4112
4113 case STOP:
4114 break;
4115
4116 case PERSID:
4117 if (load_persid(self) < 0)
4118 break;
4119 continue;
4120
4121 case BINPERSID:
4122 if (load_binpersid(self) < 0)
4123 break;
4124 continue;
4125
4126 case REDUCE:
4127 if (noload_reduce(self) < 0)
4128 break;
4129 continue;
4130
Tim Peters84e87f32001-03-17 04:50:51 +00004131 default:
4132 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004133 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004134 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004135 }
4136
4137 break;
4138 }
4139
Guido van Rossum053b8df1998-11-25 16:18:00 +00004140 if ((err = PyErr_Occurred())) {
4141 if (err == PyExc_EOFError) {
4142 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00004143 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00004144 return NULL;
4145 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Tim Peters84e87f32001-03-17 04:50:51 +00004147 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004148 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004149}
Tim Peters84e87f32001-03-17 04:50:51 +00004150
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152static PyObject *
4153Unpickler_load(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004154 UNLESS (PyArg_ParseTuple(args, ":load"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004155 return NULL;
4156
4157 return load(self);
4158}
4159
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004160static PyObject *
4161Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004162 UNLESS (PyArg_ParseTuple(args, ":noload"))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004163 return NULL;
4164
4165 return noload(self);
4166}
4167
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
4169static struct PyMethodDef Unpickler_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004170 {"load", (PyCFunction)Unpickler_load, 1,
4171 "load() -- Load a pickle"
4172 },
4173 {"noload", (PyCFunction)Unpickler_noload, 1,
4174 "noload() -- not load a pickle, but go through most of the motions\n"
4175 "\n"
4176 "This function can be used to read past a pickle without instantiating\n"
4177 "any objects or importing any modules. It can also be used to find all\n"
4178 "persistent references without instantiating any objects or importing\n"
4179 "any modules.\n"
4180 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181 {NULL, NULL} /* sentinel */
4182};
4183
4184
4185static Unpicklerobject *
4186newUnpicklerobject(PyObject *f) {
4187 Unpicklerobject *self;
4188
Guido van Rossumb18618d2000-05-03 23:44:39 +00004189 UNLESS (self = PyObject_New(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004190 return NULL;
4191
4192 self->file = NULL;
4193 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004194 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195 self->pers_func = NULL;
4196 self->last_string = NULL;
4197 self->marks = NULL;
4198 self->num_marks = 0;
4199 self->marks_size = 0;
4200 self->buf_size = 0;
4201 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00004202 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00004203 self->safe_constructors = NULL;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004204 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004205
Tim Peters84e87f32001-03-17 04:50:51 +00004206 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00004207 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208
4209 Py_INCREF(f);
4210 self->file = f;
4211
4212 /* Set read, readline based on type of f */
4213 if (PyFile_Check(f)) {
4214 self->fp = PyFile_AsFile(f);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004215 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00004216 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
4217 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004218 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004219 self->read_func = read_file;
4220 self->readline_func = readline_file;
4221 }
4222 else if (PycStringIO_InputCheck(f)) {
4223 self->fp = NULL;
4224 self->read_func = read_cStringIO;
4225 self->readline_func = readline_cStringIO;
4226 }
4227 else {
4228
4229 self->fp = NULL;
4230 self->read_func = read_other;
4231 self->readline_func = readline_other;
4232
Guido van Rossum053b8df1998-11-25 16:18:00 +00004233 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235 PyErr_Clear();
4236 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
4237 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00004238 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239 }
4240 }
4241
Guido van Rossum053b8df1998-11-25 16:18:00 +00004242 if (PyEval_GetRestricted()) {
4243 /* Restricted execution, get private tables */
4244 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004245
Guido van Rossum053b8df1998-11-25 16:18:00 +00004246 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
4247 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
4248 Py_DECREF(m);
4249 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004250 }
4251 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004252 self->safe_constructors=safe_constructors;
4253 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254 }
4255
Guido van Rossum60456fd1997-04-09 17:36:32 +00004256 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004257
4258err:
4259 Py_DECREF((PyObject *)self);
4260 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004261}
4262
4263
4264static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004265get_Unpickler(PyObject *self, PyObject *args) {
4266 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004267
Guido van Rossum43713e52000-02-29 13:59:29 +00004268 UNLESS (PyArg_ParseTuple(args, "O:Unpickler", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269 return NULL;
4270 return (PyObject *)newUnpicklerobject(file);
4271}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004272
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004273
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274static void
4275Unpickler_dealloc(Unpicklerobject *self) {
4276 Py_XDECREF(self->readline);
4277 Py_XDECREF(self->read);
4278 Py_XDECREF(self->file);
4279 Py_XDECREF(self->memo);
4280 Py_XDECREF(self->stack);
4281 Py_XDECREF(self->pers_func);
4282 Py_XDECREF(self->arg);
4283 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004285
Guido van Rossum60456fd1997-04-09 17:36:32 +00004286 if (self->marks) {
4287 free(self->marks);
4288 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004289
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290 if (self->buf_size) {
4291 free(self->buf);
4292 }
Tim Peters84e87f32001-03-17 04:50:51 +00004293
Guido van Rossumb18618d2000-05-03 23:44:39 +00004294 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004295}
4296
4297
4298static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299Unpickler_getattr(Unpicklerobject *self, char *name) {
4300 if (!strcmp(name, "persistent_load")) {
4301 if (!self->pers_func) {
4302 PyErr_SetString(PyExc_AttributeError, name);
4303 return NULL;
4304 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004305
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306 Py_INCREF(self->pers_func);
4307 return self->pers_func;
4308 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004309
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004310 if (!strcmp(name, "find_global")) {
4311 if (!self->find_class) {
4312 PyErr_SetString(PyExc_AttributeError, name);
4313 return NULL;
4314 }
4315
4316 Py_INCREF(self->find_class);
4317 return self->find_class;
4318 }
4319
Guido van Rossum60456fd1997-04-09 17:36:32 +00004320 if (!strcmp(name, "memo")) {
4321 if (!self->memo) {
4322 PyErr_SetString(PyExc_AttributeError, name);
4323 return NULL;
4324 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004325
Guido van Rossum60456fd1997-04-09 17:36:32 +00004326 Py_INCREF(self->memo);
4327 return self->memo;
4328 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004329
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330 if (!strcmp(name, "UnpicklingError")) {
4331 Py_INCREF(UnpicklingError);
4332 return UnpicklingError;
4333 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004334
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
4336}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004337
Guido van Rossum60456fd1997-04-09 17:36:32 +00004338
4339static int
4340Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004341
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004342 if (!strcmp(name, "persistent_load")) {
4343 Py_XDECREF(self->pers_func);
4344 self->pers_func = value;
4345 Py_XINCREF(value);
4346 return 0;
4347 }
4348
4349 if (!strcmp(name, "find_global")) {
4350 Py_XDECREF(self->find_class);
4351 self->find_class = value;
4352 Py_XINCREF(value);
4353 return 0;
4354 }
4355
Guido van Rossum053b8df1998-11-25 16:18:00 +00004356 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004357 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00004358 "attribute deletion is not supported");
4359 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004360 }
4361
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004362 if (strcmp(name, "memo") == 0) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004363 if (!PyDict_Check(value)) {
4364 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4365 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004366 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004367 Py_XDECREF(self->memo);
4368 self->memo = value;
4369 Py_INCREF(value);
4370 return 0;
4371 }
4372
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373 PyErr_SetString(PyExc_AttributeError, name);
4374 return -1;
4375}
4376
4377
4378static PyObject *
4379cpm_dump(PyObject *self, PyObject *args) {
4380 PyObject *ob, *file, *res = NULL;
4381 Picklerobject *pickler = 0;
4382 int bin = 0;
4383
Guido van Rossum053b8df1998-11-25 16:18:00 +00004384 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385 goto finally;
4386
Guido van Rossum053b8df1998-11-25 16:18:00 +00004387 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004388 goto finally;
4389
4390 if (dump(pickler, ob) < 0)
4391 goto finally;
4392
4393 Py_INCREF(Py_None);
4394 res = Py_None;
4395
4396finally:
4397 Py_XDECREF(pickler);
4398
4399 return res;
4400}
4401
4402
4403static PyObject *
4404cpm_dumps(PyObject *self, PyObject *args) {
4405 PyObject *ob, *file = 0, *res = NULL;
4406 Picklerobject *pickler = 0;
4407 int bin = 0;
4408
Guido van Rossum43713e52000-02-29 13:59:29 +00004409 UNLESS (PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004410 goto finally;
4411
Guido van Rossum053b8df1998-11-25 16:18:00 +00004412 UNLESS (file = PycStringIO->NewOutput(128))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004413 goto finally;
4414
Guido van Rossum053b8df1998-11-25 16:18:00 +00004415 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004416 goto finally;
4417
4418 if (dump(pickler, ob) < 0)
4419 goto finally;
4420
4421 res = PycStringIO->cgetvalue(file);
4422
4423finally:
4424 Py_XDECREF(pickler);
4425 Py_XDECREF(file);
4426
4427 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004428}
4429
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004430
4431static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004432cpm_load(PyObject *self, PyObject *args) {
4433 Unpicklerobject *unpickler = 0;
4434 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004435
Guido van Rossum43713e52000-02-29 13:59:29 +00004436 UNLESS (PyArg_ParseTuple(args, "O:load", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004438
Guido van Rossum053b8df1998-11-25 16:18:00 +00004439 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004440 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004441
Guido van Rossum60456fd1997-04-09 17:36:32 +00004442 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004443
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444finally:
4445 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004446
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004448}
4449
4450
4451static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004452cpm_loads(PyObject *self, PyObject *args) {
4453 PyObject *ob, *file = 0, *res = NULL;
4454 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004455
Guido van Rossum43713e52000-02-29 13:59:29 +00004456 UNLESS (PyArg_ParseTuple(args, "S:loads", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004457 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004458
Guido van Rossum053b8df1998-11-25 16:18:00 +00004459 UNLESS (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004460 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004461
Guido van Rossum053b8df1998-11-25 16:18:00 +00004462 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004463 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004464
Guido van Rossum60456fd1997-04-09 17:36:32 +00004465 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004466
Guido van Rossum60456fd1997-04-09 17:36:32 +00004467finally:
4468 Py_XDECREF(file);
4469 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004470
Guido van Rossum60456fd1997-04-09 17:36:32 +00004471 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004472}
4473
4474
Tim Peters84e87f32001-03-17 04:50:51 +00004475static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004476"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004477
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004478static PyTypeObject Unpicklertype = {
4479 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004480 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004481 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004482 sizeof(Unpicklerobject), /*tp_basicsize*/
4483 0, /*tp_itemsize*/
4484 /* methods */
4485 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4486 (printfunc)0, /*tp_print*/
4487 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4488 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4489 (cmpfunc)0, /*tp_compare*/
4490 (reprfunc)0, /*tp_repr*/
4491 0, /*tp_as_number*/
4492 0, /*tp_as_sequence*/
4493 0, /*tp_as_mapping*/
4494 (hashfunc)0, /*tp_hash*/
4495 (ternaryfunc)0, /*tp_call*/
4496 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004497
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498 /* Space for future expansion */
4499 0L,0L,0L,0L,
4500 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004501};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004502
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503static struct PyMethodDef cPickle_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004504 {"dump", (PyCFunction)cpm_dump, 1,
4505 "dump(object, file, [binary]) --"
4506 "Write an object in pickle format to the given file\n"
4507 "\n"
4508 "If the optional argument, binary, is provided and is true, then the\n"
4509 "pickle will be written in binary format, which is more space and\n"
4510 "computationally efficient. \n"
4511 },
4512 {"dumps", (PyCFunction)cpm_dumps, 1,
4513 "dumps(object, [binary]) --"
4514 "Return a string containing an object in pickle format\n"
4515 "\n"
4516 "If the optional argument, binary, is provided and is true, then the\n"
4517 "pickle will be written in binary format, which is more space and\n"
4518 "computationally efficient. \n"
4519 },
4520 {"load", (PyCFunction)cpm_load, 1,
4521 "load(file) -- Load a pickle from the given file"},
4522 {"loads", (PyCFunction)cpm_loads, 1,
4523 "loads(string) -- Load a pickle from the given string"},
4524 {"Pickler", (PyCFunction)get_Pickler, 1,
4525 "Pickler(file, [binary]) -- Create a pickler\n"
4526 "\n"
4527 "If the optional argument, binary, is provided and is true, then\n"
4528 "pickles will be written in binary format, which is more space and\n"
4529 "computationally efficient. \n"
4530 },
4531 {"Unpickler", (PyCFunction)get_Unpickler, 1,
4532 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004533 { NULL, NULL }
4534};
4535
Guido van Rossum60456fd1997-04-09 17:36:32 +00004536static int
Guido van Rossumebba4202000-09-07 14:35:37 +00004537init_stuff(PyObject *module_dict) {
Fred Drake2c7a6852001-07-17 18:34:03 +00004538 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004540#define INIT_STR(S) UNLESS(S ## _str=PyString_InternFromString(#S)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
4542 INIT_STR(__class__);
4543 INIT_STR(__getinitargs__);
4544 INIT_STR(__dict__);
4545 INIT_STR(__getstate__);
4546 INIT_STR(__setstate__);
4547 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004548 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549 INIT_STR(__reduce__);
4550 INIT_STR(write);
4551 INIT_STR(__safe_for_unpickling__);
4552 INIT_STR(append);
4553 INIT_STR(read);
4554 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004555 INIT_STR(copy_reg);
4556 INIT_STR(dispatch_table);
4557 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004558 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004559
Guido van Rossum053b8df1998-11-25 16:18:00 +00004560 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561 return -1;
4562
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004563 /* These next few are special because we want to use different
4564 ones in restricted mode. */
4565
Guido van Rossum053b8df1998-11-25 16:18:00 +00004566 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004567 return -1;
4568
Guido van Rossum053b8df1998-11-25 16:18:00 +00004569 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004570 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004571 return -1;
4572
4573 Py_DECREF(copy_reg);
4574
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004575 /* Down to here ********************************** */
4576
Guido van Rossum053b8df1998-11-25 16:18:00 +00004577 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578 return -1;
4579
Guido van Rossumc03158b1999-06-09 15:23:31 +00004580 /* Ugh */
4581 UNLESS (t=PyImport_ImportModule("__builtin__")) return -1;
4582 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4583 return -1;
4584
4585 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004586 UNLESS (r=PyRun_String(
4587 "def __init__(self, *args): self.args=args\n\n"
4588 "def __str__(self):\n"
4589 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4590 Py_file_input,
4591 module_dict, t) ) return -1;
4592 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004593
4594 UNLESS (PickleError = PyErr_NewException("cPickle.PickleError", NULL, t))
4595 return -1;
4596
4597 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004598
Tim Peters84e87f32001-03-17 04:50:51 +00004599
4600 UNLESS (PicklingError = PyErr_NewException("cPickle.PicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004601 PickleError, NULL))
4602 return -1;
4603
4604 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004605 UNLESS (r=PyRun_String(
4606 "def __init__(self, *args): self.args=args\n\n"
4607 "def __str__(self):\n"
4608 " a=self.args\n"
4609 " a=a and type(a[0]) or '(what)'\n"
4610 " return 'Cannot pickle %s objects' % a\n"
4611 , Py_file_input,
4612 module_dict, t) ) return -1;
4613 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004614
4615 UNLESS (UnpickleableError = PyErr_NewException(
4616 "cPickle.UnpickleableError", PicklingError, t))
4617 return -1;
4618
4619 Py_DECREF(t);
4620
Tim Peters84e87f32001-03-17 04:50:51 +00004621 UNLESS (UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004622 PickleError, NULL))
4623 return -1;
4624
Tim Peters84e87f32001-03-17 04:50:51 +00004625 if (PyDict_SetItemString(module_dict, "PickleError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004626 PickleError) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004627 return -1;
4628
Tim Peters84e87f32001-03-17 04:50:51 +00004629 if (PyDict_SetItemString(module_dict, "PicklingError",
Guido van Rossum60456fd1997-04-09 17:36:32 +00004630 PicklingError) < 0)
4631 return -1;
4632
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4634 UnpicklingError) < 0)
4635 return -1;
4636
Guido van Rossumc03158b1999-06-09 15:23:31 +00004637 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4638 UnpickleableError) < 0)
4639 return -1;
4640
Guido van Rossum053b8df1998-11-25 16:18:00 +00004641 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4642 return -1;
4643
4644 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4645 BadPickleGet) < 0)
4646 return -1;
4647
Guido van Rossum60456fd1997-04-09 17:36:32 +00004648 PycString_IMPORT;
Tim Peters84e87f32001-03-17 04:50:51 +00004649
Guido van Rossum60456fd1997-04-09 17:36:32 +00004650 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004651}
4652
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004653#ifndef DL_EXPORT /* declarations for DLL import/export */
4654#define DL_EXPORT(RTYPE) RTYPE
4655#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004656DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +00004657initcPickle(void) {
Guido van Rossumebba4202000-09-07 14:35:37 +00004658 PyObject *m, *d, *di, *v, *k;
4659 int i;
Guido van Rossum2f80d961999-07-13 15:18:58 +00004660 char *rev="1.71";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004661 PyObject *format_version;
4662 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004663
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004664 Picklertype.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00004665 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4666 Picklertype.tp_setattro = PyObject_GenericSetAttr;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004667 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004668 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004669
Tim Peters84e87f32001-03-17 04:50:51 +00004670 /* Initialize some pieces. We need to do this before module creation,
4671 so we're forced to use a temporary dictionary. :(
Guido van Rossumebba4202000-09-07 14:35:37 +00004672 */
4673 di=PyDict_New();
4674 if (!di) return;
4675 if (init_stuff(di) < 0) return;
4676
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677 /* Create the module and add the functions */
4678 m = Py_InitModule4("cPickle", cPickle_methods,
4679 cPickle_module_documentation,
4680 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004681
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682 /* Add some symbolic constants to the module */
4683 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004684 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004685 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004686
Guido van Rossumebba4202000-09-07 14:35:37 +00004687 /* Copy data from di. Waaa. */
4688 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4689 if (PyObject_SetItem(d, k, v) < 0) {
4690 Py_DECREF(di);
4691 return;
4692 }
4693 }
4694 Py_DECREF(di);
4695
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696 format_version = PyString_FromString("1.3");
4697 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004698
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699 PyDict_SetItemString(d, "format_version", format_version);
4700 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004701 Py_XDECREF(format_version);
4702 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004703}