blob: eaead3f5a6c5702c5478c3e7b8583cbbc7048e14 [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 = {
170 PyObject_HEAD_INIT(NULL) 0, "Pdata", sizeof(Pdata), 0,
171 (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 */
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000321} Picklerobject;
322
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000323#define FAST_LIMIT 2000
324
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000325staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000326
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000327typedef struct Unpicklerobject {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000328 PyObject_HEAD
329 FILE *fp;
330 PyObject *file;
331 PyObject *readline;
332 PyObject *read;
333 PyObject *memo;
334 PyObject *arg;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000335 Pdata *stack;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000336 PyObject *mark;
337 PyObject *pers_func;
338 PyObject *last_string;
339 int *marks;
340 int num_marks;
341 int marks_size;
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000342 int (*read_func)(struct Unpicklerobject *, char **, int);
343 int (*readline_func)(struct Unpicklerobject *, char **);
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000344 int buf_size;
345 char *buf;
346 PyObject *safe_constructors;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +0000347 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000348} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000349
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000350staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000351
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000352/* Forward decls that need the above structs */
353static int save(Picklerobject *, PyObject *, int);
354static int put2(Picklerobject *, PyObject *);
355
Tim Peters84e87f32001-03-17 04:50:51 +0000356int
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000357cPickle_PyMapping_HasKey(PyObject *o, PyObject *key) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000358 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000359
Guido van Rossum053b8df1998-11-25 16:18:00 +0000360 if ((v = PyObject_GetItem(o,key))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000361 Py_DECREF(v);
362 return 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000363 }
364
Guido van Rossum60456fd1997-04-09 17:36:32 +0000365 PyErr_Clear();
366 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000367}
368
Guido van Rossumd385d591997-04-09 17:47:47 +0000369static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000370PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000371cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
372{
Guido van Rossum60456fd1997-04-09 17:36:32 +0000373 va_list va;
374 PyObject *args=0, *retval=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000375 va_start(va, format);
Tim Peters84e87f32001-03-17 04:50:51 +0000376
Guido van Rossum053b8df1998-11-25 16:18:00 +0000377 if (format) args = Py_VaBuildValue(format, va);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000378 va_end(va);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000379 if (format && ! args) return NULL;
380 if (stringformat && !(retval=PyString_FromString(stringformat))) return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000381
Guido van Rossum053b8df1998-11-25 16:18:00 +0000382 if (retval) {
383 if (args) {
384 PyObject *v;
385 v=PyString_Format(retval, args);
386 Py_DECREF(retval);
387 Py_DECREF(args);
388 if (! v) return NULL;
389 retval=v;
390 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000392 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000393 if (args) retval=args;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000394 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000395 PyErr_SetObject(ErrType,Py_None);
396 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000397 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000398 PyErr_SetObject(ErrType,retval);
399 Py_DECREF(retval);
400 return NULL;
401}
402
Tim Peters84e87f32001-03-17 04:50:51 +0000403static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000404write_file(Picklerobject *self, char *s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000405 size_t nbyteswritten;
406
Guido van Rossum60456fd1997-04-09 17:36:32 +0000407 if (s == NULL) {
408 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000409 }
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411 Py_BEGIN_ALLOW_THREADS
412 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
413 Py_END_ALLOW_THREADS
414 if (nbyteswritten != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000415 PyErr_SetFromErrno(PyExc_IOError);
416 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000417 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418
419 return n;
420}
421
Tim Peters84e87f32001-03-17 04:50:51 +0000422static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000423write_cStringIO(Picklerobject *self, char *s, int n) {
424 if (s == NULL) {
425 return 0;
426 }
427
428 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
429 return -1;
430 }
431
432 return n;
433}
434
Tim Peters84e87f32001-03-17 04:50:51 +0000435static int
Guido van Rossum142eeb81997-08-13 03:14:41 +0000436write_none(Picklerobject *self, char *s, int n) {
437 if (s == NULL) return 0;
438 return n;
439}
440
Tim Peters84e87f32001-03-17 04:50:51 +0000441static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000442write_other(Picklerobject *self, char *s, int n) {
443 PyObject *py_str = 0, *junk = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000444
445 if (s == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000446 UNLESS (self->buf_size) return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000447 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000448 PyString_FromStringAndSize(self->write_buf, self->buf_size))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000449 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450 }
451 else {
452 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
453 if (write_other(self, NULL, 0) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000454 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455 }
456
Tim Peters84e87f32001-03-17 04:50:51 +0000457 if (n > WRITE_BUF_SIZE) {
458 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000459 PyString_FromStringAndSize(s, n))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000460 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000461 }
462 else {
463 memcpy(self->write_buf + self->buf_size, s, n);
464 self->buf_size += n;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000465 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466 }
467 }
468
Guido van Rossum053b8df1998-11-25 16:18:00 +0000469 if (self->write) {
470 /* object with write method */
471 ARG_TUP(self, py_str);
472 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000473 junk = PyObject_Call(self->write, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000474 FREE_ARG_TUP(self);
475 }
476 if (junk) Py_DECREF(junk);
477 else return -1;
478 }
Tim Peters84e87f32001-03-17 04:50:51 +0000479 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000480 PDATA_PUSH(self->file, py_str, -1);
Tim Peters84e87f32001-03-17 04:50:51 +0000481
482 self->buf_size = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000483 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000484}
485
486
Tim Peters84e87f32001-03-17 04:50:51 +0000487static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488read_file(Unpicklerobject *self, char **s, int n) {
Tim Peters84e87f32001-03-17 04:50:51 +0000489 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000490
491 if (self->buf_size == 0) {
492 int size;
493
Tim Peters84e87f32001-03-17 04:50:51 +0000494 size = ((n < 32) ? 32 : n);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000495 UNLESS (self->buf = (char *)malloc(size * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000496 PyErr_NoMemory();
497 return -1;
498 }
499
500 self->buf_size = size;
501 }
502 else if (n > self->buf_size) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000503 UNLESS (self->buf = (char *)realloc(self->buf, n * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504 PyErr_NoMemory();
505 return -1;
506 }
Tim Peters84e87f32001-03-17 04:50:51 +0000507
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508 self->buf_size = n;
509 }
Tim Peters84e87f32001-03-17 04:50:51 +0000510
511 Py_BEGIN_ALLOW_THREADS
512 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
513 Py_END_ALLOW_THREADS
514 if (nbytesread != (size_t)n) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515 if (feof(self->fp)) {
516 PyErr_SetNone(PyExc_EOFError);
517 return -1;
518 }
519
520 PyErr_SetFromErrno(PyExc_IOError);
521 return -1;
522 }
523
524 *s = self->buf;
525
526 return n;
527}
528
529
Tim Peters84e87f32001-03-17 04:50:51 +0000530static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000531readline_file(Unpicklerobject *self, char **s) {
532 int i;
533
534 if (self->buf_size == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000535 UNLESS (self->buf = (char *)malloc(40 * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000536 PyErr_NoMemory();
537 return -1;
538 }
Tim Peters84e87f32001-03-17 04:50:51 +0000539
Guido van Rossum60456fd1997-04-09 17:36:32 +0000540 self->buf_size = 40;
541 }
542
543 i = 0;
544 while (1) {
545 for (; i < (self->buf_size - 1); i++) {
546 if (feof(self->fp) || (self->buf[i] = getc(self->fp)) == '\n') {
547 self->buf[i + 1] = '\0';
548 *s = self->buf;
549 return i + 1;
550 }
551 }
552
Tim Peters84e87f32001-03-17 04:50:51 +0000553 UNLESS (self->buf = (char *)realloc(self->buf,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000554 (self->buf_size * 2) * sizeof(char))) {
555 PyErr_NoMemory();
556 return -1;
557 }
558
559 self->buf_size *= 2;
560 }
561
Tim Peters84e87f32001-03-17 04:50:51 +0000562}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000563
564
Tim Peters84e87f32001-03-17 04:50:51 +0000565static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566read_cStringIO(Unpicklerobject *self, char **s, int n) {
567 char *ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000568
Guido van Rossum60456fd1997-04-09 17:36:32 +0000569 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
570 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000571 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000572 }
573
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574 *s = ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000575
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576 return n;
577}
578
579
Tim Peters84e87f32001-03-17 04:50:51 +0000580static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000581readline_cStringIO(Unpicklerobject *self, char **s) {
582 int n;
583 char *ptr;
584
585 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
586 return -1;
587 }
588
589 *s = ptr;
590
591 return n;
592}
593
594
Tim Peters84e87f32001-03-17 04:50:51 +0000595static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000596read_other(Unpicklerobject *self, char **s, int n) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000597 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598
Guido van Rossum053b8df1998-11-25 16:18:00 +0000599 UNLESS (bytes = PyInt_FromLong(n)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000600
Guido van Rossum053b8df1998-11-25 16:18:00 +0000601 ARG_TUP(self, bytes);
602 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000603 str = PyObject_Call(self->read, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000604 FREE_ARG_TUP(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000605 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000606 if (! str) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607
608 Py_XDECREF(self->last_string);
609 self->last_string = str;
610
Guido van Rossum053b8df1998-11-25 16:18:00 +0000611 if (! (*s = PyString_AsString(str))) return -1;
612 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613}
614
615
Tim Peters84e87f32001-03-17 04:50:51 +0000616static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000617readline_other(Unpicklerobject *self, char **s) {
618 PyObject *str;
619 int str_size;
620
Guido van Rossum053b8df1998-11-25 16:18:00 +0000621 UNLESS (str = PyObject_CallObject(self->readline, empty_tuple)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000622 return -1;
623 }
624
Guido van Rossum053b8df1998-11-25 16:18:00 +0000625 if ((str_size = PyString_Size(str)) < 0)
626 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000627
628 Py_XDECREF(self->last_string);
629 self->last_string = str;
630
Guido van Rossum053b8df1998-11-25 16:18:00 +0000631 if (! (*s = PyString_AsString(str)))
632 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633
634 return str_size;
635}
636
637
638static char *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000639pystrndup(char *s, int l) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000640 char *r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000641 UNLESS (r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory();
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642 memcpy(r,s,l);
643 r[l]=0;
644 return r;
645}
646
647
648static int
649get(Picklerobject *self, PyObject *id) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000650 PyObject *value, *mv;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000651 long c_value;
652 char s[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000653 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654
Guido van Rossum053b8df1998-11-25 16:18:00 +0000655 UNLESS (mv = PyDict_GetItem(self->memo, id)) {
656 PyErr_SetObject(PyExc_KeyError, id);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000658 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659
Guido van Rossum053b8df1998-11-25 16:18:00 +0000660 UNLESS (value = PyTuple_GetItem(mv, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000661 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000662
Guido van Rossum053b8df1998-11-25 16:18:00 +0000663 UNLESS (PyInt_Check(value)) {
664 PyErr_SetString(PicklingError, "no int where int expected in memo");
665 return -1;
666 }
667 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
669 if (!self->bin) {
670 s[0] = GET;
671 sprintf(s + 1, "%ld\n", c_value);
672 len = strlen(s);
673 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000674 else if (Pdata_Check(self->file)) {
675 if (write_other(self, NULL, 0) < 0) return -1;
676 PDATA_APPEND(self->file, mv, -1);
677 return 0;
678 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679 else {
680 if (c_value < 256) {
681 s[0] = BINGET;
682 s[1] = (int)(c_value & 0xff);
683 len = 2;
684 }
685 else {
686 s[0] = LONG_BINGET;
687 s[1] = (int)(c_value & 0xff);
688 s[2] = (int)((c_value >> 8) & 0xff);
689 s[3] = (int)((c_value >> 16) & 0xff);
690 s[4] = (int)((c_value >> 24) & 0xff);
691 len = 5;
692 }
693 }
694
695 if ((*self->write_func)(self, s, len) < 0)
696 return -1;
697
698 return 0;
699}
Tim Peters84e87f32001-03-17 04:50:51 +0000700
Guido van Rossum60456fd1997-04-09 17:36:32 +0000701
702static int
703put(Picklerobject *self, PyObject *ob) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000704 if (ob->ob_refcnt < 2 || self->fast)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000705 return 0;
706
707 return put2(self, ob);
708}
709
Tim Peters84e87f32001-03-17 04:50:51 +0000710
Guido van Rossum60456fd1997-04-09 17:36:32 +0000711static int
712put2(Picklerobject *self, PyObject *ob) {
713 char c_str[30];
Guido van Rossum534b7c52000-06-28 22:23:56 +0000714 int p;
715 size_t len;
716 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000718
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000719 if (self->fast)
720 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000721
Guido van Rossum60456fd1997-04-09 17:36:32 +0000722 if ((p = PyDict_Size(self->memo)) < 0)
723 goto finally;
724
Guido van Rossum053b8df1998-11-25 16:18:00 +0000725 p++; /* Make sure memo keys are positive! */
726
Guido van Rossum534b7c52000-06-28 22:23:56 +0000727 UNLESS (py_ob_id = PyLong_FromVoidPtr(ob))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000728 goto finally;
729
730 UNLESS (memo_len = PyInt_FromLong(p))
731 goto finally;
732
733 UNLESS (t = PyTuple_New(2))
734 goto finally;
735
736 PyTuple_SET_ITEM(t, 0, memo_len);
737 Py_INCREF(memo_len);
738 PyTuple_SET_ITEM(t, 1, ob);
739 Py_INCREF(ob);
740
741 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
742 goto finally;
743
Guido van Rossum60456fd1997-04-09 17:36:32 +0000744 if (!self->bin) {
745 c_str[0] = PUT;
746 sprintf(c_str + 1, "%d\n", p);
747 len = strlen(c_str);
748 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000749 else if (Pdata_Check(self->file)) {
750 if (write_other(self, NULL, 0) < 0) return -1;
751 PDATA_APPEND(self->file, memo_len, -1);
752 res=0; /* Job well done ;) */
753 goto finally;
754 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000755 else {
756 if (p >= 256) {
757 c_str[0] = LONG_BINPUT;
758 c_str[1] = (int)(p & 0xff);
759 c_str[2] = (int)((p >> 8) & 0xff);
760 c_str[3] = (int)((p >> 16) & 0xff);
761 c_str[4] = (int)((p >> 24) & 0xff);
762 len = 5;
763 }
764 else {
765 c_str[0] = BINPUT;
766 c_str[1] = p;
Tim Peters84e87f32001-03-17 04:50:51 +0000767 len = 2;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000768 }
769 }
770
771 if ((*self->write_func)(self, c_str, len) < 0)
772 goto finally;
773
Guido van Rossum60456fd1997-04-09 17:36:32 +0000774 res = 0;
775
776finally:
777 Py_XDECREF(py_ob_id);
778 Py_XDECREF(memo_len);
779 Py_XDECREF(t);
780
781 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000782}
783
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000784#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000785
786static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000787PyImport_Import(PyObject *module_name) {
788 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
789 static PyObject *standard_builtins=0;
790 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
791
Guido van Rossum053b8df1998-11-25 16:18:00 +0000792 UNLESS (silly_list) {
793 UNLESS (__import___str=PyString_FromString("__import__"))
794 return NULL;
795 UNLESS (__builtins___str=PyString_FromString("__builtins__"))
796 return NULL;
797 UNLESS (silly_list=Py_BuildValue("[s]","__doc__"))
798 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000799 }
800
Guido van Rossum053b8df1998-11-25 16:18:00 +0000801 if ((globals=PyEval_GetGlobals())) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000802 Py_INCREF(globals);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000803 UNLESS (__builtins__=PyObject_GetItem(globals,__builtins___str))
804 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000805 }
806 else {
807 PyErr_Clear();
808
Guido van Rossum053b8df1998-11-25 16:18:00 +0000809 UNLESS (standard_builtins ||
810 (standard_builtins=PyImport_ImportModule("__builtin__")))
811 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000812
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000813 __builtins__=standard_builtins;
814 Py_INCREF(__builtins__);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000815 UNLESS (globals = Py_BuildValue("{sO}", "__builtins__", __builtins__))
816 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000817 }
818
Guido van Rossum053b8df1998-11-25 16:18:00 +0000819 if (PyDict_Check(__builtins__)) {
820 UNLESS (__import__=PyObject_GetItem(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000821 }
822 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000823 UNLESS (__import__=PyObject_GetAttr(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000824 }
825
Guido van Rossum053b8df1998-11-25 16:18:00 +0000826 UNLESS (r=PyObject_CallFunction(__import__,"OOOO",
827 module_name, globals, globals, silly_list))
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000828 goto err;
829
830 Py_DECREF(globals);
831 Py_DECREF(__builtins__);
832 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000833
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000834 return r;
835err:
836 Py_XDECREF(globals);
837 Py_XDECREF(__builtins__);
838 Py_XDECREF(__import__);
839 return NULL;
840}
841
842static PyObject *
Guido van Rossume2d81cd1998-08-08 19:40:10 +0000843whichmodule(PyObject *global, PyObject *global_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000844 int i, j;
845 PyObject *module = 0, *modules_dict = 0,
846 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000847
Guido van Rossum45188231997-09-28 05:38:51 +0000848 module = PyObject_GetAttrString(global, "__module__");
849 if (module) return module;
850 PyErr_Clear();
851
Guido van Rossum053b8df1998-11-25 16:18:00 +0000852 UNLESS (modules_dict = PySys_GetObject("modules"))
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000853 return NULL;
854
Guido van Rossum60456fd1997-04-09 17:36:32 +0000855 i = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000856 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
857
Guido van Rossum053b8df1998-11-25 16:18:00 +0000858 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000859
Guido van Rossum053b8df1998-11-25 16:18:00 +0000860 UNLESS (global_name_attr = PyObject_GetAttr(module, global_name)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000861 PyErr_Clear();
862 continue;
863 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000864
Guido van Rossum60456fd1997-04-09 17:36:32 +0000865 if (global_name_attr != global) {
866 Py_DECREF(global_name_attr);
867 continue;
868 }
869
870 Py_DECREF(global_name_attr);
871
872 break;
873 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000874
875 /* The following implements the rule in pickle.py added in 1.5
876 that used __main__ if no module is found. I don't actually
877 like this rule. jlf
878 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000879 if (!j) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000880 j=1;
881 name=__main___str;
882 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000883
884 Py_INCREF(name);
885 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000886}
887
888
Guido van Rossum60456fd1997-04-09 17:36:32 +0000889static int
890save_none(Picklerobject *self, PyObject *args) {
891 static char none = NONE;
Tim Peters84e87f32001-03-17 04:50:51 +0000892 if ((*self->write_func)(self, &none, 1) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000893 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000894
Guido van Rossum60456fd1997-04-09 17:36:32 +0000895 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000896}
897
Tim Peters84e87f32001-03-17 04:50:51 +0000898
Guido van Rossum60456fd1997-04-09 17:36:32 +0000899static int
900save_int(Picklerobject *self, PyObject *args) {
901 char c_str[32];
902 long l = PyInt_AS_LONG((PyIntObject *)args);
903 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000904
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000905 if (!self->bin
906#if SIZEOF_LONG > 4
Tim Peters3906eb82001-04-10 04:22:00 +0000907 || l > 0x7fffffffL
908 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000909#endif
Tim Peters3906eb82001-04-10 04:22:00 +0000910 ) {
911 /* Text-mode pickle, or long too big to fit in the 4-byte
912 * signed BININT format: store as a string.
913 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914 c_str[0] = INT;
915 sprintf(c_str + 1, "%ld\n", l);
916 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
917 return -1;
918 }
919 else {
Tim Petersd8ae7c22001-04-10 04:35:28 +0000920 /* Binary pickle and l fits in a signed 4-byte int. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000921 c_str[1] = (int)( l & 0xff);
922 c_str[2] = (int)((l >> 8) & 0xff);
923 c_str[3] = (int)((l >> 16) & 0xff);
924 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000925
Guido van Rossum60456fd1997-04-09 17:36:32 +0000926 if ((c_str[4] == 0) && (c_str[3] == 0)) {
927 if (c_str[2] == 0) {
928 c_str[0] = BININT1;
929 len = 2;
930 }
931 else {
932 c_str[0] = BININT2;
933 len = 3;
934 }
935 }
936 else {
937 c_str[0] = BININT;
938 len = 5;
939 }
940
941 if ((*self->write_func)(self, c_str, len) < 0)
942 return -1;
943 }
944
945 return 0;
946}
947
948
949static int
950save_long(Picklerobject *self, PyObject *args) {
951 int size, res = -1;
952 PyObject *repr = 0;
953
954 static char l = LONG;
955
Guido van Rossum053b8df1998-11-25 16:18:00 +0000956 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000957 goto finally;
958
959 if ((size = PyString_Size(repr)) < 0)
960 goto finally;
961
962 if ((*self->write_func)(self, &l, 1) < 0)
963 goto finally;
964
Tim Peters84e87f32001-03-17 04:50:51 +0000965 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000966 PyString_AS_STRING((PyStringObject *)repr), size) < 0)
967 goto finally;
968
969 if ((*self->write_func)(self, "\n", 1) < 0)
970 goto finally;
971
972 res = 0;
973
974finally:
975 Py_XDECREF(repr);
976
977 return res;
978}
979
980
981static int
982save_float(Picklerobject *self, PyObject *args) {
983 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
984
Guido van Rossum60456fd1997-04-09 17:36:32 +0000985 if (self->bin) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000986 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000987 double f;
988 long fhi, flo;
Fred Drake2c7a6852001-07-17 18:34:03 +0000989 char str[9];
990 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000991
992 *p = BINFLOAT;
993 p++;
994
995 if (x < 0) {
996 s = 1;
997 x = -x;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000998 }
999 else
Guido van Rossum60456fd1997-04-09 17:36:32 +00001000 s = 0;
1001
1002 f = frexp(x, &e);
1003
1004 /* Normalize f to be in the range [1.0, 2.0) */
1005 if (0.5 <= f && f < 1.0) {
1006 f *= 2.0;
1007 e--;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001008 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001009 else if (f == 0.0) {
1010 e = 0;
1011 }
1012 else {
1013 PyErr_SetString(PyExc_SystemError,
1014 "frexp() result out of range");
1015 return -1;
1016 }
1017
1018 if (e >= 1024) {
1019 /* XXX 1024 itself is reserved for Inf/NaN */
1020 PyErr_SetString(PyExc_OverflowError,
1021 "float too large to pack with d format");
1022 return -1;
1023 }
1024 else if (e < -1022) {
1025 /* Gradual underflow */
1026 f = ldexp(f, 1022 + e);
1027 e = 0;
1028 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001029 else if (!(e == 0 && f == 0.0)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030 e += 1023;
1031 f -= 1.0; /* Get rid of leading 1 */
1032 }
1033
1034 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
1035 f *= 268435456.0; /* 2**28 */
1036 fhi = (long) floor(f); /* Truncate */
1037 f -= (double)fhi;
1038 f *= 16777216.0; /* 2**24 */
1039 flo = (long) floor(f + 0.5); /* Round */
1040
1041 /* First byte */
1042 *p = (s<<7) | (e>>4);
1043 p++;
1044
1045 /* Second byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001046 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
Guido van Rossum60456fd1997-04-09 17:36:32 +00001047 p++;
1048
1049 /* Third byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001050 *p = (unsigned char) ((fhi>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001051 p++;
1052
1053 /* Fourth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001054 *p = (unsigned char) ((fhi>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001055 p++;
1056
1057 /* Fifth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001058 *p = (unsigned char) (fhi & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001059 p++;
1060
1061 /* Sixth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001062 *p = (unsigned char) ((flo>>16) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001063 p++;
1064
1065 /* Seventh byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001066 *p = (unsigned char) ((flo>>8) & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001067 p++;
1068
1069 /* Eighth byte */
Fred Drake2c7a6852001-07-17 18:34:03 +00001070 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001071
1072 if ((*self->write_func)(self, str, 9) < 0)
1073 return -1;
1074 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001075 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001076 char c_str[250];
1077 c_str[0] = FLOAT;
Guido van Rossum104be4a1998-04-03 21:13:02 +00001078 sprintf(c_str + 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001079
1080 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1081 return -1;
1082 }
1083
1084 return 0;
1085}
1086
1087
1088static int
Guido van Rossum142eeb81997-08-13 03:14:41 +00001089save_string(Picklerobject *self, PyObject *args, int doput) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001090 int size, len;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001091 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001092
Guido van Rossum053b8df1998-11-25 16:18:00 +00001093 if ((size = PyString_Size(args)) < 0)
1094 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001095
1096 if (!self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001097 char *repr_str;
1098
1099 static char string = STRING;
1100
Guido van Rossum053b8df1998-11-25 16:18:00 +00001101 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102 return -1;
1103
Guido van Rossum053b8df1998-11-25 16:18:00 +00001104 if ((len = PyString_Size(repr)) < 0)
1105 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001107
1108 if ((*self->write_func)(self, &string, 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001109 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001110
1111 if ((*self->write_func)(self, repr_str, len) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001112 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001113
1114 if ((*self->write_func)(self, "\n", 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001115 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
1117 Py_XDECREF(repr);
1118 }
1119 else {
1120 int i;
1121 char c_str[5];
1122
Guido van Rossum053b8df1998-11-25 16:18:00 +00001123 if ((size = PyString_Size(args)) < 0)
1124 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
1126 if (size < 256) {
1127 c_str[0] = SHORT_BINSTRING;
1128 c_str[1] = size;
1129 len = 2;
1130 }
1131 else {
1132 c_str[0] = BINSTRING;
1133 for (i = 1; i < 5; i++)
1134 c_str[i] = (int)(size >> ((i - 1) * 8));
1135 len = 5;
1136 }
1137
1138 if ((*self->write_func)(self, c_str, len) < 0)
1139 return -1;
1140
Guido van Rossum053b8df1998-11-25 16:18:00 +00001141 if (size > 128 && Pdata_Check(self->file)) {
1142 if (write_other(self, NULL, 0) < 0) return -1;
1143 PDATA_APPEND(self->file, args, -1);
1144 }
1145 else {
Tim Peters84e87f32001-03-17 04:50:51 +00001146 if ((*self->write_func)(self,
Guido van Rossum053b8df1998-11-25 16:18:00 +00001147 PyString_AS_STRING((PyStringObject *)args), size) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001148 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001149 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150 }
1151
Guido van Rossum142eeb81997-08-13 03:14:41 +00001152 if (doput)
1153 if (put(self, args) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001154 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155
1156 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001157
1158err:
1159 Py_XDECREF(repr);
1160 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161}
1162
1163
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001164#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001165/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1166 backslash and newline characters to \uXXXX escapes. */
1167static PyObject *
1168modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1169{
1170 PyObject *repr;
1171 char *p;
1172 char *q;
1173
1174 static const char *hexdigit = "0123456789ABCDEF";
1175
1176 repr = PyString_FromStringAndSize(NULL, 6 * size);
1177 if (repr == NULL)
1178 return NULL;
1179 if (size == 0)
1180 return repr;
1181
1182 p = q = PyString_AS_STRING(repr);
1183 while (size-- > 0) {
1184 Py_UNICODE ch = *s++;
1185 /* Map 16-bit characters to '\uxxxx' */
1186 if (ch >= 256 || ch == '\\' || ch == '\n') {
1187 *p++ = '\\';
1188 *p++ = 'u';
1189 *p++ = hexdigit[(ch >> 12) & 0xf];
1190 *p++ = hexdigit[(ch >> 8) & 0xf];
1191 *p++ = hexdigit[(ch >> 4) & 0xf];
1192 *p++ = hexdigit[ch & 15];
1193 }
1194 /* Copy everything else as-is */
1195 else
1196 *p++ = (char) ch;
1197 }
1198 *p = '\0';
1199 if (_PyString_Resize(&repr, p - q))
1200 goto onError;
1201
1202 return repr;
1203
1204 onError:
1205 Py_DECREF(repr);
1206 return NULL;
1207}
1208
1209
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001211save_unicode(Picklerobject *self, PyObject *args, int doput) {
1212 int size, len;
1213 PyObject *repr=0;
1214
1215 if (!PyUnicode_Check(args))
1216 return -1;
1217
1218 if (!self->bin) {
1219 char *repr_str;
1220 static char string = UNICODE;
1221
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001222 UNLESS(repr = modified_EncodeRawUnicodeEscape(
1223 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)))
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001224 return -1;
1225
1226 if ((len = PyString_Size(repr)) < 0)
1227 goto err;
1228 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1229
1230 if ((*self->write_func)(self, &string, 1) < 0)
1231 goto err;
1232
1233 if ((*self->write_func)(self, repr_str, len) < 0)
1234 goto err;
1235
1236 if ((*self->write_func)(self, "\n", 1) < 0)
1237 goto err;
1238
1239 Py_XDECREF(repr);
1240 }
1241 else {
1242 int i;
1243 char c_str[5];
1244
1245 UNLESS (repr = PyUnicode_AsUTF8String(args))
1246 return -1;
1247
1248 if ((size = PyString_Size(repr)) < 0)
1249 goto err;
1250
1251 c_str[0] = BINUNICODE;
1252 for (i = 1; i < 5; i++)
1253 c_str[i] = (int)(size >> ((i - 1) * 8));
1254 len = 5;
1255
1256 if ((*self->write_func)(self, c_str, len) < 0)
1257 goto err;
1258
1259 if (size > 128 && Pdata_Check(self->file)) {
1260 if (write_other(self, NULL, 0) < 0)
1261 goto err;
1262 PDATA_APPEND(self->file, repr, -1);
1263 }
1264 else {
1265 if ((*self->write_func)(self, PyString_AS_STRING(repr), size) < 0)
1266 goto err;
1267 }
1268
1269 Py_DECREF(repr);
1270 }
1271
1272 if (doput)
1273 if (put(self, args) < 0)
1274 return -1;
1275
1276 return 0;
1277
1278err:
1279 Py_XDECREF(repr);
1280 return -1;
1281}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001282#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001283
1284
1285static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001286save_tuple(Picklerobject *self, PyObject *args) {
1287 PyObject *element = 0, *py_tuple_id = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001288 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001289
1290 static char tuple = TUPLE;
1291
1292 if ((*self->write_func)(self, &MARKv, 1) < 0)
1293 goto finally;
1294
Tim Peters84e87f32001-03-17 04:50:51 +00001295 if ((len = PyTuple_Size(args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001296 goto finally;
1297
1298 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001299 UNLESS (element = PyTuple_GET_ITEM((PyTupleObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001300 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001301
Guido van Rossum60456fd1997-04-09 17:36:32 +00001302 if (save(self, element, 0) < 0)
1303 goto finally;
1304 }
1305
Guido van Rossum534b7c52000-06-28 22:23:56 +00001306 UNLESS (py_tuple_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001307 goto finally;
1308
1309 if (len) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001310 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001311 if (self->bin) {
1312 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001313
Guido van Rossum60456fd1997-04-09 17:36:32 +00001314 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1315 goto finally;
1316 }
1317 else {
1318 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001319
Guido van Rossum60456fd1997-04-09 17:36:32 +00001320 for (i = 0; i <= len; i++) {
1321 if ((*self->write_func)(self, &pop, 1) < 0)
1322 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001323 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001324 }
Tim Peters84e87f32001-03-17 04:50:51 +00001325
Guido van Rossum60456fd1997-04-09 17:36:32 +00001326 if (get(self, py_tuple_id) < 0)
1327 goto finally;
1328
1329 res = 0;
1330 goto finally;
1331 }
1332 }
1333
1334 if ((*self->write_func)(self, &tuple, 1) < 0) {
1335 goto finally;
1336 }
1337
1338 if (put(self, args) < 0)
1339 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001340
Guido van Rossum60456fd1997-04-09 17:36:32 +00001341 res = 0;
1342
1343finally:
1344 Py_XDECREF(py_tuple_id);
1345
1346 return res;
1347}
1348
1349static int
1350save_empty_tuple(Picklerobject *self, PyObject *args) {
1351 static char tuple = EMPTY_TUPLE;
1352
1353 return (*self->write_func)(self, &tuple, 1);
1354}
1355
1356
1357static int
1358save_list(Picklerobject *self, PyObject *args) {
1359 PyObject *element = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001360 int s_len, len, i, using_appends, res = -1, unfast = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001361 char s[3];
1362
1363 static char append = APPEND, appends = APPENDS;
1364
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001365 if (self->fast && self->fast_container++ > FAST_LIMIT) {
1366 self->fast = 0;
1367 unfast = 1;
1368 }
1369
Guido van Rossum053b8df1998-11-25 16:18:00 +00001370 if (self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001371 s[0] = EMPTY_LIST;
1372 s_len = 1;
Tim Peters84e87f32001-03-17 04:50:51 +00001373 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001374 else {
1375 s[0] = MARK;
1376 s[1] = LIST;
1377 s_len = 2;
1378 }
1379
1380 if ((len = PyList_Size(args)) < 0)
1381 goto finally;
1382
1383 if ((*self->write_func)(self, s, s_len) < 0)
1384 goto finally;
1385
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001386 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001387 if (put(self, args) < 0)
1388 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001389 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001390 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001391 if (put2(self, args) < 0)
1392 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001393 }
1394
Guido van Rossum142eeb81997-08-13 03:14:41 +00001395 if ((using_appends = (self->bin && (len > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396 if ((*self->write_func)(self, &MARKv, 1) < 0)
1397 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001398
Guido van Rossum60456fd1997-04-09 17:36:32 +00001399 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001400 UNLESS (element = PyList_GET_ITEM((PyListObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401 goto finally;
1402
Tim Peters84e87f32001-03-17 04:50:51 +00001403 if (save(self, element, 0) < 0)
1404 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405
1406 if (!using_appends) {
1407 if ((*self->write_func)(self, &append, 1) < 0)
1408 goto finally;
1409 }
1410 }
1411
1412 if (using_appends) {
1413 if ((*self->write_func)(self, &appends, 1) < 0)
1414 goto finally;
1415 }
1416
1417 res = 0;
1418
1419finally:
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001420 if (self->fast || unfast) {
1421 self->fast_container--;
1422 if (unfast && self->fast_container < FAST_LIMIT)
1423 self->fast = 1;
1424 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001425
1426 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001427}
1428
1429
Guido van Rossum60456fd1997-04-09 17:36:32 +00001430static int
1431save_dict(Picklerobject *self, PyObject *args) {
1432 PyObject *key = 0, *value = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001433 int i, len, res = -1, using_setitems, unfast = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001434 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001435
Guido van Rossum60456fd1997-04-09 17:36:32 +00001436 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001437
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001438 if (self->fast && self->fast_container++ > FAST_LIMIT) {
1439 self->fast = 0;
1440 unfast = 1;
1441 }
1442
Guido van Rossum60456fd1997-04-09 17:36:32 +00001443 if (self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001444 s[0] = EMPTY_DICT;
1445 len = 1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001446 }
1447 else {
1448 s[0] = MARK;
1449 s[1] = DICT;
1450 len = 2;
1451 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001452
Guido van Rossum60456fd1997-04-09 17:36:32 +00001453 if ((*self->write_func)(self, s, len) < 0)
1454 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001455
Guido van Rossum60456fd1997-04-09 17:36:32 +00001456 if ((len = PyDict_Size(args)) < 0)
1457 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001458
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001459 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001460 if (put(self, args) < 0)
1461 goto finally;
1462 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001463 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001464 if (put2(self, args) < 0)
1465 goto finally;
1466 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001467
Guido van Rossum142eeb81997-08-13 03:14:41 +00001468 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001469 if ((*self->write_func)(self, &MARKv, 1) < 0)
1470 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001471
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472 i = 0;
1473 while (PyDict_Next(args, &i, &key, &value)) {
1474 if (save(self, key, 0) < 0)
1475 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001476
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477 if (save(self, value, 0) < 0)
1478 goto finally;
1479
1480 if (!using_setitems) {
1481 if ((*self->write_func)(self, &setitem, 1) < 0)
1482 goto finally;
1483 }
1484 }
1485
1486 if (using_setitems) {
1487 if ((*self->write_func)(self, &setitems, 1) < 0)
1488 goto finally;
1489 }
1490
1491 res = 0;
1492
1493finally:
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001494 if (self->fast || unfast) {
1495 self->fast_container--;
1496 if (unfast && self->fast_container < FAST_LIMIT)
1497 self->fast = 1;
1498 }
1499
Guido van Rossum60456fd1997-04-09 17:36:32 +00001500
1501 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001502}
1503
1504
Tim Peters84e87f32001-03-17 04:50:51 +00001505static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001506save_inst(Picklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00001507 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1509 char *module_str, *name_str;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001510 int module_size, name_size, res = -1, unfast = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001511
Guido van Rossum60456fd1997-04-09 17:36:32 +00001512 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001513
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001514 if (self->fast && self->fast_container++ > FAST_LIMIT) {
1515 self->fast = 0;
1516 unfast = 1;
1517 }
1518
Guido van Rossum60456fd1997-04-09 17:36:32 +00001519 if ((*self->write_func)(self, &MARKv, 1) < 0)
1520 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001521
Guido van Rossum053b8df1998-11-25 16:18:00 +00001522 UNLESS (class = PyObject_GetAttr(args, __class___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001523 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001524
Guido van Rossum60456fd1997-04-09 17:36:32 +00001525 if (self->bin) {
1526 if (save(self, class, 0) < 0)
1527 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001528 }
1529
Guido van Rossum142eeb81997-08-13 03:14:41 +00001530 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001531 PyObject *element = 0;
1532 int i, len;
1533
Tim Peters84e87f32001-03-17 04:50:51 +00001534 UNLESS (class_args =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001535 PyObject_Call(getinitargs_func, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001536 goto finally;
1537
Tim Peters84e87f32001-03-17 04:50:51 +00001538 if ((len = PyObject_Size(class_args)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001539 goto finally;
1540
1541 for (i = 0; i < len; i++) {
Tim Peters84e87f32001-03-17 04:50:51 +00001542 UNLESS (element = PySequence_GetItem(class_args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543 goto finally;
1544
1545 if (save(self, element, 0) < 0) {
1546 Py_DECREF(element);
1547 goto finally;
1548 }
1549
1550 Py_DECREF(element);
1551 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001552 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001553 else {
1554 PyErr_Clear();
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001555 }
1556
Guido van Rossum60456fd1997-04-09 17:36:32 +00001557 if (!self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001558 UNLESS (name = ((PyClassObject *)class)->cl_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001559 PyErr_SetString(PicklingError, "class has no name");
1560 goto finally;
1561 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001562
Guido van Rossum053b8df1998-11-25 16:18:00 +00001563 UNLESS (module = whichmodule(class, name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001564 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001565
Tim Peters84e87f32001-03-17 04:50:51 +00001566
Guido van Rossum053b8df1998-11-25 16:18:00 +00001567 if ((module_size = PyString_Size(module)) < 0 ||
1568 (name_size = PyString_Size(name)) < 0)
1569 goto finally;
1570
Guido van Rossum60456fd1997-04-09 17:36:32 +00001571 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001572 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001573
Guido van Rossum60456fd1997-04-09 17:36:32 +00001574 if ((*self->write_func)(self, &inst, 1) < 0)
1575 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001576
Guido van Rossum60456fd1997-04-09 17:36:32 +00001577 if ((*self->write_func)(self, module_str, module_size) < 0)
1578 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001579
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580 if ((*self->write_func)(self, "\n", 1) < 0)
1581 goto finally;
1582
1583 if ((*self->write_func)(self, name_str, name_size) < 0)
1584 goto finally;
1585
1586 if ((*self->write_func)(self, "\n", 1) < 0)
1587 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001588 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001589 else if ((*self->write_func)(self, &obj, 1) < 0) {
1590 goto finally;
1591 }
1592
Guido van Rossum142eeb81997-08-13 03:14:41 +00001593 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001594 UNLESS (state = PyObject_Call(getstate_func, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595 goto finally;
1596 }
1597 else {
1598 PyErr_Clear();
1599
Guido van Rossum053b8df1998-11-25 16:18:00 +00001600 UNLESS (state = PyObject_GetAttr(args, __dict___str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001601 PyErr_Clear();
1602 res = 0;
1603 goto finally;
1604 }
1605 }
1606
1607 if (!PyDict_Check(state)) {
1608 if (put2(self, args) < 0)
1609 goto finally;
1610 }
1611 else {
1612 if (put(self, args) < 0)
1613 goto finally;
1614 }
Tim Peters84e87f32001-03-17 04:50:51 +00001615
Guido van Rossum60456fd1997-04-09 17:36:32 +00001616 if (save(self, state, 0) < 0)
1617 goto finally;
1618
1619 if ((*self->write_func)(self, &build, 1) < 0)
1620 goto finally;
1621
1622 res = 0;
1623
1624finally:
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001625 if (self->fast || unfast) {
1626 self->fast_container--;
1627 if (unfast && self->fast_container < FAST_LIMIT)
1628 self->fast = 1;
1629 }
1630
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631 Py_XDECREF(module);
1632 Py_XDECREF(class);
1633 Py_XDECREF(state);
1634 Py_XDECREF(getinitargs_func);
1635 Py_XDECREF(getstate_func);
1636 Py_XDECREF(class_args);
1637
1638 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001639}
1640
1641
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642static int
1643save_global(Picklerobject *self, PyObject *args, PyObject *name) {
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001644 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00001645 char *name_str, *module_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001646 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001647
Guido van Rossum60456fd1997-04-09 17:36:32 +00001648 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001649
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001650 if (name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001651 global_name = name;
1652 Py_INCREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001653 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001654 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001655 UNLESS (global_name = PyObject_GetAttr(args, __name___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001656 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001657 }
1658
Guido van Rossum053b8df1998-11-25 16:18:00 +00001659 UNLESS (module = whichmodule(args, global_name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001660 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001661
Guido van Rossum053b8df1998-11-25 16:18:00 +00001662 if ((module_size = PyString_Size(module)) < 0 ||
1663 (name_size = PyString_Size(global_name)) < 0)
1664 goto finally;
1665
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001666 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001669 mod = PyImport_ImportModule(module_str);
1670 if (mod == NULL) {
1671 /* Py_ErrClear(); ?? */
1672 cPickle_ErrFormat(PicklingError,
1673 "Can't pickle %s: it's not found as %s.%s",
1674 "OSS", args, module, global_name);
1675 goto finally;
1676 }
1677 moddict = PyModule_GetDict(mod); /* borrowed ref */
1678 klass = PyDict_GetItemString(moddict, name_str); /* borrowed ref */
1679 if (klass == NULL) {
1680 cPickle_ErrFormat(PicklingError,
1681 "Can't pickle %s: it's not found as %s.%s",
1682 "OSS", args, module, global_name);
1683 goto finally;
1684 }
1685 if (klass != args) {
1686 cPickle_ErrFormat(PicklingError,
1687 "Can't pickle %s: it's not the same object as %s.%s",
1688 "OSS", args, module, global_name);
1689 goto finally;
1690 }
1691
Guido van Rossum60456fd1997-04-09 17:36:32 +00001692 if ((*self->write_func)(self, &global, 1) < 0)
1693 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Guido van Rossum60456fd1997-04-09 17:36:32 +00001695 if ((*self->write_func)(self, module_str, module_size) < 0)
1696 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697
Guido van Rossum60456fd1997-04-09 17:36:32 +00001698 if ((*self->write_func)(self, "\n", 1) < 0)
1699 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001700
Guido van Rossum60456fd1997-04-09 17:36:32 +00001701 if ((*self->write_func)(self, name_str, name_size) < 0)
1702 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001703
Guido van Rossum60456fd1997-04-09 17:36:32 +00001704 if ((*self->write_func)(self, "\n", 1) < 0)
1705 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Guido van Rossum60456fd1997-04-09 17:36:32 +00001707 if (put(self, args) < 0)
1708 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Guido van Rossum60456fd1997-04-09 17:36:32 +00001710 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Guido van Rossum60456fd1997-04-09 17:36:32 +00001712finally:
1713 Py_XDECREF(module);
1714 Py_XDECREF(global_name);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001715 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001716
Guido van Rossum60456fd1997-04-09 17:36:32 +00001717 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001718}
1719
Guido van Rossum60456fd1997-04-09 17:36:32 +00001720static int
1721save_pers(Picklerobject *self, PyObject *args, PyObject *f) {
1722 PyObject *pid = 0;
1723 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001724
Guido van Rossum60456fd1997-04-09 17:36:32 +00001725 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001726
Guido van Rossum053b8df1998-11-25 16:18:00 +00001727 Py_INCREF(args);
1728 ARG_TUP(self, args);
1729 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001730 pid = PyObject_Call(f, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001731 FREE_ARG_TUP(self);
1732 }
1733 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001734
Guido van Rossum60456fd1997-04-09 17:36:32 +00001735 if (pid != Py_None) {
1736 if (!self->bin) {
1737 if (!PyString_Check(pid)) {
Tim Peters84e87f32001-03-17 04:50:51 +00001738 PyErr_SetString(PicklingError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001739 "persistent id must be string");
1740 goto finally;
1741 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001742
Guido van Rossum60456fd1997-04-09 17:36:32 +00001743 if ((*self->write_func)(self, &persid, 1) < 0)
1744 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001745
Guido van Rossum60456fd1997-04-09 17:36:32 +00001746 if ((size = PyString_Size(pid)) < 0)
1747 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748
Tim Peters84e87f32001-03-17 04:50:51 +00001749 if ((*self->write_func)(self,
Guido van Rossum60456fd1997-04-09 17:36:32 +00001750 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1751 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001752
Guido van Rossum60456fd1997-04-09 17:36:32 +00001753 if ((*self->write_func)(self, "\n", 1) < 0)
1754 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001755
Guido van Rossum60456fd1997-04-09 17:36:32 +00001756 res = 1;
1757 goto finally;
1758 }
1759 else if (save(self, pid, 1) >= 0) {
1760 if ((*self->write_func)(self, &binpersid, 1) < 0)
1761 res = -1;
1762 else
1763 res = 1;
1764 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Tim Peters84e87f32001-03-17 04:50:51 +00001766 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001767 }
1768
Guido van Rossum60456fd1997-04-09 17:36:32 +00001769 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770
Guido van Rossum60456fd1997-04-09 17:36:32 +00001771finally:
1772 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Guido van Rossum60456fd1997-04-09 17:36:32 +00001774 return res;
1775}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001776
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Tim Peters84e87f32001-03-17 04:50:51 +00001778static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779save_reduce(Picklerobject *self, PyObject *callable,
1780 PyObject *tup, PyObject *state, PyObject *ob) {
1781 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001782
Guido van Rossum60456fd1997-04-09 17:36:32 +00001783 if (save(self, callable, 0) < 0)
1784 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785
Guido van Rossum60456fd1997-04-09 17:36:32 +00001786 if (save(self, tup, 0) < 0)
1787 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001788
Guido van Rossum60456fd1997-04-09 17:36:32 +00001789 if ((*self->write_func)(self, &reduce, 1) < 0)
1790 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001791
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001792 if (ob != NULL) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001793 if (state && !PyDict_Check(state)) {
1794 if (put2(self, ob) < 0)
1795 return -1;
1796 }
1797 else {
1798 if (put(self, ob) < 0)
1799 return -1;
1800 }
1801 }
Tim Peters84e87f32001-03-17 04:50:51 +00001802
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001803 if (state) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001804 if (save(self, state, 0) < 0)
1805 return -1;
1806
1807 if ((*self->write_func)(self, &build, 1) < 0)
1808 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001809 }
1810
Guido van Rossum60456fd1997-04-09 17:36:32 +00001811 return 0;
1812}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Guido van Rossum60456fd1997-04-09 17:36:32 +00001814static int
1815save(Picklerobject *self, PyObject *args, int pers_save) {
1816 PyTypeObject *type;
1817 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
Guido van Rossum142eeb81997-08-13 03:14:41 +00001818 *callable = 0, *state = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001819 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Guido van Rossum60456fd1997-04-09 17:36:32 +00001821 if (!pers_save && self->pers_func) {
1822 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1823 res = tmp;
1824 goto finally;
1825 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826 }
1827
Guido van Rossum60456fd1997-04-09 17:36:32 +00001828 if (args == Py_None) {
1829 res = save_none(self, args);
1830 goto finally;
1831 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Guido van Rossum60456fd1997-04-09 17:36:32 +00001833 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Guido van Rossum60456fd1997-04-09 17:36:32 +00001835 switch (type->tp_name[0]) {
1836 case 'i':
1837 if (type == &PyInt_Type) {
1838 res = save_int(self, args);
1839 goto finally;
1840 }
1841 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Guido van Rossum60456fd1997-04-09 17:36:32 +00001843 case 'l':
1844 if (type == &PyLong_Type) {
1845 res = save_long(self, args);
1846 goto finally;
1847 }
1848 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001849
Guido van Rossum60456fd1997-04-09 17:36:32 +00001850 case 'f':
1851 if (type == &PyFloat_Type) {
1852 res = save_float(self, args);
1853 goto finally;
1854 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001855 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856
Guido van Rossum60456fd1997-04-09 17:36:32 +00001857 case 't':
1858 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001859 if (self->bin) res = save_empty_tuple(self, args);
1860 else res = save_tuple(self, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001861 goto finally;
1862 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001863 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865 case 's':
Guido van Rossum053b8df1998-11-25 16:18:00 +00001866 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001867 res = save_string(self, args, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001868 goto finally;
1869 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001870
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001871#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001872 case 'u':
1873 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1874 res = save_unicode(self, args, 0);
1875 goto finally;
1876 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001877#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00001878 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001879
Guido van Rossum60456fd1997-04-09 17:36:32 +00001880 if (args->ob_refcnt > 1) {
Guido van Rossum534b7c52000-06-28 22:23:56 +00001881 UNLESS (py_ob_id = PyLong_FromVoidPtr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001882 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001884 if (PyDict_GetItem(self->memo, py_ob_id)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001885 if (get(self, py_ob_id) < 0)
1886 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001887
Guido van Rossum60456fd1997-04-09 17:36:32 +00001888 res = 0;
1889 goto finally;
1890 }
1891 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001892
Guido van Rossum60456fd1997-04-09 17:36:32 +00001893 switch (type->tp_name[0]) {
1894 case 's':
1895 if (type == &PyString_Type) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001896 res = save_string(self, args, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001897 goto finally;
1898 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001899 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +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) {
1904 res = save_unicode(self, args, 1);
1905 goto finally;
1906 }
1907 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001908#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001909
Guido van Rossum60456fd1997-04-09 17:36:32 +00001910 case 't':
1911 if (type == &PyTuple_Type) {
1912 res = save_tuple(self, args);
1913 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001914 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001915 if (type == &PyType_Type) {
1916 res = save_global(self, args, NULL);
1917 goto finally;
1918 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001919 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921 case 'l':
1922 if (type == &PyList_Type) {
1923 res = save_list(self, args);
1924 goto finally;
1925 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001926 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001927
1928 case 'd':
1929 if (type == &PyDict_Type) {
1930 res = save_dict(self, args);
Tim Peters84e87f32001-03-17 04:50:51 +00001931 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001932 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001933 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934
1935 case 'i':
1936 if (type == &PyInstance_Type) {
1937 res = save_inst(self, args);
1938 goto finally;
1939 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001940 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001941
1942 case 'c':
1943 if (type == &PyClass_Type) {
1944 res = save_global(self, args, NULL);
1945 goto finally;
1946 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001947 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001948
1949 case 'f':
1950 if (type == &PyFunction_Type) {
1951 res = save_global(self, args, NULL);
1952 goto finally;
1953 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001954 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001955
1956 case 'b':
1957 if (type == &PyCFunction_Type) {
1958 res = save_global(self, args, NULL);
1959 goto finally;
1960 }
1961 }
1962
1963 if (!pers_save && self->inst_pers_func) {
1964 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
1965 res = tmp;
1966 goto finally;
1967 }
1968 }
1969
Guido van Rossum142eeb81997-08-13 03:14:41 +00001970 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001971 Py_INCREF(__reduce__);
1972
Guido van Rossum60456fd1997-04-09 17:36:32 +00001973 Py_INCREF(args);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001974 ARG_TUP(self, args);
1975 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001976 t = PyObject_Call(__reduce__, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001977 FREE_ARG_TUP(self);
1978 }
1979 if (! t) goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001980 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001981 else {
1982 PyErr_Clear();
1983
Guido van Rossum142eeb81997-08-13 03:14:41 +00001984 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001985 UNLESS (t = PyObject_Call(__reduce__, empty_tuple, NULL))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001986 goto finally;
1987 }
1988 else {
1989 PyErr_Clear();
1990 }
1991 }
1992
1993 if (t) {
1994 if (PyString_Check(t)) {
1995 res = save_global(self, args, t);
1996 goto finally;
1997 }
Tim Peters84e87f32001-03-17 04:50:51 +00001998
Guido van Rossum60456fd1997-04-09 17:36:32 +00001999 if (!PyTuple_Check(t)) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00002000 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002001 "be a tuple", "O", __reduce__);
2002 goto finally;
2003 }
2004
2005 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002006
Guido van Rossum60456fd1997-04-09 17:36:32 +00002007 if ((size != 3) && (size != 2)) {
Tim Peters84e87f32001-03-17 04:50:51 +00002008 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002009 "contain only two or three elements", "O", __reduce__);
2010 goto finally;
2011 }
Tim Peters84e87f32001-03-17 04:50:51 +00002012
Guido van Rossum60456fd1997-04-09 17:36:32 +00002013 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002014
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015 arg_tup = PyTuple_GET_ITEM(t, 1);
2016
2017 if (size > 2) {
2018 state = PyTuple_GET_ITEM(t, 2);
2019 }
2020
Guido van Rossum053b8df1998-11-25 16:18:00 +00002021 UNLESS (PyTuple_Check(arg_tup) || arg_tup==Py_None) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00002022 cPickle_ErrFormat(PicklingError, "Second element of tuple "
Guido van Rossum60456fd1997-04-09 17:36:32 +00002023 "returned by %s must be a tuple", "O", __reduce__);
2024 goto finally;
2025 }
2026
2027 res = save_reduce(self, callable, arg_tup, state, args);
2028 goto finally;
2029 }
2030
Guido van Rossumc03158b1999-06-09 15:23:31 +00002031 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
2033finally:
2034 Py_XDECREF(py_ob_id);
2035 Py_XDECREF(__reduce__);
2036 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002037
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038 return res;
2039}
2040
2041
2042static int
2043dump(Picklerobject *self, PyObject *args) {
2044 static char stop = STOP;
2045
2046 if (save(self, args, 0) < 0)
2047 return -1;
2048
2049 if ((*self->write_func)(self, &stop, 1) < 0)
2050 return -1;
2051
2052 if ((*self->write_func)(self, NULL, 0) < 0)
2053 return -1;
2054
2055 return 0;
2056}
2057
2058static PyObject *
Guido van Rossum053b8df1998-11-25 16:18:00 +00002059Pickle_clear_memo(Picklerobject *self, PyObject *args) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002060 if (!PyArg_ParseTuple(args,":clear_memo"))
2061 return NULL;
2062 if (self->memo)
2063 PyDict_Clear(self->memo);
2064 Py_INCREF(Py_None);
2065 return Py_None;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002066}
2067
2068static PyObject *
2069Pickle_getvalue(Picklerobject *self, PyObject *args) {
2070 int l, i, rsize, ssize, clear=1, lm;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002071 long ik;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002072 PyObject *k, *r;
2073 char *s, *p, *have_get;
2074 Pdata *data;
2075
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002076 /* Can be called by Python code or C code */
2077 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2078 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002079
2080 /* Check to make sure we are based on a list */
2081 if (! Pdata_Check(self->file)) {
2082 PyErr_SetString(PicklingError,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002083 "Attempt to getvalue() a non-list-based pickler");
Guido van Rossum053b8df1998-11-25 16:18:00 +00002084 return NULL;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002085 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002086
2087 /* flush write buffer */
2088 if (write_other(self, NULL, 0) < 0) return NULL;
2089
2090 data=(Pdata*)self->file;
2091 l=data->length;
2092
2093 /* set up an array to hold get/put status */
2094 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2095 lm++;
Tim Peters84e87f32001-03-17 04:50:51 +00002096 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002097 memset(have_get,0,lm);
2098
2099 /* Scan for gets. */
2100 for (rsize=0, i=l; --i >= 0; ) {
2101 k=data->data[i];
Tim Peters84e87f32001-03-17 04:50:51 +00002102
Guido van Rossum053b8df1998-11-25 16:18:00 +00002103 if (PyString_Check(k)) {
2104 rsize += PyString_GET_SIZE(k);
2105 }
2106
2107 else if (PyInt_Check(k)) { /* put */
2108 ik=PyInt_AS_LONG((PyIntObject*)k);
2109 if (ik >= lm || ik==0) {
2110 PyErr_SetString(PicklingError,
2111 "Invalid get data");
2112 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002113 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002114 if (have_get[ik]) { /* with matching get */
2115 if (ik < 256) rsize += 2;
2116 else rsize+=5;
2117 }
2118 }
2119
2120 else if (! (PyTuple_Check(k) &&
2121 PyTuple_GET_SIZE(k) == 2 &&
2122 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2123 ) {
2124 PyErr_SetString(PicklingError,
2125 "Unexpected data in internal list");
2126 return NULL;
2127 }
2128
2129 else { /* put */
2130 ik=PyInt_AS_LONG((PyIntObject*)k);
2131 if (ik >= lm || ik==0) {
2132 PyErr_SetString(PicklingError,
2133 "Invalid get data");
2134 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +00002135 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002136 have_get[ik]=1;
2137 if (ik < 256) rsize += 2;
2138 else rsize+=5;
2139 }
2140
2141 }
2142
2143 /* Now generate the result */
2144 UNLESS (r=PyString_FromStringAndSize(NULL,rsize)) goto err;
2145 s=PyString_AS_STRING((PyStringObject*)r);
2146
2147 for (i=0; i<l; i++) {
2148 k=data->data[i];
2149
2150 if (PyString_Check(k)) {
2151 ssize=PyString_GET_SIZE(k);
2152 if (ssize) {
2153 p=PyString_AS_STRING((PyStringObject*)k);
2154 while (--ssize >= 0) *s++=*p++;
2155 }
2156 }
2157
2158 else if (PyTuple_Check(k)) { /* get */
2159 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2160 if (ik < 256) {
2161 *s++ = BINGET;
2162 *s++ = (int)(ik & 0xff);
2163 }
2164 else {
2165 *s++ = LONG_BINGET;
2166 *s++ = (int)(ik & 0xff);
2167 *s++ = (int)((ik >> 8) & 0xff);
2168 *s++ = (int)((ik >> 16) & 0xff);
2169 *s++ = (int)((ik >> 24) & 0xff);
2170 }
2171 }
2172
2173 else { /* put */
2174 ik=PyInt_AS_LONG((PyIntObject*)k);
2175
2176 if (have_get[ik]) { /* with matching get */
2177 if (ik < 256) {
2178 *s++ = BINPUT;
2179 *s++ = (int)(ik & 0xff);
2180 }
2181 else {
2182 *s++ = LONG_BINPUT;
2183 *s++ = (int)(ik & 0xff);
2184 *s++ = (int)((ik >> 8) & 0xff);
2185 *s++ = (int)((ik >> 16) & 0xff);
2186 *s++ = (int)((ik >> 24) & 0xff);
2187 }
2188 }
2189 }
2190
2191 }
2192
2193 if (clear) {
2194 PyDict_Clear(self->memo);
2195 Pdata_clear(data,0);
2196 }
Tim Peters84e87f32001-03-17 04:50:51 +00002197
Guido van Rossum053b8df1998-11-25 16:18:00 +00002198 free(have_get);
2199 return r;
2200err:
2201 free(have_get);
2202 return NULL;
2203}
2204
2205static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002206Pickler_dump(Picklerobject *self, PyObject *args) {
2207 PyObject *ob;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002208 int get=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002209
Guido van Rossum43713e52000-02-29 13:59:29 +00002210 UNLESS (PyArg_ParseTuple(args, "O|i:dump", &ob, &get))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002211 return NULL;
2212
2213 if (dump(self, ob) < 0)
2214 return NULL;
2215
Guido van Rossum053b8df1998-11-25 16:18:00 +00002216 if (get) return Pickle_getvalue(self, NULL);
2217
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002218 /* XXX Why does dump() return self? */
Guido van Rossum053b8df1998-11-25 16:18:00 +00002219 Py_INCREF(self);
2220 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002221}
2222
2223
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002224static struct PyMethodDef Pickler_methods[] = {
Guido van Rossum142eeb81997-08-13 03:14:41 +00002225 {"dump", (PyCFunction)Pickler_dump, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002226 "dump(object) --"
2227 "Write an object in pickle format to the object's pickle stream\n"
2228 },
Guido van Rossum142eeb81997-08-13 03:14:41 +00002229 {"clear_memo", (PyCFunction)Pickle_clear_memo, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002230 "clear_memo() -- Clear the picklers memo"},
Guido van Rossum053b8df1998-11-25 16:18:00 +00002231 {"getvalue", (PyCFunction)Pickle_getvalue, 1,
2232 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002233 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002234};
2235
2236
2237static Picklerobject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002238newPicklerobject(PyObject *file, int bin) {
2239 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002240
Guido van Rossumb18618d2000-05-03 23:44:39 +00002241 UNLESS (self = PyObject_New(Picklerobject, &Picklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002242 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002243
2244 self->fp = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002245 self->write = NULL;
2246 self->memo = NULL;
2247 self->arg = NULL;
2248 self->pers_func = NULL;
2249 self->inst_pers_func = NULL;
2250 self->write_buf = NULL;
2251 self->bin = bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002252 self->fast = 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002253 self->fast_container = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002254 self->buf_size = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002255 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002256
Guido van Rossum053b8df1998-11-25 16:18:00 +00002257 if (file)
2258 Py_INCREF(file);
2259 else
Guido van Rossum50f385c1998-12-04 18:48:44 +00002260 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002261
2262 UNLESS (self->file = file)
Guido van Rossum83addc72000-04-21 20:49:36 +00002263 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002264
Tim Peters84e87f32001-03-17 04:50:51 +00002265 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00002266 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002267
Guido van Rossum60456fd1997-04-09 17:36:32 +00002268 if (PyFile_Check(file)) {
2269 self->fp = PyFile_AsFile(file);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002270 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00002271 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2272 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002273 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002274 self->write_func = write_file;
2275 }
2276 else if (PycStringIO_OutputCheck(file)) {
2277 self->write_func = write_cStringIO;
2278 }
Guido van Rossum142eeb81997-08-13 03:14:41 +00002279 else if (file == Py_None) {
2280 self->write_func = write_none;
2281 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002282 else {
2283 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284
Guido van Rossum053b8df1998-11-25 16:18:00 +00002285 if (! Pdata_Check(file)) {
2286 UNLESS (self->write = PyObject_GetAttr(file, write_str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002287 PyErr_Clear();
2288 PyErr_SetString(PyExc_TypeError, "argument must have 'write' "
Guido van Rossum053b8df1998-11-25 16:18:00 +00002289 "attribute");
2290 goto err;
2291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002293
Tim Peters84e87f32001-03-17 04:50:51 +00002294 UNLESS (self->write_buf =
2295 (char *)malloc(WRITE_BUF_SIZE * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002296 PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002297 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002298 }
2299 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002300
Guido van Rossum053b8df1998-11-25 16:18:00 +00002301 if (PyEval_GetRestricted()) {
2302 /* Restricted execution, get private tables */
2303 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002304
Guido van Rossum053b8df1998-11-25 16:18:00 +00002305 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
2306 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2307 Py_DECREF(m);
2308 UNLESS (self->dispatch_table) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002309 }
2310 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002311 self->dispatch_table=dispatch_table;
2312 Py_INCREF(dispatch_table);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002313 }
2314
Guido van Rossum60456fd1997-04-09 17:36:32 +00002315 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002316
2317err:
2318 Py_DECREF((PyObject *)self);
2319 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002320}
2321
2322
2323static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002324get_Pickler(PyObject *self, PyObject *args) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002325 PyObject *file = NULL;
2326 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002327
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002328 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002329 PyErr_Clear();
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002330 bin = 0;
2331 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2332 return NULL;
2333 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002334 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002335}
2336
2337
2338static void
Guido van Rossum60456fd1997-04-09 17:36:32 +00002339Pickler_dealloc(Picklerobject *self) {
2340 Py_XDECREF(self->write);
2341 Py_XDECREF(self->memo);
2342 Py_XDECREF(self->arg);
2343 Py_XDECREF(self->file);
2344 Py_XDECREF(self->pers_func);
2345 Py_XDECREF(self->inst_pers_func);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002346 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002347
Tim Peters84e87f32001-03-17 04:50:51 +00002348 if (self->write_buf) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002349 free(self->write_buf);
2350 }
2351
Guido van Rossumb18618d2000-05-03 23:44:39 +00002352 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002353}
2354
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002355static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002356Pickler_get_pers_func(Picklerobject *p)
2357{
2358 if (p->pers_func == NULL)
2359 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2360 else
2361 Py_INCREF(p->pers_func);
2362 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002363}
2364
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002365static int
2366Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2367{
2368 if (v == NULL) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002369 PyErr_SetString(PyExc_TypeError,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002370 "attribute deletion is not supported");
Guido van Rossum053b8df1998-11-25 16:18:00 +00002371 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002372 }
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002373 Py_XDECREF(p->pers_func);
2374 Py_INCREF(v);
2375 p->pers_func = v;
2376 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002377}
2378
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002379static int
2380Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2381{
2382 if (v == NULL) {
2383 PyErr_SetString(PyExc_TypeError,
2384 "attribute deletion is not supported");
2385 return -1;
2386 }
2387 Py_XDECREF(p->inst_pers_func);
2388 Py_INCREF(v);
2389 p->inst_pers_func = v;
2390 return 0;
2391}
2392
2393static PyObject *
2394Pickler_get_memo(Picklerobject *p)
2395{
2396 if (p->memo == NULL)
2397 PyErr_SetString(PyExc_AttributeError, "memo");
2398 else
2399 Py_INCREF(p->memo);
2400 return p->memo;
2401}
2402
2403static int
2404Pickler_set_memo(Picklerobject *p, PyObject *v)
2405{
2406 if (v == NULL) {
2407 PyErr_SetString(PyExc_TypeError,
2408 "attribute deletion is not supported");
2409 return -1;
2410 }
2411 if (!PyDict_Check(v)) {
2412 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2413 return -1;
2414 }
2415 Py_XDECREF(p->memo);
2416 Py_INCREF(v);
2417 p->memo = v;
2418 return 0;
2419}
2420
2421static PyObject *
2422Pickler_get_error(Picklerobject *p)
2423{
2424 /* why is this an attribute on the Pickler? */
2425 Py_INCREF(PicklingError);
2426 return PicklingError;
2427}
2428
2429static PyMemberDef Pickler_members[] = {
2430 {"binary", T_INT, offsetof(Picklerobject, bin)},
2431 {"fast", T_INT, offsetof(Picklerobject, fast)},
2432};
2433
2434static PyGetSetDef Pickler_getsets[] = {
2435 {"persistent_id", (getter)Pickler_get_pers_func,
2436 (setter)Pickler_set_pers_func},
2437 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2438 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
2439 {"PicklingError", (getter)Pickler_get_error, NULL}
2440};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002441
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002442static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002443"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002444
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002445static PyTypeObject Picklertype = {
2446 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002447 0, /*ob_size*/
2448 "Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002449 sizeof(Picklerobject), /*tp_basicsize*/
2450 0,
2451 (destructor)Pickler_dealloc, /* tp_dealloc */
2452 0, /* tp_print */
2453 0, /* tp_getattr */
2454 0, /* tp_setattr */
2455 0, /* tp_compare */
2456 0, /* tp_repr */
2457 0, /* tp_as_number */
2458 0, /* tp_as_sequence */
2459 0, /* tp_as_mapping */
2460 0, /* tp_hash */
2461 0, /* tp_call */
2462 0, /* tp_str */
2463 PyObject_GenericGetAttr, /* tp_getattro */
2464 PyObject_GenericSetAttr, /* tp_setattro */
2465 0, /* tp_as_buffer */
2466 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2467 Picklertype__doc__, /* tp_doc */
2468 0, /* tp_traverse */
2469 0, /* tp_clear */
2470 0, /* tp_richcompare */
2471 0, /* tp_weaklistoffset */
2472 0, /* tp_iter */
2473 0, /* tp_iternext */
2474 Pickler_methods, /* tp_methods */
2475 Pickler_members, /* tp_members */
2476 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002477};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002478
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002479static PyObject *
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002480find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) {
Guido van Rossume2d81cd1998-08-08 19:40:10 +00002481 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002482
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002483 if (fc) {
2484 if (fc==Py_None) {
Tim Peters84e87f32001-03-17 04:50:51 +00002485 PyErr_SetString(UnpicklingError,
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002486 "Global and instance pickles are not supported.");
2487 return NULL;
2488 }
2489 return PyObject_CallFunction(fc, "OO", py_module_name, py_global_name);
2490 }
2491
Jeremy Hyltond1055231998-08-11 19:52:51 +00002492 module = PySys_GetObject("modules");
2493 if (module == NULL)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002494 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002495
2496 module = PyDict_GetItem(module, py_module_name);
2497 if (module == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002498 module = PyImport_Import(py_module_name);
2499 if (!module)
2500 return NULL;
2501 global = PyObject_GetAttr(module, py_global_name);
2502 Py_DECREF(module);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002503 }
Jeremy Hyltond1055231998-08-11 19:52:51 +00002504 else
Guido van Rossum053b8df1998-11-25 16:18:00 +00002505 global = PyObject_GetAttr(module, py_global_name);
Jeremy Hyltond1055231998-08-11 19:52:51 +00002506 if (global == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002507 char buf[256 + 37];
2508 sprintf(buf, "Failed to import class %.128s from module %.128s",
2509 PyString_AS_STRING((PyStringObject*)py_global_name),
Tim Peters84e87f32001-03-17 04:50:51 +00002510 PyString_AS_STRING((PyStringObject*)py_module_name));
Guido van Rossum053b8df1998-11-25 16:18:00 +00002511 PyErr_SetString(PyExc_SystemError, buf);
2512 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002513 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002514 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002515}
2516
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002517static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002518marker(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002519 if (self->num_marks < 1) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002520 PyErr_SetString(UnpicklingError, "could not find MARK");
2521 return -1;
2522 }
2523
2524 return self->marks[--self->num_marks];
2525}
2526
Tim Peters84e87f32001-03-17 04:50:51 +00002527
Guido van Rossum60456fd1997-04-09 17:36:32 +00002528static int
2529load_none(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002530 PDATA_APPEND(self->stack, Py_None, -1);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002531 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002532}
2533
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002534static int
Thomas Wouters58d05102000-07-24 14:43:35 +00002535bad_readline(void) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002536 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2537 return -1;
2538}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002539
2540static int
2541load_int(Unpicklerobject *self) {
2542 PyObject *py_int = 0;
2543 char *endptr, *s;
2544 int len, res = -1;
2545 long l;
2546
2547 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002548 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002549 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002550
2551 errno = 0;
2552 l = strtol(s, &endptr, 0);
2553
2554 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2555 /* Hm, maybe we've got something long. Let's try reading
Guido van Rossum053b8df1998-11-25 16:18:00 +00002556 it as a Python long object. */
Tim Peters12778e32001-08-28 22:08:34 +00002557 errno = 0;
2558 py_int = PyLong_FromString(s, NULL, 0);
2559 if (py_int == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002560 PyErr_SetString(PyExc_ValueError,
2561 "could not convert string to int");
2562 goto finally;
2563 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002564 }
2565 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002566 UNLESS (py_int = PyInt_FromLong(l)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002567 }
2568
Guido van Rossum053b8df1998-11-25 16:18:00 +00002569 free(s);
2570 PDATA_PUSH(self->stack, py_int, -1);
2571 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002572
2573finally:
2574 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002575
2576 return res;
2577}
2578
2579
Tim Peters84e87f32001-03-17 04:50:51 +00002580static long
Guido van Rossum60456fd1997-04-09 17:36:32 +00002581calc_binint(char *s, int x) {
2582 unsigned char c;
2583 int i;
2584 long l;
2585
2586 for (i = 0, l = 0L; i < x; i++) {
2587 c = (unsigned char)s[i];
2588 l |= (long)c << (i * 8);
2589 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002590#if SIZEOF_LONG > 4
2591 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2592 * is signed, so on a box with longs bigger than 4 bytes we need
2593 * to extend a BININT's sign bit to the full width.
2594 */
2595 if (x == 4 && l & (1L << 31))
2596 l |= (~0L) << 32;
2597#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +00002598 return l;
2599}
2600
2601
2602static int
2603load_binintx(Unpicklerobject *self, char *s, int x) {
2604 PyObject *py_int = 0;
2605 long l;
2606
2607 l = calc_binint(s, x);
2608
Guido van Rossum053b8df1998-11-25 16:18:00 +00002609 UNLESS (py_int = PyInt_FromLong(l))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002610 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002611
Guido van Rossum053b8df1998-11-25 16:18:00 +00002612 PDATA_PUSH(self->stack, py_int, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002613 return 0;
2614}
2615
2616
2617static int
2618load_binint(Unpicklerobject *self) {
2619 char *s;
2620
2621 if ((*self->read_func)(self, &s, 4) < 0)
2622 return -1;
2623
2624 return load_binintx(self, s, 4);
2625}
2626
2627
2628static int
2629load_binint1(Unpicklerobject *self) {
2630 char *s;
2631
2632 if ((*self->read_func)(self, &s, 1) < 0)
2633 return -1;
2634
2635 return load_binintx(self, s, 1);
2636}
2637
2638
2639static int
2640load_binint2(Unpicklerobject *self) {
2641 char *s;
2642
2643 if ((*self->read_func)(self, &s, 2) < 0)
2644 return -1;
2645
2646 return load_binintx(self, s, 2);
2647}
Tim Peters84e87f32001-03-17 04:50:51 +00002648
Guido van Rossum60456fd1997-04-09 17:36:32 +00002649static int
2650load_long(Unpicklerobject *self) {
2651 PyObject *l = 0;
2652 char *end, *s;
2653 int len, res = -1;
2654
Guido van Rossum60456fd1997-04-09 17:36:32 +00002655 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002656 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002657 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002658
Guido van Rossum053b8df1998-11-25 16:18:00 +00002659 UNLESS (l = PyLong_FromString(s, &end, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002660 goto finally;
2661
Guido van Rossum053b8df1998-11-25 16:18:00 +00002662 free(s);
2663 PDATA_PUSH(self->stack, l, -1);
2664 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002665
2666finally:
2667 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002668
2669 return res;
2670}
2671
Tim Peters84e87f32001-03-17 04:50:51 +00002672
Guido van Rossum60456fd1997-04-09 17:36:32 +00002673static int
2674load_float(Unpicklerobject *self) {
2675 PyObject *py_float = 0;
2676 char *endptr, *s;
2677 int len, res = -1;
2678 double d;
2679
2680 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002681 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002682 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683
2684 errno = 0;
2685 d = strtod(s, &endptr);
2686
2687 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
Tim Peters84e87f32001-03-17 04:50:51 +00002688 PyErr_SetString(PyExc_ValueError,
Guido van Rossum60456fd1997-04-09 17:36:32 +00002689 "could not convert string to float");
2690 goto finally;
2691 }
2692
Guido van Rossum053b8df1998-11-25 16:18:00 +00002693 UNLESS (py_float = PyFloat_FromDouble(d))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002694 goto finally;
2695
Guido van Rossum053b8df1998-11-25 16:18:00 +00002696 free(s);
2697 PDATA_PUSH(self->stack, py_float, -1);
2698 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002699
2700finally:
2701 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702
2703 return res;
2704}
2705
Guido van Rossum60456fd1997-04-09 17:36:32 +00002706static int
2707load_binfloat(Unpicklerobject *self) {
2708 PyObject *py_float = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00002709 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710 long fhi, flo;
2711 double x;
2712 char *p;
2713
2714 if ((*self->read_func)(self, &p, 8) < 0)
2715 return -1;
2716
2717 /* First byte */
2718 s = (*p>>7) & 1;
2719 e = (*p & 0x7F) << 4;
2720 p++;
2721
2722 /* Second byte */
2723 e |= (*p>>4) & 0xF;
2724 fhi = (*p & 0xF) << 24;
2725 p++;
2726
2727 /* Third byte */
2728 fhi |= (*p & 0xFF) << 16;
2729 p++;
2730
2731 /* Fourth byte */
2732 fhi |= (*p & 0xFF) << 8;
2733 p++;
2734
2735 /* Fifth byte */
2736 fhi |= *p & 0xFF;
2737 p++;
2738
2739 /* Sixth byte */
2740 flo = (*p & 0xFF) << 16;
2741 p++;
2742
2743 /* Seventh byte */
2744 flo |= (*p & 0xFF) << 8;
2745 p++;
2746
2747 /* Eighth byte */
2748 flo |= *p & 0xFF;
2749
2750 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2751 x /= 268435456.0; /* 2**28 */
2752
2753 /* XXX This sadly ignores Inf/NaN */
2754 if (e == 0)
2755 e = -1022;
2756 else {
2757 x += 1.0;
2758 e -= 1023;
2759 }
2760 x = ldexp(x, e);
2761
2762 if (s)
2763 x = -x;
2764
Guido van Rossum053b8df1998-11-25 16:18:00 +00002765 UNLESS (py_float = PyFloat_FromDouble(x)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002766
Guido van Rossum053b8df1998-11-25 16:18:00 +00002767 PDATA_PUSH(self->stack, py_float, -1);
2768 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002769}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002770
2771static int
2772load_string(Unpicklerobject *self) {
2773 PyObject *str = 0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002774 int len, res = -1, nslash;
2775 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776
2777 static PyObject *eval_dict = 0;
2778
2779 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002780 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002781 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002782
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002783 /* Check for unquoted quotes (evil strings) */
2784 q=*s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002785 if (q != '"' && q != '\'') goto insecure;
2786 for (p=s+1, nslash=0; *p; p++) {
2787 if (*p==q && nslash%2==0) break;
2788 if (*p=='\\') nslash++;
2789 else nslash=0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002790 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002791 if (*p==q)
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002792 {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002793 for (p++; *p; p++) if (*p > ' ') goto insecure;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002794 }
2795 else goto insecure;
2796 /********************************************/
2797
Guido van Rossum053b8df1998-11-25 16:18:00 +00002798 UNLESS (eval_dict)
2799 UNLESS (eval_dict = Py_BuildValue("{s{}}", "__builtins__"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800 goto finally;
2801
Guido van Rossum053b8df1998-11-25 16:18:00 +00002802 UNLESS (str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002803 goto finally;
2804
Guido van Rossum053b8df1998-11-25 16:18:00 +00002805 free(s);
2806 PDATA_PUSH(self->stack, str, -1);
2807 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808
2809finally:
2810 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811
2812 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002813
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002814insecure:
2815 free(s);
2816 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2817 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002818}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
2820
2821static int
2822load_binstring(Unpicklerobject *self) {
2823 PyObject *py_string = 0;
2824 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002825 char *s;
2826
Guido van Rossum053b8df1998-11-25 16:18:00 +00002827 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828
2829 l = calc_binint(s, 4);
2830
2831 if ((*self->read_func)(self, &s, l) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002832 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002833
Guido van Rossum053b8df1998-11-25 16:18:00 +00002834 UNLESS (py_string = PyString_FromStringAndSize(s, l))
2835 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Guido van Rossum053b8df1998-11-25 16:18:00 +00002837 PDATA_PUSH(self->stack, py_string, -1);
2838 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839}
2840
2841
2842static int
2843load_short_binstring(Unpicklerobject *self) {
2844 PyObject *py_string = 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002845 unsigned char l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846 char *s;
2847
2848 if ((*self->read_func)(self, &s, 1) < 0)
2849 return -1;
2850
2851 l = (unsigned char)s[0];
2852
Guido van Rossum053b8df1998-11-25 16:18:00 +00002853 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
Guido van Rossum053b8df1998-11-25 16:18:00 +00002855 UNLESS (py_string = PyString_FromStringAndSize(s, l)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Guido van Rossum053b8df1998-11-25 16:18:00 +00002857 PDATA_PUSH(self->stack, py_string, -1);
2858 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002859}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
2861
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002862#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863static int
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002864load_unicode(Unpicklerobject *self) {
2865 PyObject *str = 0;
2866 int len, res = -1;
2867 char *s;
2868
2869 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00002870 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002871
2872 UNLESS (str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))
2873 goto finally;
2874
2875 PDATA_PUSH(self->stack, str, -1);
2876 return 0;
2877
2878finally:
2879 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002880}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002881#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002882
2883
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002884#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002885static int
2886load_binunicode(Unpicklerobject *self) {
2887 PyObject *unicode;
2888 long l;
2889 char *s;
2890
2891 if ((*self->read_func)(self, &s, 4) < 0) return -1;
2892
2893 l = calc_binint(s, 4);
2894
2895 if ((*self->read_func)(self, &s, l) < 0)
2896 return -1;
2897
2898 UNLESS (unicode = PyUnicode_DecodeUTF8(s, l, NULL))
2899 return -1;
2900
2901 PDATA_PUSH(self->stack, unicode, -1);
2902 return 0;
2903}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002904#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002905
2906
2907static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002908load_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002909 PyObject *tup;
2910 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002911
Guido van Rossum053b8df1998-11-25 16:18:00 +00002912 if ((i = marker(self)) < 0) return -1;
2913 UNLESS (tup=Pdata_popTuple(self->stack, i)) return -1;
2914 PDATA_PUSH(self->stack, tup, -1);
2915 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916}
2917
2918static int
2919load_empty_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002920 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002921
Guido van Rossum053b8df1998-11-25 16:18:00 +00002922 UNLESS (tup=PyTuple_New(0)) return -1;
2923 PDATA_PUSH(self->stack, tup, -1);
2924 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925}
2926
2927static int
2928load_empty_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002929 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002930
Guido van Rossum053b8df1998-11-25 16:18:00 +00002931 UNLESS (list=PyList_New(0)) return -1;
2932 PDATA_PUSH(self->stack, list, -1);
2933 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002934}
2935
2936static int
2937load_empty_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002938 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Guido van Rossum053b8df1998-11-25 16:18:00 +00002940 UNLESS (dict=PyDict_New()) return -1;
2941 PDATA_PUSH(self->stack, dict, -1);
2942 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943}
2944
2945
2946static int
2947load_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002948 PyObject *list = 0;
2949 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Guido van Rossum053b8df1998-11-25 16:18:00 +00002951 if ((i = marker(self)) < 0) return -1;
2952 UNLESS (list=Pdata_popList(self->stack, i)) return -1;
2953 PDATA_PUSH(self->stack, list, -1);
2954 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955}
2956
2957static int
2958load_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002959 PyObject *dict, *key, *value;
2960 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002961
Guido van Rossum053b8df1998-11-25 16:18:00 +00002962 if ((i = marker(self)) < 0) return -1;
2963 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002964
Guido van Rossum053b8df1998-11-25 16:18:00 +00002965 UNLESS (dict = PyDict_New()) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002966
Guido van Rossum053b8df1998-11-25 16:18:00 +00002967 for (k = i+1; k < j; k += 2) {
2968 key =self->stack->data[k-1];
2969 value=self->stack->data[k ];
2970 if (PyDict_SetItem(dict, key, value) < 0) {
2971 Py_DECREF(dict);
2972 return -1;
2973 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002975 Pdata_clear(self->stack, i);
2976 PDATA_PUSH(self->stack, dict, -1);
2977 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978}
2979
2980static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002981Instance_New(PyObject *cls, PyObject *args) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002982 int has_key;
2983 PyObject *safe=0, *r=0;
2984
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002985 if (PyClass_Check(cls)) {
2986 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00002987
Jeremy Hylton03657cf2000-07-12 13:05:33 +00002988 if ((l=PyObject_Size(args)) < 0) goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002989 UNLESS (l) {
2990 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002991
Guido van Rossum053b8df1998-11-25 16:18:00 +00002992 UNLESS (__getinitargs__=PyObject_GetAttr(cls, __getinitargs___str)) {
2993 /* We have a class with no __getinitargs__, so bypass usual
2994 construction */
Fred Drake2c773552001-03-22 17:52:17 +00002995 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002996
Guido van Rossum053b8df1998-11-25 16:18:00 +00002997 PyErr_Clear();
Fred Drake2c773552001-03-22 17:52:17 +00002998 UNLESS (inst=PyInstance_NewRaw(cls, NULL))
Guido van Rossum053b8df1998-11-25 16:18:00 +00002999 goto err;
Fred Drake2c773552001-03-22 17:52:17 +00003000 return inst;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003001 }
3002 Py_DECREF(__getinitargs__);
3003 }
Tim Peters84e87f32001-03-17 04:50:51 +00003004
Guido van Rossum053b8df1998-11-25 16:18:00 +00003005 if ((r=PyInstance_New(cls, args, NULL))) return r;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003006 else goto err;
3007 }
Tim Peters84e87f32001-03-17 04:50:51 +00003008
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003009 /* Is safe_constructors always a dict? */
3010 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003011 if (!has_key)
Guido van Rossum053b8df1998-11-25 16:18:00 +00003012 if (!(safe = PyObject_GetAttr(cls, __safe_for_unpickling___str)) ||
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013 !PyObject_IsTrue(safe)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003014 cPickle_ErrFormat(UnpicklingError,
3015 "%s is not safe for unpickling", "O", cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016 Py_XDECREF(safe);
3017 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003018 }
3019
Guido van Rossum053b8df1998-11-25 16:18:00 +00003020 if (args==Py_None) {
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003021 /* Special case, call cls.__basicnew__() */
3022 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003023
Guido van Rossum053b8df1998-11-25 16:18:00 +00003024 UNLESS (basicnew=PyObject_GetAttr(cls, __basicnew___str)) return NULL;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003025 r=PyObject_CallObject(basicnew, NULL);
3026 Py_DECREF(basicnew);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003027 if (r) return r;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003028 }
3029
Guido van Rossum053b8df1998-11-25 16:18:00 +00003030 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003031
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032err:
3033 {
3034 PyObject *tp, *v, *tb;
3035
3036 PyErr_Fetch(&tp, &v, &tb);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003037 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3038 Py_XDECREF(v);
3039 v=r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040 }
3041 PyErr_Restore(tp,v,tb);
3042 }
3043 return NULL;
3044}
Tim Peters84e87f32001-03-17 04:50:51 +00003045
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
3047static int
3048load_obj(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003049 PyObject *class, *tup, *obj=0;
3050 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051
Guido van Rossum053b8df1998-11-25 16:18:00 +00003052 if ((i = marker(self)) < 0) return -1;
3053 UNLESS (tup=Pdata_popTuple(self->stack, i+1)) return -1;
3054 PDATA_POP(self->stack, class);
3055 if (class) {
3056 obj = Instance_New(class, tup);
3057 Py_DECREF(class);
3058 }
3059 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Guido van Rossum053b8df1998-11-25 16:18:00 +00003061 if (! obj) return -1;
3062 PDATA_PUSH(self->stack, obj, -1);
3063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064}
3065
3066
3067static int
3068load_inst(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003069 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003070 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071 char *s;
3072
Guido van Rossum053b8df1998-11-25 16:18:00 +00003073 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003074
Guido van Rossum053b8df1998-11-25 16:18:00 +00003075 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003076 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003077 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003078
Guido van Rossum053b8df1998-11-25 16:18:00 +00003079 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003080 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003081 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003082 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003083 Py_DECREF(class_name);
3084 }
3085 }
3086 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003087
Guido van Rossum053b8df1998-11-25 16:18:00 +00003088 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003089
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003090 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003091 obj = Instance_New(class, tup);
3092 Py_DECREF(tup);
3093 }
3094 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003095
Guido van Rossum053b8df1998-11-25 16:18:00 +00003096 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003097
Guido van Rossum053b8df1998-11-25 16:18:00 +00003098 PDATA_PUSH(self->stack, obj, -1);
3099 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100}
3101
3102
3103static int
3104load_global(Unpicklerobject *self) {
3105 PyObject *class = 0, *module_name = 0, *class_name = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003106 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107 char *s;
3108
Guido van Rossum053b8df1998-11-25 16:18:00 +00003109 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003110 if (len < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003111 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Guido van Rossum053b8df1998-11-25 16:18:00 +00003113 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003114 if (len < 2) return bad_readline();
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003115 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003116 class = find_class(module_name, class_name, self->find_class);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003117 Py_DECREF(class_name);
3118 }
3119 }
3120 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121
Guido van Rossum053b8df1998-11-25 16:18:00 +00003122 if (! class) return -1;
3123 PDATA_PUSH(self->stack, class, -1);
3124 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003125}
3126
3127
3128static int
3129load_persid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003130 PyObject *pid = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003131 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003132 char *s;
3133
3134 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003135 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003136 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003137
Guido van Rossum053b8df1998-11-25 16:18:00 +00003138 UNLESS (pid = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139
Guido van Rossum053b8df1998-11-25 16:18:00 +00003140 if (PyList_Check(self->pers_func)) {
3141 if (PyList_Append(self->pers_func, pid) < 0) {
3142 Py_DECREF(pid);
3143 return -1;
3144 }
3145 }
3146 else {
3147 ARG_TUP(self, pid);
3148 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003149 pid = PyObject_Call(self->pers_func, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003150 FREE_ARG_TUP(self);
3151 }
3152 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Guido van Rossum053b8df1998-11-25 16:18:00 +00003154 if (! pid) return -1;
3155
3156 PDATA_PUSH(self->stack, pid, -1);
3157 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003158 }
3159 else {
3160 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003161 "A load persistent id instruction was encountered,\n"
3162 "but no persistent_load function was specified.");
3163 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165}
3166
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167static int
3168load_binpersid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003169 PyObject *pid = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003170
3171 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003172 PDATA_POP(self->stack, pid);
3173 if (! pid) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Guido van Rossum053b8df1998-11-25 16:18:00 +00003175 if (PyList_Check(self->pers_func)) {
3176 if (PyList_Append(self->pers_func, pid) < 0) {
3177 Py_DECREF(pid);
3178 return -1;
3179 }
3180 }
3181 else {
3182 ARG_TUP(self, pid);
3183 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003184 pid = PyObject_Call(self->pers_func, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003185 FREE_ARG_TUP(self);
3186 }
3187 if (! pid) return -1;
3188 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
Guido van Rossum053b8df1998-11-25 16:18:00 +00003190 PDATA_PUSH(self->stack, pid, -1);
3191 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003193 else {
3194 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003195 "A load persistent id instruction was encountered,\n"
3196 "but no persistent_load function was specified.");
3197 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003198 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199}
3200
3201
3202static int
3203load_pop(Unpicklerobject *self) {
3204 int len;
3205
Guido van Rossum053b8df1998-11-25 16:18:00 +00003206 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207
Tim Peters84e87f32001-03-17 04:50:51 +00003208 /* Note that we split the (pickle.py) stack into two stacks,
Guido van Rossumea2b7152000-05-09 18:14:50 +00003209 an object stack and a mark stack. We have to be clever and
3210 pop the right one. We do this by looking at the top of the
3211 mark stack.
3212 */
3213
Tim Peters84e87f32001-03-17 04:50:51 +00003214 if ((self->num_marks > 0) &&
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215 (self->marks[self->num_marks - 1] == len))
3216 self->num_marks--;
Tim Peters84e87f32001-03-17 04:50:51 +00003217 else {
Guido van Rossumea2b7152000-05-09 18:14:50 +00003218 len--;
3219 Py_DECREF(self->stack->data[len]);
3220 self->stack->length=len;
3221 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
3223 return 0;
3224}
3225
3226
3227static int
3228load_pop_mark(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003229 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003230
3231 if ((i = marker(self)) < 0)
3232 return -1;
3233
Guido van Rossum053b8df1998-11-25 16:18:00 +00003234 Pdata_clear(self->stack, i);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235
3236 return 0;
3237}
3238
3239
3240static int
3241load_dup(Unpicklerobject *self) {
3242 PyObject *last;
3243 int len;
3244
Guido van Rossum053b8df1998-11-25 16:18:00 +00003245 if ((len = self->stack->length) <= 0) return stackUnderflow();
3246 last=self->stack->data[len-1];
3247 Py_INCREF(last);
3248 PDATA_PUSH(self->stack, last, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003249 return 0;
3250}
3251
3252
3253static int
3254load_get(Unpicklerobject *self) {
3255 PyObject *py_str = 0, *value = 0;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003256 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003258 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003259
Guido van Rossum053b8df1998-11-25 16:18:00 +00003260 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003261 if (len < 2) return bad_readline();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262
Guido van Rossum053b8df1998-11-25 16:18:00 +00003263 UNLESS (py_str = PyString_FromStringAndSize(s, len - 1)) return -1;
3264
3265 value = PyDict_GetItem(self->memo, py_str);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003266 if (! value) {
3267 PyErr_SetObject(BadPickleGet, py_str);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003268 rc = -1;
3269 } else {
3270 PDATA_APPEND(self->stack, value, -1);
3271 rc = 0;
3272 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Guido van Rossum2f80d961999-07-13 15:18:58 +00003274 Py_DECREF(py_str);
3275 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003276}
3277
3278
3279static int
3280load_binget(Unpicklerobject *self) {
3281 PyObject *py_key = 0, *value = 0;
3282 unsigned char key;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283 char *s;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003284 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285
Guido van Rossum053b8df1998-11-25 16:18:00 +00003286 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
3288 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003289 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003290
Guido van Rossum053b8df1998-11-25 16:18:00 +00003291 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003292 if (! value) {
3293 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003294 rc = -1;
3295 } else {
3296 PDATA_APPEND(self->stack, value, -1);
3297 rc = 0;
3298 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
Guido van Rossum2f80d961999-07-13 15:18:58 +00003300 Py_DECREF(py_key);
3301 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003302}
3303
3304
3305static int
3306load_long_binget(Unpicklerobject *self) {
3307 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003308 unsigned char c;
3309 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003310 long key;
Guido van Rossum2f80d961999-07-13 15:18:58 +00003311 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003312
Guido van Rossum053b8df1998-11-25 16:18:00 +00003313 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314
3315 c = (unsigned char)s[0];
3316 key = (long)c;
3317 c = (unsigned char)s[1];
3318 key |= (long)c << 8;
3319 c = (unsigned char)s[2];
3320 key |= (long)c << 16;
3321 c = (unsigned char)s[3];
3322 key |= (long)c << 24;
3323
Guido van Rossum053b8df1998-11-25 16:18:00 +00003324 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003325
Guido van Rossum053b8df1998-11-25 16:18:00 +00003326 value = PyDict_GetItem(self->memo, py_key);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003327 if (! value) {
3328 PyErr_SetObject(BadPickleGet, py_key);
Guido van Rossum2f80d961999-07-13 15:18:58 +00003329 rc = -1;
3330 } else {
3331 PDATA_APPEND(self->stack, value, -1);
3332 rc = 0;
3333 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334
Guido van Rossum2f80d961999-07-13 15:18:58 +00003335 Py_DECREF(py_key);
3336 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003337}
3338
3339
3340static int
3341load_put(Unpicklerobject *self) {
3342 PyObject *py_str = 0, *value = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003343 int len, l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003344 char *s;
3345
Guido van Rossum053b8df1998-11-25 16:18:00 +00003346 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumd1f66dc1999-02-08 22:38:25 +00003347 if (l < 2) return bad_readline();
Guido van Rossum053b8df1998-11-25 16:18:00 +00003348 UNLESS (len=self->stack->length) return stackUnderflow();
3349 UNLESS (py_str = PyString_FromStringAndSize(s, l - 1)) return -1;
3350 value=self->stack->data[len-1];
3351 l=PyDict_SetItem(self->memo, py_str, value);
3352 Py_DECREF(py_str);
3353 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354}
3355
3356
3357static int
3358load_binput(Unpicklerobject *self) {
3359 PyObject *py_key = 0, *value = 0;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003360 unsigned char key;
3361 char *s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003362 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003363
Guido van Rossum053b8df1998-11-25 16:18:00 +00003364 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3365 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003366
3367 key = (unsigned char)s[0];
3368
Guido van Rossum053b8df1998-11-25 16:18:00 +00003369 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3370 value=self->stack->data[len-1];
3371 len=PyDict_SetItem(self->memo, py_key, value);
3372 Py_DECREF(py_key);
3373 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374}
3375
3376
3377static int
3378load_long_binput(Unpicklerobject *self) {
3379 PyObject *py_key = 0, *value = 0;
3380 long key;
Thomas Wouters3b6448f2000-07-22 23:56:07 +00003381 unsigned char c;
3382 char *s;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003383 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003384
Guido van Rossum053b8df1998-11-25 16:18:00 +00003385 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3386 UNLESS (len=self->stack->length) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003387
3388 c = (unsigned char)s[0];
3389 key = (long)c;
3390 c = (unsigned char)s[1];
3391 key |= (long)c << 8;
3392 c = (unsigned char)s[2];
3393 key |= (long)c << 16;
3394 c = (unsigned char)s[3];
3395 key |= (long)c << 24;
3396
Guido van Rossum053b8df1998-11-25 16:18:00 +00003397 UNLESS (py_key = PyInt_FromLong(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
Tim Peters84e87f32001-03-17 04:50:51 +00003405static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406do_append(Unpicklerobject *self, int x) {
3407 PyObject *value = 0, *list = 0, *append_method = 0;
3408 int len, i;
3409
Guido van Rossum053b8df1998-11-25 16:18:00 +00003410 UNLESS ((len=self->stack->length) >= x && x > 0) return stackUnderflow();
3411 if (len==x) return 0; /* nothing to do */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412
Guido van Rossum053b8df1998-11-25 16:18:00 +00003413 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414
3415 if (PyList_Check(list)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003416 PyObject *slice;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003417 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003418
Guido van Rossum053b8df1998-11-25 16:18:00 +00003419 slice=Pdata_popList(self->stack, x);
3420 list_len = PyList_GET_SIZE(list);
3421 i=PyList_SetSlice(list, list_len, list_len, slice);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422 Py_DECREF(slice);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003423 return i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003424 }
3425 else {
3426
Guido van Rossum053b8df1998-11-25 16:18:00 +00003427 UNLESS (append_method = PyObject_GetAttr(list, append_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003429
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430 for (i = x; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003431 PyObject *junk;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Guido van Rossum053b8df1998-11-25 16:18:00 +00003433 value=self->stack->data[i];
3434 junk=0;
3435 ARG_TUP(self, value);
3436 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003437 junk = PyObject_Call(append_method, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003438 FREE_ARG_TUP(self);
3439 }
3440 if (! junk) {
3441 Pdata_clear(self->stack, i+1);
3442 self->stack->length=x;
3443 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003445 }
3446 Py_DECREF(junk);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003447 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003448 self->stack->length=x;
3449 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450 }
3451
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453}
3454
Tim Peters84e87f32001-03-17 04:50:51 +00003455
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456static int
3457load_append(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003458 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459}
3460
3461
3462static int
3463load_appends(Unpicklerobject *self) {
3464 return do_append(self, marker(self));
3465}
3466
3467
3468static int
3469do_setitems(Unpicklerobject *self, int x) {
3470 PyObject *value = 0, *key = 0, *dict = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003471 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472
Guido van Rossum053b8df1998-11-25 16:18:00 +00003473 UNLESS ((len=self->stack->length) >= x
3474 && x > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475
Guido van Rossum053b8df1998-11-25 16:18:00 +00003476 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477
Guido van Rossum053b8df1998-11-25 16:18:00 +00003478 for (i = x+1; i < len; i += 2) {
3479 key =self->stack->data[i-1];
3480 value=self->stack->data[i ];
3481 if (PyObject_SetItem(dict, key, value) < 0) {
3482 r=-1;
3483 break;
3484 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485 }
3486
Guido van Rossum053b8df1998-11-25 16:18:00 +00003487 Pdata_clear(self->stack, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488
Guido van Rossum053b8df1998-11-25 16:18:00 +00003489 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003490}
3491
3492
3493static int
3494load_setitem(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003495 return do_setitems(self, self->stack->length - 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496}
3497
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498static int
3499load_setitems(Unpicklerobject *self) {
3500 return do_setitems(self, marker(self));
3501}
3502
3503
3504static int
3505load_build(Unpicklerobject *self) {
Tim Peters84e87f32001-03-17 04:50:51 +00003506 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507 *junk = 0, *__setstate__ = 0;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003508 int i, r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Guido van Rossum053b8df1998-11-25 16:18:00 +00003510 if (self->stack->length < 2) return stackUnderflow();
3511 PDATA_POP(self->stack, value);
3512 if (! value) return -1;
3513 inst=self->stack->data[self->stack->length-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514
Guido van Rossum053b8df1998-11-25 16:18:00 +00003515 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3516 ARG_TUP(self, value);
3517 if (self->arg) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003518 junk = PyObject_Call(__setstate__, self->arg, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003519 FREE_ARG_TUP(self);
3520 }
3521 Py_DECREF(__setstate__);
3522 if (! junk) return -1;
3523 Py_DECREF(junk);
3524 return 0;
3525 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003526
Guido van Rossum053b8df1998-11-25 16:18:00 +00003527 PyErr_Clear();
3528 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003529 i = 0;
3530 while (PyDict_Next(value, &i, &d_key, &d_value)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003531 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3532 r=-1;
3533 break;
3534 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003536 Py_DECREF(instdict);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003538 else r=-1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539
Guido van Rossum053b8df1998-11-25 16:18:00 +00003540 Py_XDECREF(value);
Tim Peters84e87f32001-03-17 04:50:51 +00003541
Guido van Rossum053b8df1998-11-25 16:18:00 +00003542 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543}
3544
3545
3546static int
3547load_mark(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003548 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003549
Guido van Rossumea2b7152000-05-09 18:14:50 +00003550 /* Note that we split the (pickle.py) stack into two stacks, an
3551 object stack and a mark stack. Here we push a mark onto the
Tim Peters84e87f32001-03-17 04:50:51 +00003552 mark stack.
Guido van Rossumea2b7152000-05-09 18:14:50 +00003553 */
3554
Guido van Rossum053b8df1998-11-25 16:18:00 +00003555 if ((self->num_marks + 1) >= self->marks_size) {
3556 s=self->marks_size+20;
3557 if (s <= self->num_marks) s=self->num_marks + 1;
Guido van Rossum761fcd01999-04-12 22:51:20 +00003558 if (self->marks == NULL)
Guido van Rossumaa8d1671999-01-25 21:43:51 +00003559 self->marks=(int *)malloc(s * sizeof(int));
3560 else
3561 self->marks=(int *)realloc(self->marks, s * sizeof(int));
Guido van Rossum053b8df1998-11-25 16:18:00 +00003562 if (! self->marks) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563 PyErr_NoMemory();
3564 return -1;
3565 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003566 self->marks_size = s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567 }
3568
Guido van Rossum053b8df1998-11-25 16:18:00 +00003569 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570
3571 return 0;
3572}
3573
3574static int
3575load_reduce(Unpicklerobject *self) {
3576 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Guido van Rossum053b8df1998-11-25 16:18:00 +00003578 PDATA_POP(self->stack, arg_tup);
3579 if (! arg_tup) return -1;
3580 PDATA_POP(self->stack, callable);
3581 if (callable) {
3582 ob = Instance_New(callable, arg_tup);
3583 Py_DECREF(callable);
3584 }
3585 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586
Guido van Rossum053b8df1998-11-25 16:18:00 +00003587 if (! ob) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003588
Guido van Rossum053b8df1998-11-25 16:18:00 +00003589 PDATA_PUSH(self->stack, ob, -1);
3590 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591}
Tim Peters84e87f32001-03-17 04:50:51 +00003592
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003594load(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003595 PyObject *err = 0, *val = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596 char *s;
3597
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003599 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003600
3601 while (1) {
3602 if ((*self->read_func)(self, &s, 1) < 0)
3603 break;
3604
3605 switch (s[0]) {
3606 case NONE:
3607 if (load_none(self) < 0)
3608 break;
3609 continue;
3610
3611 case BININT:
3612 if (load_binint(self) < 0)
3613 break;
3614 continue;
3615
3616 case BININT1:
3617 if (load_binint1(self) < 0)
3618 break;
3619 continue;
3620
3621 case BININT2:
3622 if (load_binint2(self) < 0)
3623 break;
3624 continue;
3625
3626 case INT:
3627 if (load_int(self) < 0)
3628 break;
3629 continue;
3630
3631 case LONG:
3632 if (load_long(self) < 0)
3633 break;
3634 continue;
3635
3636 case FLOAT:
3637 if (load_float(self) < 0)
3638 break;
3639 continue;
3640
Guido van Rossum60456fd1997-04-09 17:36:32 +00003641 case BINFLOAT:
3642 if (load_binfloat(self) < 0)
3643 break;
3644 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003645
3646 case BINSTRING:
3647 if (load_binstring(self) < 0)
3648 break;
3649 continue;
3650
3651 case SHORT_BINSTRING:
3652 if (load_short_binstring(self) < 0)
3653 break;
3654 continue;
3655
3656 case STRING:
3657 if (load_string(self) < 0)
3658 break;
3659 continue;
3660
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003661#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003662 case UNICODE:
3663 if (load_unicode(self) < 0)
3664 break;
3665 continue;
3666
3667 case BINUNICODE:
3668 if (load_binunicode(self) < 0)
3669 break;
3670 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003671#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003672
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673 case EMPTY_TUPLE:
3674 if (load_empty_tuple(self) < 0)
3675 break;
3676 continue;
3677
3678 case TUPLE:
3679 if (load_tuple(self) < 0)
3680 break;
3681 continue;
3682
3683 case EMPTY_LIST:
3684 if (load_empty_list(self) < 0)
3685 break;
3686 continue;
3687
3688 case LIST:
3689 if (load_list(self) < 0)
3690 break;
3691 continue;
3692
3693 case EMPTY_DICT:
3694 if (load_empty_dict(self) < 0)
3695 break;
3696 continue;
3697
3698 case DICT:
3699 if (load_dict(self) < 0)
3700 break;
3701 continue;
3702
3703 case OBJ:
3704 if (load_obj(self) < 0)
3705 break;
3706 continue;
3707
3708 case INST:
3709 if (load_inst(self) < 0)
3710 break;
3711 continue;
3712
3713 case GLOBAL:
3714 if (load_global(self) < 0)
3715 break;
3716 continue;
3717
3718 case APPEND:
3719 if (load_append(self) < 0)
3720 break;
3721 continue;
3722
3723 case APPENDS:
3724 if (load_appends(self) < 0)
3725 break;
3726 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003727
Guido van Rossum60456fd1997-04-09 17:36:32 +00003728 case BUILD:
3729 if (load_build(self) < 0)
3730 break;
3731 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003732
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733 case DUP:
3734 if (load_dup(self) < 0)
3735 break;
3736 continue;
3737
3738 case BINGET:
3739 if (load_binget(self) < 0)
3740 break;
3741 continue;
3742
3743 case LONG_BINGET:
3744 if (load_long_binget(self) < 0)
3745 break;
3746 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003747
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748 case GET:
3749 if (load_get(self) < 0)
3750 break;
3751 continue;
3752
3753 case MARK:
3754 if (load_mark(self) < 0)
3755 break;
3756 continue;
3757
3758 case BINPUT:
3759 if (load_binput(self) < 0)
3760 break;
3761 continue;
3762
3763 case LONG_BINPUT:
3764 if (load_long_binput(self) < 0)
3765 break;
3766 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003767
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768 case PUT:
3769 if (load_put(self) < 0)
3770 break;
3771 continue;
3772
3773 case POP:
3774 if (load_pop(self) < 0)
3775 break;
3776 continue;
3777
3778 case POP_MARK:
3779 if (load_pop_mark(self) < 0)
3780 break;
3781 continue;
3782
3783 case SETITEM:
3784 if (load_setitem(self) < 0)
3785 break;
3786 continue;
3787
3788 case SETITEMS:
3789 if (load_setitems(self) < 0)
3790 break;
3791 continue;
3792
3793 case STOP:
3794 break;
3795
3796 case PERSID:
3797 if (load_persid(self) < 0)
3798 break;
3799 continue;
3800
3801 case BINPERSID:
3802 if (load_binpersid(self) < 0)
3803 break;
3804 continue;
3805
3806 case REDUCE:
3807 if (load_reduce(self) < 0)
3808 break;
3809 continue;
3810
Tim Peters84e87f32001-03-17 04:50:51 +00003811 default:
3812 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003813 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003814 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815 }
3816
3817 break;
3818 }
3819
Guido van Rossum053b8df1998-11-25 16:18:00 +00003820 if ((err = PyErr_Occurred())) {
3821 if (err == PyExc_EOFError) {
3822 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00003823 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003824 return NULL;
3825 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003826
Tim Peters84e87f32001-03-17 04:50:51 +00003827 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829}
Tim Peters84e87f32001-03-17 04:50:51 +00003830
Guido van Rossum60456fd1997-04-09 17:36:32 +00003831
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003832/* No-load functions to support noload, which is used to
3833 find persistent references. */
3834
3835static int
3836noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003837 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003838
3839 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003840 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003841}
3842
3843
3844static int
3845noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003846 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003847 char *s;
3848
3849 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003850 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003851 if ((*self->readline_func)(self, &s) < 0) return -1;
3852 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003853 PDATA_APPEND(self->stack, Py_None,-1);
3854 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003855}
3856
3857static int
3858noload_global(Unpicklerobject *self) {
3859 char *s;
3860
3861 if ((*self->readline_func)(self, &s) < 0) return -1;
3862 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003863 PDATA_APPEND(self->stack, Py_None,-1);
3864 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003865}
3866
3867static int
3868noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003869
Guido van Rossum053b8df1998-11-25 16:18:00 +00003870 if (self->stack->length < 2) return stackUnderflow();
3871 Pdata_clear(self->stack, self->stack->length-2);
3872 PDATA_APPEND(self->stack, Py_None,-1);
3873 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003874}
3875
3876static int
3877noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003878
Guido van Rossum053b8df1998-11-25 16:18:00 +00003879 if (self->stack->length < 1) return stackUnderflow();
3880 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003881 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003882}
3883
3884
3885static PyObject *
3886noload(Unpicklerobject *self) {
Guido van Rossumc3be1a31999-06-15 14:36:59 +00003887 PyObject *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003888 char *s;
3889
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003890 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003891 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003892
3893 while (1) {
3894 if ((*self->read_func)(self, &s, 1) < 0)
3895 break;
3896
3897 switch (s[0]) {
3898 case NONE:
3899 if (load_none(self) < 0)
3900 break;
3901 continue;
3902
3903 case BININT:
3904 if (load_binint(self) < 0)
3905 break;
3906 continue;
3907
3908 case BININT1:
3909 if (load_binint1(self) < 0)
3910 break;
3911 continue;
3912
3913 case BININT2:
3914 if (load_binint2(self) < 0)
3915 break;
3916 continue;
3917
3918 case INT:
3919 if (load_int(self) < 0)
3920 break;
3921 continue;
3922
3923 case LONG:
3924 if (load_long(self) < 0)
3925 break;
3926 continue;
3927
3928 case FLOAT:
3929 if (load_float(self) < 0)
3930 break;
3931 continue;
3932
3933 case BINFLOAT:
3934 if (load_binfloat(self) < 0)
3935 break;
3936 continue;
3937
3938 case BINSTRING:
3939 if (load_binstring(self) < 0)
3940 break;
3941 continue;
3942
3943 case SHORT_BINSTRING:
3944 if (load_short_binstring(self) < 0)
3945 break;
3946 continue;
3947
3948 case STRING:
3949 if (load_string(self) < 0)
3950 break;
3951 continue;
3952
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003953#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003954 case UNICODE:
3955 if (load_unicode(self) < 0)
3956 break;
3957 continue;
3958
3959 case BINUNICODE:
3960 if (load_binunicode(self) < 0)
3961 break;
3962 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003963#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003964
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003965 case EMPTY_TUPLE:
3966 if (load_empty_tuple(self) < 0)
3967 break;
3968 continue;
3969
3970 case TUPLE:
3971 if (load_tuple(self) < 0)
3972 break;
3973 continue;
3974
3975 case EMPTY_LIST:
3976 if (load_empty_list(self) < 0)
3977 break;
3978 continue;
3979
3980 case LIST:
3981 if (load_list(self) < 0)
3982 break;
3983 continue;
3984
3985 case EMPTY_DICT:
3986 if (load_empty_dict(self) < 0)
3987 break;
3988 continue;
3989
3990 case DICT:
3991 if (load_dict(self) < 0)
3992 break;
3993 continue;
3994
3995 case OBJ:
3996 if (noload_obj(self) < 0)
3997 break;
3998 continue;
3999
4000 case INST:
4001 if (noload_inst(self) < 0)
4002 break;
4003 continue;
4004
4005 case GLOBAL:
4006 if (noload_global(self) < 0)
4007 break;
4008 continue;
4009
4010 case APPEND:
4011 if (load_append(self) < 0)
4012 break;
4013 continue;
4014
4015 case APPENDS:
4016 if (load_appends(self) < 0)
4017 break;
4018 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004019
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004020 case BUILD:
4021 if (noload_build(self) < 0)
4022 break;
4023 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004024
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004025 case DUP:
4026 if (load_dup(self) < 0)
4027 break;
4028 continue;
4029
4030 case BINGET:
4031 if (load_binget(self) < 0)
4032 break;
4033 continue;
4034
4035 case LONG_BINGET:
4036 if (load_long_binget(self) < 0)
4037 break;
4038 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004039
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004040 case GET:
4041 if (load_get(self) < 0)
4042 break;
4043 continue;
4044
4045 case MARK:
4046 if (load_mark(self) < 0)
4047 break;
4048 continue;
4049
4050 case BINPUT:
4051 if (load_binput(self) < 0)
4052 break;
4053 continue;
4054
4055 case LONG_BINPUT:
4056 if (load_long_binput(self) < 0)
4057 break;
4058 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004059
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004060 case PUT:
4061 if (load_put(self) < 0)
4062 break;
4063 continue;
4064
4065 case POP:
4066 if (load_pop(self) < 0)
4067 break;
4068 continue;
4069
4070 case POP_MARK:
4071 if (load_pop_mark(self) < 0)
4072 break;
4073 continue;
4074
4075 case SETITEM:
4076 if (load_setitem(self) < 0)
4077 break;
4078 continue;
4079
4080 case SETITEMS:
4081 if (load_setitems(self) < 0)
4082 break;
4083 continue;
4084
4085 case STOP:
4086 break;
4087
4088 case PERSID:
4089 if (load_persid(self) < 0)
4090 break;
4091 continue;
4092
4093 case BINPERSID:
4094 if (load_binpersid(self) < 0)
4095 break;
4096 continue;
4097
4098 case REDUCE:
4099 if (noload_reduce(self) < 0)
4100 break;
4101 continue;
4102
Tim Peters84e87f32001-03-17 04:50:51 +00004103 default:
4104 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004105 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004106 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004107 }
4108
4109 break;
4110 }
4111
Guido van Rossum053b8df1998-11-25 16:18:00 +00004112 if ((err = PyErr_Occurred())) {
4113 if (err == PyExc_EOFError) {
4114 PyErr_SetNone(PyExc_EOFError);
Tim Peters84e87f32001-03-17 04:50:51 +00004115 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00004116 return NULL;
4117 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004118
Tim Peters84e87f32001-03-17 04:50:51 +00004119 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004120 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004121}
Tim Peters84e87f32001-03-17 04:50:51 +00004122
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004123
Guido van Rossum60456fd1997-04-09 17:36:32 +00004124static PyObject *
4125Unpickler_load(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004126 UNLESS (PyArg_ParseTuple(args, ":load"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004127 return NULL;
4128
4129 return load(self);
4130}
4131
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004132static PyObject *
4133Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Tim Peters84e87f32001-03-17 04:50:51 +00004134 UNLESS (PyArg_ParseTuple(args, ":noload"))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004135 return NULL;
4136
4137 return noload(self);
4138}
4139
Guido van Rossum60456fd1997-04-09 17:36:32 +00004140
4141static struct PyMethodDef Unpickler_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004142 {"load", (PyCFunction)Unpickler_load, 1,
4143 "load() -- Load a pickle"
4144 },
4145 {"noload", (PyCFunction)Unpickler_noload, 1,
4146 "noload() -- not load a pickle, but go through most of the motions\n"
4147 "\n"
4148 "This function can be used to read past a pickle without instantiating\n"
4149 "any objects or importing any modules. It can also be used to find all\n"
4150 "persistent references without instantiating any objects or importing\n"
4151 "any modules.\n"
4152 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004153 {NULL, NULL} /* sentinel */
4154};
4155
4156
4157static Unpicklerobject *
4158newUnpicklerobject(PyObject *f) {
4159 Unpicklerobject *self;
4160
Guido van Rossumb18618d2000-05-03 23:44:39 +00004161 UNLESS (self = PyObject_New(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004162 return NULL;
4163
4164 self->file = NULL;
4165 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004166 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167 self->pers_func = NULL;
4168 self->last_string = NULL;
4169 self->marks = NULL;
4170 self->num_marks = 0;
4171 self->marks_size = 0;
4172 self->buf_size = 0;
4173 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00004174 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00004175 self->safe_constructors = NULL;
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004176 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004177
Tim Peters84e87f32001-03-17 04:50:51 +00004178 UNLESS (self->memo = PyDict_New())
Guido van Rossum83addc72000-04-21 20:49:36 +00004179 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180
4181 Py_INCREF(f);
4182 self->file = f;
4183
4184 /* Set read, readline based on type of f */
4185 if (PyFile_Check(f)) {
4186 self->fp = PyFile_AsFile(f);
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004187 if (self->fp == NULL) {
Guido van Rossum83addc72000-04-21 20:49:36 +00004188 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
4189 goto err;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004190 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191 self->read_func = read_file;
4192 self->readline_func = readline_file;
4193 }
4194 else if (PycStringIO_InputCheck(f)) {
4195 self->fp = NULL;
4196 self->read_func = read_cStringIO;
4197 self->readline_func = readline_cStringIO;
4198 }
4199 else {
4200
4201 self->fp = NULL;
4202 self->read_func = read_other;
4203 self->readline_func = readline_other;
4204
Guido van Rossum053b8df1998-11-25 16:18:00 +00004205 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004206 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004207 PyErr_Clear();
4208 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
4209 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00004210 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004211 }
4212 }
4213
Guido van Rossum053b8df1998-11-25 16:18:00 +00004214 if (PyEval_GetRestricted()) {
4215 /* Restricted execution, get private tables */
4216 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004217
Guido van Rossum053b8df1998-11-25 16:18:00 +00004218 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
4219 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
4220 Py_DECREF(m);
4221 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004222 }
4223 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004224 self->safe_constructors=safe_constructors;
4225 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004226 }
4227
Guido van Rossum60456fd1997-04-09 17:36:32 +00004228 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004229
4230err:
4231 Py_DECREF((PyObject *)self);
4232 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004233}
4234
4235
4236static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004237get_Unpickler(PyObject *self, PyObject *args) {
4238 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004239
Guido van Rossum43713e52000-02-29 13:59:29 +00004240 UNLESS (PyArg_ParseTuple(args, "O:Unpickler", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004241 return NULL;
4242 return (PyObject *)newUnpicklerobject(file);
4243}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004244
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004245
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246static void
4247Unpickler_dealloc(Unpicklerobject *self) {
4248 Py_XDECREF(self->readline);
4249 Py_XDECREF(self->read);
4250 Py_XDECREF(self->file);
4251 Py_XDECREF(self->memo);
4252 Py_XDECREF(self->stack);
4253 Py_XDECREF(self->pers_func);
4254 Py_XDECREF(self->arg);
4255 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004256 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004257
Guido van Rossum60456fd1997-04-09 17:36:32 +00004258 if (self->marks) {
4259 free(self->marks);
4260 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004261
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262 if (self->buf_size) {
4263 free(self->buf);
4264 }
Tim Peters84e87f32001-03-17 04:50:51 +00004265
Guido van Rossumb18618d2000-05-03 23:44:39 +00004266 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004267}
4268
4269
4270static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271Unpickler_getattr(Unpicklerobject *self, char *name) {
4272 if (!strcmp(name, "persistent_load")) {
4273 if (!self->pers_func) {
4274 PyErr_SetString(PyExc_AttributeError, name);
4275 return NULL;
4276 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004277
Guido van Rossum60456fd1997-04-09 17:36:32 +00004278 Py_INCREF(self->pers_func);
4279 return self->pers_func;
4280 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004281
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004282 if (!strcmp(name, "find_global")) {
4283 if (!self->find_class) {
4284 PyErr_SetString(PyExc_AttributeError, name);
4285 return NULL;
4286 }
4287
4288 Py_INCREF(self->find_class);
4289 return self->find_class;
4290 }
4291
Guido van Rossum60456fd1997-04-09 17:36:32 +00004292 if (!strcmp(name, "memo")) {
4293 if (!self->memo) {
4294 PyErr_SetString(PyExc_AttributeError, name);
4295 return NULL;
4296 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004297
Guido van Rossum60456fd1997-04-09 17:36:32 +00004298 Py_INCREF(self->memo);
4299 return self->memo;
4300 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004301
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302 if (!strcmp(name, "UnpicklingError")) {
4303 Py_INCREF(UnpicklingError);
4304 return UnpicklingError;
4305 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004306
Guido van Rossum60456fd1997-04-09 17:36:32 +00004307 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
4308}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004309
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310
4311static int
4312Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004313
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004314 if (!strcmp(name, "persistent_load")) {
4315 Py_XDECREF(self->pers_func);
4316 self->pers_func = value;
4317 Py_XINCREF(value);
4318 return 0;
4319 }
4320
4321 if (!strcmp(name, "find_global")) {
4322 Py_XDECREF(self->find_class);
4323 self->find_class = value;
4324 Py_XINCREF(value);
4325 return 0;
4326 }
4327
Guido van Rossum053b8df1998-11-25 16:18:00 +00004328 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004329 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00004330 "attribute deletion is not supported");
4331 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004332 }
4333
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004334 if (strcmp(name, "memo") == 0) {
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004335 if (!PyDict_Check(value)) {
4336 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4337 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004338 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004339 Py_XDECREF(self->memo);
4340 self->memo = value;
4341 Py_INCREF(value);
4342 return 0;
4343 }
4344
Guido van Rossum60456fd1997-04-09 17:36:32 +00004345 PyErr_SetString(PyExc_AttributeError, name);
4346 return -1;
4347}
4348
4349
4350static PyObject *
4351cpm_dump(PyObject *self, PyObject *args) {
4352 PyObject *ob, *file, *res = NULL;
4353 Picklerobject *pickler = 0;
4354 int bin = 0;
4355
Guido van Rossum053b8df1998-11-25 16:18:00 +00004356 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004357 goto finally;
4358
Guido van Rossum053b8df1998-11-25 16:18:00 +00004359 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004360 goto finally;
4361
4362 if (dump(pickler, ob) < 0)
4363 goto finally;
4364
4365 Py_INCREF(Py_None);
4366 res = Py_None;
4367
4368finally:
4369 Py_XDECREF(pickler);
4370
4371 return res;
4372}
4373
4374
4375static PyObject *
4376cpm_dumps(PyObject *self, PyObject *args) {
4377 PyObject *ob, *file = 0, *res = NULL;
4378 Picklerobject *pickler = 0;
4379 int bin = 0;
4380
Guido van Rossum43713e52000-02-29 13:59:29 +00004381 UNLESS (PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004382 goto finally;
4383
Guido van Rossum053b8df1998-11-25 16:18:00 +00004384 UNLESS (file = PycStringIO->NewOutput(128))
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 res = PycStringIO->cgetvalue(file);
4394
4395finally:
4396 Py_XDECREF(pickler);
4397 Py_XDECREF(file);
4398
4399 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004400}
4401
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004402
4403static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404cpm_load(PyObject *self, PyObject *args) {
4405 Unpicklerobject *unpickler = 0;
4406 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004407
Guido van Rossum43713e52000-02-29 13:59:29 +00004408 UNLESS (PyArg_ParseTuple(args, "O:load", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004409 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004410
Guido van Rossum053b8df1998-11-25 16:18:00 +00004411 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004412 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004413
Guido van Rossum60456fd1997-04-09 17:36:32 +00004414 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004415
Guido van Rossum60456fd1997-04-09 17:36:32 +00004416finally:
4417 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004418
Guido van Rossum60456fd1997-04-09 17:36:32 +00004419 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004420}
4421
4422
4423static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004424cpm_loads(PyObject *self, PyObject *args) {
4425 PyObject *ob, *file = 0, *res = NULL;
4426 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004427
Guido van Rossum43713e52000-02-29 13:59:29 +00004428 UNLESS (PyArg_ParseTuple(args, "S:loads", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004429 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004430
Guido van Rossum053b8df1998-11-25 16:18:00 +00004431 UNLESS (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004432 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004433
Guido van Rossum053b8df1998-11-25 16:18:00 +00004434 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004435 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004436
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004438
Guido van Rossum60456fd1997-04-09 17:36:32 +00004439finally:
4440 Py_XDECREF(file);
4441 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004442
Guido van Rossum60456fd1997-04-09 17:36:32 +00004443 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004444}
4445
4446
Tim Peters84e87f32001-03-17 04:50:51 +00004447static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004448"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004449
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004450static PyTypeObject Unpicklertype = {
4451 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004452 0, /*ob_size*/
4453 "Unpickler", /*tp_name*/
4454 sizeof(Unpicklerobject), /*tp_basicsize*/
4455 0, /*tp_itemsize*/
4456 /* methods */
4457 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4458 (printfunc)0, /*tp_print*/
4459 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4460 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4461 (cmpfunc)0, /*tp_compare*/
4462 (reprfunc)0, /*tp_repr*/
4463 0, /*tp_as_number*/
4464 0, /*tp_as_sequence*/
4465 0, /*tp_as_mapping*/
4466 (hashfunc)0, /*tp_hash*/
4467 (ternaryfunc)0, /*tp_call*/
4468 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004469
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470 /* Space for future expansion */
4471 0L,0L,0L,0L,
4472 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004473};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004474
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475static struct PyMethodDef cPickle_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004476 {"dump", (PyCFunction)cpm_dump, 1,
4477 "dump(object, file, [binary]) --"
4478 "Write an object in pickle format to the given file\n"
4479 "\n"
4480 "If the optional argument, binary, is provided and is true, then the\n"
4481 "pickle will be written in binary format, which is more space and\n"
4482 "computationally efficient. \n"
4483 },
4484 {"dumps", (PyCFunction)cpm_dumps, 1,
4485 "dumps(object, [binary]) --"
4486 "Return a string containing an object in pickle format\n"
4487 "\n"
4488 "If the optional argument, binary, is provided and is true, then the\n"
4489 "pickle will be written in binary format, which is more space and\n"
4490 "computationally efficient. \n"
4491 },
4492 {"load", (PyCFunction)cpm_load, 1,
4493 "load(file) -- Load a pickle from the given file"},
4494 {"loads", (PyCFunction)cpm_loads, 1,
4495 "loads(string) -- Load a pickle from the given string"},
4496 {"Pickler", (PyCFunction)get_Pickler, 1,
4497 "Pickler(file, [binary]) -- Create a pickler\n"
4498 "\n"
4499 "If the optional argument, binary, is provided and is true, then\n"
4500 "pickles will be written in binary format, which is more space and\n"
4501 "computationally efficient. \n"
4502 },
4503 {"Unpickler", (PyCFunction)get_Unpickler, 1,
4504 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004505 { NULL, NULL }
4506};
4507
Guido van Rossum60456fd1997-04-09 17:36:32 +00004508static int
Guido van Rossumebba4202000-09-07 14:35:37 +00004509init_stuff(PyObject *module_dict) {
Fred Drake2c7a6852001-07-17 18:34:03 +00004510 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004511
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004512#define INIT_STR(S) UNLESS(S ## _str=PyString_InternFromString(#S)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004513
4514 INIT_STR(__class__);
4515 INIT_STR(__getinitargs__);
4516 INIT_STR(__dict__);
4517 INIT_STR(__getstate__);
4518 INIT_STR(__setstate__);
4519 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004520 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521 INIT_STR(__reduce__);
4522 INIT_STR(write);
4523 INIT_STR(__safe_for_unpickling__);
4524 INIT_STR(append);
4525 INIT_STR(read);
4526 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004527 INIT_STR(copy_reg);
4528 INIT_STR(dispatch_table);
4529 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004530 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531
Guido van Rossum053b8df1998-11-25 16:18:00 +00004532 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533 return -1;
4534
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004535 /* These next few are special because we want to use different
4536 ones in restricted mode. */
4537
Guido van Rossum053b8df1998-11-25 16:18:00 +00004538 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539 return -1;
4540
Guido van Rossum053b8df1998-11-25 16:18:00 +00004541 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00004542 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543 return -1;
4544
4545 Py_DECREF(copy_reg);
4546
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004547 /* Down to here ********************************** */
4548
Guido van Rossum053b8df1998-11-25 16:18:00 +00004549 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004550 return -1;
4551
Guido van Rossumc03158b1999-06-09 15:23:31 +00004552 /* Ugh */
4553 UNLESS (t=PyImport_ImportModule("__builtin__")) return -1;
4554 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4555 return -1;
4556
4557 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004558 UNLESS (r=PyRun_String(
4559 "def __init__(self, *args): self.args=args\n\n"
4560 "def __str__(self):\n"
4561 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4562 Py_file_input,
4563 module_dict, t) ) return -1;
4564 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004565
4566 UNLESS (PickleError = PyErr_NewException("cPickle.PickleError", NULL, t))
4567 return -1;
4568
4569 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004570
Tim Peters84e87f32001-03-17 04:50:51 +00004571
4572 UNLESS (PicklingError = PyErr_NewException("cPickle.PicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004573 PickleError, NULL))
4574 return -1;
4575
4576 UNLESS (t=PyDict_New()) return -1;
Guido van Rossumc3be1a31999-06-15 14:36:59 +00004577 UNLESS (r=PyRun_String(
4578 "def __init__(self, *args): self.args=args\n\n"
4579 "def __str__(self):\n"
4580 " a=self.args\n"
4581 " a=a and type(a[0]) or '(what)'\n"
4582 " return 'Cannot pickle %s objects' % a\n"
4583 , Py_file_input,
4584 module_dict, t) ) return -1;
4585 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004586
4587 UNLESS (UnpickleableError = PyErr_NewException(
4588 "cPickle.UnpickleableError", PicklingError, t))
4589 return -1;
4590
4591 Py_DECREF(t);
4592
Tim Peters84e87f32001-03-17 04:50:51 +00004593 UNLESS (UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004594 PickleError, NULL))
4595 return -1;
4596
Tim Peters84e87f32001-03-17 04:50:51 +00004597 if (PyDict_SetItemString(module_dict, "PickleError",
Guido van Rossumc03158b1999-06-09 15:23:31 +00004598 PickleError) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004599 return -1;
4600
Tim Peters84e87f32001-03-17 04:50:51 +00004601 if (PyDict_SetItemString(module_dict, "PicklingError",
Guido van Rossum60456fd1997-04-09 17:36:32 +00004602 PicklingError) < 0)
4603 return -1;
4604
Guido van Rossum60456fd1997-04-09 17:36:32 +00004605 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4606 UnpicklingError) < 0)
4607 return -1;
4608
Guido van Rossumc03158b1999-06-09 15:23:31 +00004609 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4610 UnpickleableError) < 0)
4611 return -1;
4612
Guido van Rossum053b8df1998-11-25 16:18:00 +00004613 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4614 return -1;
4615
4616 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4617 BadPickleGet) < 0)
4618 return -1;
4619
Guido van Rossum60456fd1997-04-09 17:36:32 +00004620 PycString_IMPORT;
Tim Peters84e87f32001-03-17 04:50:51 +00004621
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004623}
4624
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004625#ifndef DL_EXPORT /* declarations for DLL import/export */
4626#define DL_EXPORT(RTYPE) RTYPE
4627#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004628DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +00004629initcPickle(void) {
Guido van Rossumebba4202000-09-07 14:35:37 +00004630 PyObject *m, *d, *di, *v, *k;
4631 int i;
Guido van Rossum2f80d961999-07-13 15:18:58 +00004632 char *rev="1.71";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633 PyObject *format_version;
4634 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004635
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004636 Picklertype.ob_type = &PyType_Type;
4637 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004638 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004639
Tim Peters84e87f32001-03-17 04:50:51 +00004640 /* Initialize some pieces. We need to do this before module creation,
4641 so we're forced to use a temporary dictionary. :(
Guido van Rossumebba4202000-09-07 14:35:37 +00004642 */
4643 di=PyDict_New();
4644 if (!di) return;
4645 if (init_stuff(di) < 0) return;
4646
Guido van Rossum60456fd1997-04-09 17:36:32 +00004647 /* Create the module and add the functions */
4648 m = Py_InitModule4("cPickle", cPickle_methods,
4649 cPickle_module_documentation,
4650 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004651
Guido van Rossum60456fd1997-04-09 17:36:32 +00004652 /* Add some symbolic constants to the module */
4653 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004654 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004655 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004656
Guido van Rossumebba4202000-09-07 14:35:37 +00004657 /* Copy data from di. Waaa. */
4658 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4659 if (PyObject_SetItem(d, k, v) < 0) {
4660 Py_DECREF(di);
4661 return;
4662 }
4663 }
4664 Py_DECREF(di);
4665
Guido van Rossum60456fd1997-04-09 17:36:32 +00004666 format_version = PyString_FromString("1.3");
4667 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004668
Guido van Rossum60456fd1997-04-09 17:36:32 +00004669 PyDict_SetItemString(d, "format_version", format_version);
4670 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004671 Py_XDECREF(format_version);
4672 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004673}