blob: db12d4b2a377aa6c25825cebe3406909b6edee7c [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
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +000066
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 Rossum77f6a652002-04-03 22:41:51 +0000128#define TRUE 'Z'
129#define FALSE 'z'
130
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000131
Guido van Rossum60456fd1997-04-09 17:36:32 +0000132static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000133
Guido van Rossumc03158b1999-06-09 15:23:31 +0000134static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000135static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000136static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000137static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000138static PyObject *BadPickleGet;
139
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000140
Guido van Rossum60456fd1997-04-09 17:36:32 +0000141static PyObject *dispatch_table;
142static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000143static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000144
Guido van Rossum60456fd1997-04-09 17:36:32 +0000145static PyObject *__class___str, *__getinitargs___str, *__dict___str,
146 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
147 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000148 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000149 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000150
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151/*************************************************************************
152 Internal Data type for pickle data. */
153
154typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155 PyObject_HEAD
156 int length, size;
157 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000158} Pdata;
159
Tim Peters84e87f32001-03-17 04:50:51 +0000160static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000161Pdata_dealloc(Pdata *self)
162{
163 int i;
164 PyObject **p;
165
166 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000170 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171}
172
173static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000174 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
175 (destructor)Pdata_dealloc,
176 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000177};
178
179#define Pdata_Check(O) ((O)->ob_type == &PdataType)
180
181static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000182Pdata_New(void)
183{
184 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000186 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
187 self->size=8;
188 self->length=0;
189 self->data=malloc(self->size * sizeof(PyObject*));
190 if (self->data) return (PyObject*)self;
191 Py_DECREF(self);
192 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000193}
194
Tim Peters84e87f32001-03-17 04:50:51 +0000195static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000196stackUnderflow(void)
197{
198 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
199 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000200}
201
202static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203Pdata_clear(Pdata *self, int clearto)
204{
205 int i;
206 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208 if (clearto < 0) return stackUnderflow();
209 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000211 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
212 Py_DECREF(*p);
213 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000215 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000216}
217
218
Tim Peters84e87f32001-03-17 04:50:51 +0000219static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000220Pdata_grow(Pdata *self)
221{
222 if (! self->size) {
223 PyErr_NoMemory();
224 return -1;
225 }
226 self->size *= 2;
227 self->data = realloc(self->data, self->size*sizeof(PyObject*));
228 if (! self->data) {
229 self->size = 0;
230 PyErr_NoMemory();
231 return -1;
232 }
233 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000234}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000235
236#define PDATA_POP(D,V) { \
237 if ((D)->length) V=D->data[--((D)->length)]; \
238 else { \
239 PyErr_SetString(UnpicklingError, "bad pickle data"); \
240 V=NULL; \
241 } \
242}
243
244
245static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000246Pdata_popTuple(Pdata *self, int start)
247{
248 PyObject *r;
249 int i, j, l;
250
251 l=self->length-start;
252 if (!( r=PyTuple_New(l))) return NULL;
253 for (i=start, j=0 ; j < l; i++, j++)
254 PyTuple_SET_ITEM(r, j, self->data[i]);
255
256 self->length=start;
257 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000258}
259
260static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000261Pdata_popList(Pdata *self, int start)
262{
263 PyObject *r;
264 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000266 l=self->length-start;
267 if (!( r=PyList_New(l))) return NULL;
268 for (i=start, j=0 ; j < l; i++, j++)
269 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000271 self->length=start;
272 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000273}
274
275#define PDATA_APPEND_(D,O,ER) { \
276 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
277}
278
279#define PDATA_APPEND(D,O,ER) { \
280 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
281 Pdata_grow((Pdata*)(D)) < 0) \
282 return ER; \
283 Py_INCREF(O); \
284 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
285}
286
287#define PDATA_PUSH(D,O,ER) { \
288 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
289 Pdata_grow((Pdata*)(D)) < 0) { \
290 Py_DECREF(O); \
291 return ER; \
292 } \
293 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
294}
295
296/*************************************************************************/
297
298#define ARG_TUP(self, o) { \
299 if (self->arg || (self->arg=PyTuple_New(1))) { \
300 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
301 PyTuple_SET_ITEM(self->arg,0,o); \
302 } \
303 else { \
304 Py_DECREF(o); \
305 } \
306}
307
308#define FREE_ARG_TUP(self) { \
309 if (self->arg->ob_refcnt > 1) { \
310 Py_DECREF(self->arg); \
311 self->arg=NULL; \
312 } \
313 }
314
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000315typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000316 PyObject_HEAD
317 FILE *fp;
318 PyObject *write;
319 PyObject *file;
320 PyObject *memo;
321 PyObject *arg;
322 PyObject *pers_func;
323 PyObject *inst_pers_func;
324 int bin;
325 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
326 int (*write_func)(struct Picklerobject *, char *, int);
327 char *write_buf;
328 int buf_size;
329 PyObject *dispatch_table;
330 int fast_container; /* count nested container dumps */
331 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000332} Picklerobject;
333
Barry Warsaw52acb492001-12-21 20:04:22 +0000334#ifndef PY_CPICKLE_FAST_LIMIT
335#define PY_CPICKLE_FAST_LIMIT 50
336#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000337
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000338staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000339
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000340typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 PyObject_HEAD
342 FILE *fp;
343 PyObject *file;
344 PyObject *readline;
345 PyObject *read;
346 PyObject *memo;
347 PyObject *arg;
348 Pdata *stack;
349 PyObject *mark;
350 PyObject *pers_func;
351 PyObject *last_string;
352 int *marks;
353 int num_marks;
354 int marks_size;
355 int (*read_func)(struct Unpicklerobject *, char **, int);
356 int (*readline_func)(struct Unpicklerobject *, char **);
357 int buf_size;
358 char *buf;
359 PyObject *safe_constructors;
360 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000361} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000362
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000363staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000364
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000365/* Forward decls that need the above structs */
366static int save(Picklerobject *, PyObject *, int);
367static int put2(Picklerobject *, PyObject *);
368
Tim Peters84e87f32001-03-17 04:50:51 +0000369int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000370cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
371{
372 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 if ((v = PyObject_GetItem(o,key))) {
375 Py_DECREF(v);
376 return 1;
377 }
378
379 PyErr_Clear();
380 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000381}
382
Guido van Rossumd385d591997-04-09 17:47:47 +0000383static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000385cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
386{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 va_list va;
388 PyObject *args=0, *retval=0;
389 va_start(va, format);
390
391 if (format) args = Py_VaBuildValue(format, va);
392 va_end(va);
393 if (format && ! args) return NULL;
394 if (stringformat && !(retval=PyString_FromString(stringformat)))
395 return NULL;
396
397 if (retval) {
398 if (args) {
399 PyObject *v;
400 v=PyString_Format(retval, args);
401 Py_DECREF(retval);
402 Py_DECREF(args);
403 if (! v) return NULL;
404 retval=v;
405 }
406 }
407 else
408 if (args) retval=args;
409 else {
410 PyErr_SetObject(ErrType,Py_None);
411 return NULL;
412 }
413 PyErr_SetObject(ErrType,retval);
414 Py_DECREF(retval);
415 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000419write_file(Picklerobject *self, char *s, int n)
420{
421 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 if (s == NULL) {
424 return 0;
425 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 Py_BEGIN_ALLOW_THREADS
428 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
429 Py_END_ALLOW_THREADS
430 if (nbyteswritten != (size_t)n) {
431 PyErr_SetFromErrno(PyExc_IOError);
432 return -1;
433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000435 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000436}
437
Tim Peters84e87f32001-03-17 04:50:51 +0000438static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439write_cStringIO(Picklerobject *self, char *s, int n)
440{
441 if (s == NULL) {
442 return 0;
443 }
444
445 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
446 return -1;
447 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000449 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450}
451
Tim Peters84e87f32001-03-17 04:50:51 +0000452static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000453write_none(Picklerobject *self, char *s, int n)
454{
455 if (s == NULL) return 0;
456 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000460write_other(Picklerobject *self, char *s, int n)
461{
462 PyObject *py_str = 0, *junk = 0;
463
464 if (s == NULL) {
465 if (!( self->buf_size )) return 0;
466 py_str = PyString_FromStringAndSize(self->write_buf,
467 self->buf_size);
468 if (!py_str)
469 return -1;
470 }
471 else {
472 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
473 if (write_other(self, NULL, 0) < 0)
474 return -1;
475 }
476
477 if (n > WRITE_BUF_SIZE) {
478 if (!( py_str =
479 PyString_FromStringAndSize(s, n)))
480 return -1;
481 }
482 else {
483 memcpy(self->write_buf + self->buf_size, s, n);
484 self->buf_size += n;
485 return n;
486 }
487 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (self->write) {
490 /* object with write method */
491 ARG_TUP(self, py_str);
492 if (self->arg) {
493 junk = PyObject_Call(self->write, self->arg, NULL);
494 FREE_ARG_TUP(self);
495 }
496 if (junk) Py_DECREF(junk);
497 else return -1;
498 }
499 else
500 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 self->buf_size = 0;
503 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504}
505
506
Tim Peters84e87f32001-03-17 04:50:51 +0000507static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000508read_file(Unpicklerobject *self, char **s, int n)
509{
510 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512 if (self->buf_size == 0) {
513 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 size = ((n < 32) ? 32 : n);
516 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
517 PyErr_NoMemory();
518 return -1;
519 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521 self->buf_size = size;
522 }
523 else if (n > self->buf_size) {
524 self->buf = (char *)realloc(self->buf, n * sizeof(char));
525 if (!self->buf) {
526 PyErr_NoMemory();
527 return -1;
528 }
Tim Peters84e87f32001-03-17 04:50:51 +0000529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530 self->buf_size = n;
531 }
Tim Peters84e87f32001-03-17 04:50:51 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 Py_BEGIN_ALLOW_THREADS
534 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
535 Py_END_ALLOW_THREADS
536 if (nbytesread != (size_t)n) {
537 if (feof(self->fp)) {
538 PyErr_SetNone(PyExc_EOFError);
539 return -1;
540 }
541
542 PyErr_SetFromErrno(PyExc_IOError);
543 return -1;
544 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000548 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000549}
550
551
Tim Peters84e87f32001-03-17 04:50:51 +0000552static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553readline_file(Unpicklerobject *self, char **s)
554{
555 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 if (self->buf_size == 0) {
558 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
559 PyErr_NoMemory();
560 return -1;
561 }
Tim Peters84e87f32001-03-17 04:50:51 +0000562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000563 self->buf_size = 40;
564 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566 i = 0;
567 while (1) {
568 for (; i < (self->buf_size - 1); i++) {
569 if (feof(self->fp) ||
570 (self->buf[i] = getc(self->fp)) == '\n') {
571 self->buf[i + 1] = '\0';
572 *s = self->buf;
573 return i + 1;
574 }
575 }
576 self->buf = (char *)realloc(self->buf,
577 (self->buf_size * 2) * sizeof(char));
578 if (!self->buf) {
579 PyErr_NoMemory();
580 return -1;
581 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583 self->buf_size *= 2;
584 }
Tim Peters84e87f32001-03-17 04:50:51 +0000585}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000586
587
Tim Peters84e87f32001-03-17 04:50:51 +0000588static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000589read_cStringIO(Unpicklerobject *self, char **s, int n)
590{
591 char *ptr;
592
593 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
594 PyErr_SetNone(PyExc_EOFError);
595 return -1;
596 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 *s = ptr;
599
600 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000601}
602
603
Tim Peters84e87f32001-03-17 04:50:51 +0000604static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605readline_cStringIO(Unpicklerobject *self, char **s)
606{
607 int n;
608 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
611 return -1;
612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000617}
618
619
Tim Peters84e87f32001-03-17 04:50:51 +0000620static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000621read_other(Unpicklerobject *self, char **s, int n)
622{
623 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 ARG_TUP(self, bytes);
628 if (self->arg) {
629 str = PyObject_Call(self->read, self->arg, NULL);
630 FREE_ARG_TUP(self);
631 }
632 if (! str) return -1;
633
634 Py_XDECREF(self->last_string);
635 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 if (! (*s = PyString_AsString(str))) return -1;
638 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000639}
640
641
Tim Peters84e87f32001-03-17 04:50:51 +0000642static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643readline_other(Unpicklerobject *self, char **s)
644{
645 PyObject *str;
646 int str_size;
647
648 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
649 return -1;
650 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000652 if ((str_size = PyString_Size(str)) < 0)
653 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 Py_XDECREF(self->last_string);
656 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658 if (! (*s = PyString_AsString(str)))
659 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000661 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662}
663
664
665static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666pystrndup(char *s, int l)
667{
668 char *r;
669 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
670 memcpy(r,s,l);
671 r[l]=0;
672 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673}
674
675
676static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677get(Picklerobject *self, PyObject *id)
678{
679 PyObject *value, *mv;
680 long c_value;
681 char s[30];
682 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684 if (!( mv = PyDict_GetItem(self->memo, id))) {
685 PyErr_SetObject(PyExc_KeyError, id);
686 return -1;
687 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 if (!( value = PyTuple_GetItem(mv, 0)))
690 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000692 if (!( PyInt_Check(value))) {
693 PyErr_SetString(PicklingError, "no int where int expected in memo");
694 return -1;
695 }
696 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698 if (!self->bin) {
699 s[0] = GET;
700 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
701 len = strlen(s);
702 }
703 else if (Pdata_Check(self->file)) {
704 if (write_other(self, NULL, 0) < 0) return -1;
705 PDATA_APPEND(self->file, mv, -1);
706 return 0;
707 }
708 else {
709 if (c_value < 256) {
710 s[0] = BINGET;
711 s[1] = (int)(c_value & 0xff);
712 len = 2;
713 }
714 else {
715 s[0] = LONG_BINGET;
716 s[1] = (int)(c_value & 0xff);
717 s[2] = (int)((c_value >> 8) & 0xff);
718 s[3] = (int)((c_value >> 16) & 0xff);
719 s[4] = (int)((c_value >> 24) & 0xff);
720 len = 5;
721 }
722 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724 if ((*self->write_func)(self, s, len) < 0)
725 return -1;
726
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000727 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000729
Guido van Rossum60456fd1997-04-09 17:36:32 +0000730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000731static int
732put(Picklerobject *self, PyObject *ob)
733{
734 if (ob->ob_refcnt < 2 || self->fast)
735 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737 return put2(self, ob);
738}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000739
Guido van Rossum053b8df1998-11-25 16:18:00 +0000740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000741static int
742put2(Picklerobject *self, PyObject *ob)
743{
744 char c_str[30];
745 int p;
746 size_t len;
747 int res = -1;
748 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000750 if (self->fast)
751 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753 if ((p = PyDict_Size(self->memo)) < 0)
754 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 /* Make sure memo keys are positive! */
757 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
760 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 if (!( memo_len = PyInt_FromLong(p)))
763 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 if (!( t = PyTuple_New(2)))
766 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000768 PyTuple_SET_ITEM(t, 0, memo_len);
769 Py_INCREF(memo_len);
770 PyTuple_SET_ITEM(t, 1, ob);
771 Py_INCREF(ob);
772
773 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
774 goto finally;
775
776 if (!self->bin) {
777 c_str[0] = PUT;
778 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
779 len = strlen(c_str);
780 }
781 else if (Pdata_Check(self->file)) {
782 if (write_other(self, NULL, 0) < 0) return -1;
783 PDATA_APPEND(self->file, memo_len, -1);
784 res=0; /* Job well done ;) */
785 goto finally;
786 }
787 else {
788 if (p >= 256) {
789 c_str[0] = LONG_BINPUT;
790 c_str[1] = (int)(p & 0xff);
791 c_str[2] = (int)((p >> 8) & 0xff);
792 c_str[3] = (int)((p >> 16) & 0xff);
793 c_str[4] = (int)((p >> 24) & 0xff);
794 len = 5;
795 }
796 else {
797 c_str[0] = BINPUT;
798 c_str[1] = p;
799 len = 2;
800 }
801 }
802
803 if ((*self->write_func)(self, c_str, len) < 0)
804 goto finally;
805
806 res = 0;
807
808 finally:
809 Py_XDECREF(py_ob_id);
810 Py_XDECREF(memo_len);
811 Py_XDECREF(t);
812
813 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000814}
815
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000816#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000817
818static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000819PyImport_Import(PyObject *module_name)
820{
821 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
822 static PyObject *standard_builtins=0;
823 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000825 if (!( silly_list )) {
826 if (!( __import___str=PyString_FromString("__import__")))
827 return NULL;
828 if (!( __builtins___str=PyString_FromString("__builtins__")))
829 return NULL;
830 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
831 return NULL;
832 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834 if ((globals=PyEval_GetGlobals())) {
835 Py_INCREF(globals);
836 __builtins__=PyObject_GetItem(globals,__builtins___str);
837 if (!__builtins__)
838 goto err;
839 }
840 else {
841 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 if (!(standard_builtins ||
844 (standard_builtins=PyImport_ImportModule("__builtin__"))))
845 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 __builtins__=standard_builtins;
848 Py_INCREF(__builtins__);
849 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
850 if (!globals)
851 goto err;
852 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000854 if (PyDict_Check(__builtins__)) {
855 __import__=PyObject_GetItem(__builtins__,__import___str);
856 if (!__import__) goto err;
857 }
858 else {
859 __import__=PyObject_GetAttr(__builtins__,__import___str);
860 if (!__import__) goto err;
861 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 r=PyObject_CallFunction(__import__,"OOOO",
864 module_name, globals, globals, silly_list);
865 if (!r)
866 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 Py_DECREF(globals);
869 Py_DECREF(__builtins__);
870 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000872 return r;
873 err:
874 Py_XDECREF(globals);
875 Py_XDECREF(__builtins__);
876 Py_XDECREF(__import__);
877 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000878}
879
880static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881whichmodule(PyObject *global, PyObject *global_name)
882{
883 int i, j;
884 PyObject *module = 0, *modules_dict = 0,
885 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000887 module = PyObject_GetAttrString(global, "__module__");
888 if (module) return module;
889 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000891 if (!( modules_dict = PySys_GetObject("modules")))
892 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 i = 0;
895 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000897 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000899 global_name_attr = PyObject_GetAttr(module, global_name);
900 if (!global_name_attr) {
901 PyErr_Clear();
902 continue;
903 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000905 if (global_name_attr != global) {
906 Py_DECREF(global_name_attr);
907 continue;
908 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000912 break;
913 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 /* The following implements the rule in pickle.py added in 1.5
916 that used __main__ if no module is found. I don't actually
917 like this rule. jlf
918 */
919 if (!j) {
920 j=1;
921 name=__main___str;
922 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 Py_INCREF(name);
925 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000926}
927
928
Guido van Rossum60456fd1997-04-09 17:36:32 +0000929static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000930fast_save_enter(Picklerobject *self, PyObject *obj)
931{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 /* if fast_container < 0, we're doing an error exit. */
933 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
934 PyObject *key = NULL;
935 if (self->fast_memo == NULL) {
936 self->fast_memo = PyDict_New();
937 if (self->fast_memo == NULL) {
938 self->fast_container = -1;
939 return 0;
940 }
941 }
942 key = PyLong_FromVoidPtr(obj);
943 if (key == NULL)
944 return 0;
945 if (PyDict_GetItem(self->fast_memo, key)) {
946 PyErr_Format(PyExc_ValueError,
947 "fast mode: can't pickle cyclic objects including object type %s at %p",
948 obj->ob_type->tp_name, obj);
949 self->fast_container = -1;
950 return 0;
951 }
952 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
953 self->fast_container = -1;
954 return 0;
955 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000956 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000958}
959
960int
961fast_save_leave(Picklerobject *self, PyObject *obj)
962{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
964 PyObject *key = PyLong_FromVoidPtr(obj);
965 if (key == NULL)
966 return 0;
967 if (PyDict_DelItem(self->fast_memo, key) < 0) {
968 return 0;
969 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000970 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000972}
973
974static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000975save_none(Picklerobject *self, PyObject *args)
976{
977 static char none = NONE;
978 if ((*self->write_func)(self, &none, 1) < 0)
979 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000982}
983
Guido van Rossum77f6a652002-04-03 22:41:51 +0000984static int
985save_bool(Picklerobject *self, PyObject *args)
986{
987 static char buf[2] = {FALSE, TRUE};
988 long l = PyInt_AS_LONG((PyIntObject *)args);
989
990 if ((*self->write_func)(self, buf + l, 1) < 0)
991 return -1;
992
993 return 0;
994}
Tim Peters84e87f32001-03-17 04:50:51 +0000995
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000997save_int(Picklerobject *self, PyObject *args)
998{
999 char c_str[32];
1000 long l = PyInt_AS_LONG((PyIntObject *)args);
1001 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001003 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001004#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 || l > 0x7fffffffL
1006 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001007#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001008 ) {
1009 /* Text-mode pickle, or long too big to fit in the 4-byte
1010 * signed BININT format: store as a string.
1011 */
1012 c_str[0] = INT;
1013 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
1014 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1015 return -1;
1016 }
1017 else {
1018 /* Binary pickle and l fits in a signed 4-byte int. */
1019 c_str[1] = (int)( l & 0xff);
1020 c_str[2] = (int)((l >> 8) & 0xff);
1021 c_str[3] = (int)((l >> 16) & 0xff);
1022 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1025 if (c_str[2] == 0) {
1026 c_str[0] = BININT1;
1027 len = 2;
1028 }
1029 else {
1030 c_str[0] = BININT2;
1031 len = 3;
1032 }
1033 }
1034 else {
1035 c_str[0] = BININT;
1036 len = 5;
1037 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 if ((*self->write_func)(self, c_str, len) < 0)
1040 return -1;
1041 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001043 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044}
1045
1046
1047static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048save_long(Picklerobject *self, PyObject *args)
1049{
1050 int size, res = -1;
1051 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001053 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055 if (!( repr = PyObject_Repr(args)))
1056 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 if ((size = PyString_Size(repr)) < 0)
1059 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001061 if ((*self->write_func)(self, &l, 1) < 0)
1062 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001064 if ((*self->write_func)(self,
1065 PyString_AS_STRING((PyStringObject *)repr),
1066 size) < 0)
1067 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069 if ((*self->write_func)(self, "\n", 1) < 0)
1070 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001072 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001074 finally:
1075 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001077 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078}
1079
1080
1081static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001082save_float(Picklerobject *self, PyObject *args)
1083{
1084 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001086 if (self->bin) {
1087 int s, e;
1088 double f;
1089 long fhi, flo;
1090 char str[9];
1091 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001093 *p = BINFLOAT;
1094 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001096 if (x < 0) {
1097 s = 1;
1098 x = -x;
1099 }
1100 else
1101 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001105 /* Normalize f to be in the range [1.0, 2.0) */
1106 if (0.5 <= f && f < 1.0) {
1107 f *= 2.0;
1108 e--;
1109 }
1110 else if (f == 0.0) {
1111 e = 0;
1112 }
1113 else {
1114 PyErr_SetString(PyExc_SystemError,
1115 "frexp() result out of range");
1116 return -1;
1117 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 if (e >= 1024) {
1120 /* XXX 1024 itself is reserved for Inf/NaN */
1121 PyErr_SetString(PyExc_OverflowError,
1122 "float too large to pack with d format");
1123 return -1;
1124 }
1125 else if (e < -1022) {
1126 /* Gradual underflow */
1127 f = ldexp(f, 1022 + e);
1128 e = 0;
1129 }
1130 else if (!(e == 0 && f == 0.0)) {
1131 e += 1023;
1132 f -= 1.0; /* Get rid of leading 1 */
1133 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 /* fhi receives the high 28 bits;
1136 flo the low 24 bits (== 52 bits) */
1137 f *= 268435456.0; /* 2**28 */
1138 fhi = (long) floor(f); /* Truncate */
1139 f -= (double)fhi;
1140 f *= 16777216.0; /* 2**24 */
1141 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143 /* First byte */
1144 *p = (s<<7) | (e>>4);
1145 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 /* Second byte */
1148 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1149 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 /* Third byte */
1152 *p = (unsigned char) ((fhi>>16) & 0xFF);
1153 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 /* Fourth byte */
1156 *p = (unsigned char) ((fhi>>8) & 0xFF);
1157 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 /* Fifth byte */
1160 *p = (unsigned char) (fhi & 0xFF);
1161 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 /* Sixth byte */
1164 *p = (unsigned char) ((flo>>16) & 0xFF);
1165 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 /* Seventh byte */
1168 *p = (unsigned char) ((flo>>8) & 0xFF);
1169 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 /* Eighth byte */
1172 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 if ((*self->write_func)(self, str, 9) < 0)
1175 return -1;
1176 }
1177 else {
1178 char c_str[250];
1179 c_str[0] = FLOAT;
1180 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1183 return -1;
1184 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001186 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187}
1188
1189
1190static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191save_string(Picklerobject *self, PyObject *args, int doput)
1192{
1193 int size, len;
1194 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001196 if ((size = PyString_Size(args)) < 0)
1197 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001199 if (!self->bin) {
1200 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001202 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 if (!( repr = PyObject_Repr(args)))
1205 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 if ((len = PyString_Size(repr)) < 0)
1208 goto err;
1209 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if ((*self->write_func)(self, &string, 1) < 0)
1212 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if ((*self->write_func)(self, repr_str, len) < 0)
1215 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 if ((*self->write_func)(self, "\n", 1) < 0)
1218 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 Py_XDECREF(repr);
1221 }
1222 else {
1223 int i;
1224 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 if ((size = PyString_Size(args)) < 0)
1227 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 if (size < 256) {
1230 c_str[0] = SHORT_BINSTRING;
1231 c_str[1] = size;
1232 len = 2;
1233 }
1234 else {
1235 c_str[0] = BINSTRING;
1236 for (i = 1; i < 5; i++)
1237 c_str[i] = (int)(size >> ((i - 1) * 8));
1238 len = 5;
1239 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 if ((*self->write_func)(self, c_str, len) < 0)
1242 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 if (size > 128 && Pdata_Check(self->file)) {
1245 if (write_other(self, NULL, 0) < 0) return -1;
1246 PDATA_APPEND(self->file, args, -1);
1247 }
1248 else {
1249 if ((*self->write_func)(self,
1250 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1251 return -1;
1252 }
1253 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 if (doput)
1256 if (put(self, args) < 0)
1257 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 err:
1262 Py_XDECREF(repr);
1263 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001264}
1265
1266
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001267#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001268/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1269 backslash and newline characters to \uXXXX escapes. */
1270static PyObject *
1271modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1272{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 PyObject *repr;
1274 char *p;
1275 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001277 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001279 repr = PyString_FromStringAndSize(NULL, 6 * size);
1280 if (repr == NULL)
1281 return NULL;
1282 if (size == 0)
1283 return repr;
1284
1285 p = q = PyString_AS_STRING(repr);
1286 while (size-- > 0) {
1287 Py_UNICODE ch = *s++;
1288 /* Map 16-bit characters to '\uxxxx' */
1289 if (ch >= 256 || ch == '\\' || ch == '\n') {
1290 *p++ = '\\';
1291 *p++ = 'u';
1292 *p++ = hexdigit[(ch >> 12) & 0xf];
1293 *p++ = hexdigit[(ch >> 8) & 0xf];
1294 *p++ = hexdigit[(ch >> 4) & 0xf];
1295 *p++ = hexdigit[ch & 15];
1296 }
1297 /* Copy everything else as-is */
1298 else
1299 *p++ = (char) ch;
1300 }
1301 *p = '\0';
1302 if (_PyString_Resize(&repr, p - q))
1303 goto onError;
1304
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001305 return repr;
1306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 onError:
1308 Py_DECREF(repr);
1309 return NULL;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001310}
1311
1312
Guido van Rossum60456fd1997-04-09 17:36:32 +00001313static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314save_unicode(Picklerobject *self, PyObject *args, int doput)
1315{
1316 int size, len;
1317 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001319 if (!PyUnicode_Check(args))
1320 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 if (!self->bin) {
1323 char *repr_str;
1324 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 repr = modified_EncodeRawUnicodeEscape(
1327 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1328 if (!repr)
1329 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if ((len = PyString_Size(repr)) < 0)
1332 goto err;
1333 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 if ((*self->write_func)(self, &string, 1) < 0)
1336 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 if ((*self->write_func)(self, repr_str, len) < 0)
1339 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 if ((*self->write_func)(self, "\n", 1) < 0)
1342 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 Py_XDECREF(repr);
1345 }
1346 else {
1347 int i;
1348 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 if (!( repr = PyUnicode_AsUTF8String(args)))
1351 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 if ((size = PyString_Size(repr)) < 0)
1354 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001356 c_str[0] = BINUNICODE;
1357 for (i = 1; i < 5; i++)
1358 c_str[i] = (int)(size >> ((i - 1) * 8));
1359 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if ((*self->write_func)(self, c_str, len) < 0)
1362 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 if (size > 128 && Pdata_Check(self->file)) {
1365 if (write_other(self, NULL, 0) < 0)
1366 goto err;
1367 PDATA_APPEND(self->file, repr, -1);
1368 }
1369 else {
1370 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1371 size) < 0)
1372 goto err;
1373 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 Py_DECREF(repr);
1376 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001378 if (doput)
1379 if (put(self, args) < 0)
1380 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001382 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 err:
1385 Py_XDECREF(repr);
1386 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001387}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001388#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001389
1390
1391static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392save_tuple(Picklerobject *self, PyObject *args)
1393{
1394 PyObject *element = 0, *py_tuple_id = 0;
1395 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 if ((*self->write_func)(self, &MARKv, 1) < 0)
1400 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 if ((len = PyTuple_Size(args)) < 0)
1403 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405 for (i = 0; i < len; i++) {
1406 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1407 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 if (save(self, element, 0) < 0)
1410 goto finally;
1411 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1414 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 if (len) {
1417 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1418 if (self->bin) {
1419 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1422 goto finally;
1423 }
1424 else {
1425 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 for (i = 0; i <= len; i++) {
1428 if ((*self->write_func)(self, &pop, 1) < 0)
1429 goto finally;
1430 }
1431 }
Tim Peters84e87f32001-03-17 04:50:51 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if (get(self, py_tuple_id) < 0)
1434 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 res = 0;
1437 goto finally;
1438 }
1439 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 if ((*self->write_func)(self, &tuple, 1) < 0) {
1442 goto finally;
1443 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001445 if (put(self, args) < 0)
1446 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 finally:
1451 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001454}
1455
1456static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001457save_empty_tuple(Picklerobject *self, PyObject *args)
1458{
1459 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001462}
1463
1464
1465static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466save_list(Picklerobject *self, PyObject *args)
1467{
1468 PyObject *element = 0;
1469 int s_len, len, i, using_appends, res = -1;
1470 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001474 if (self->fast && !fast_save_enter(self, args))
1475 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001477 if (self->bin) {
1478 s[0] = EMPTY_LIST;
1479 s_len = 1;
1480 }
1481 else {
1482 s[0] = MARK;
1483 s[1] = LIST;
1484 s_len = 2;
1485 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 if ((len = PyList_Size(args)) < 0)
1488 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 if ((*self->write_func)(self, s, s_len) < 0)
1491 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 if (len == 0) {
1494 if (put(self, args) < 0)
1495 goto finally;
1496 }
1497 else {
1498 if (put2(self, args) < 0)
1499 goto finally;
1500 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 if ((using_appends = (self->bin && (len > 1))))
1503 if ((*self->write_func)(self, &MARKv, 1) < 0)
1504 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 for (i = 0; i < len; i++) {
1507 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1508 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 if (save(self, element, 0) < 0)
1511 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513 if (!using_appends) {
1514 if ((*self->write_func)(self, &append, 1) < 0)
1515 goto finally;
1516 }
1517 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519 if (using_appends) {
1520 if ((*self->write_func)(self, &appends, 1) < 0)
1521 goto finally;
1522 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001526 finally:
1527 if (self->fast && !fast_save_leave(self, args))
1528 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001530 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001531}
1532
1533
Guido van Rossum60456fd1997-04-09 17:36:32 +00001534static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001535save_dict(Picklerobject *self, PyObject *args)
1536{
1537 PyObject *key = 0, *value = 0;
1538 int i, len, res = -1, using_setitems;
1539 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001541 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001543 if (self->fast && !fast_save_enter(self, args))
1544 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001546 if (self->bin) {
1547 s[0] = EMPTY_DICT;
1548 len = 1;
1549 }
1550 else {
1551 s[0] = MARK;
1552 s[1] = DICT;
1553 len = 2;
1554 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 if ((*self->write_func)(self, s, len) < 0)
1557 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 if ((len = PyDict_Size(args)) < 0)
1560 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 if (len == 0) {
1563 if (put(self, args) < 0)
1564 goto finally;
1565 }
1566 else {
1567 if (put2(self, args) < 0)
1568 goto finally;
1569 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1572 if ((*self->write_func)(self, &MARKv, 1) < 0)
1573 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001575 i = 0;
1576 while (PyDict_Next(args, &i, &key, &value)) {
1577 if (save(self, key, 0) < 0)
1578 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 if (save(self, value, 0) < 0)
1581 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001583 if (!using_setitems) {
1584 if ((*self->write_func)(self, &setitem, 1) < 0)
1585 goto finally;
1586 }
1587 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 if (using_setitems) {
1590 if ((*self->write_func)(self, &setitems, 1) < 0)
1591 goto finally;
1592 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 finally:
1597 if (self->fast && !fast_save_leave(self, args))
1598 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001601}
1602
1603
Tim Peters84e87f32001-03-17 04:50:51 +00001604static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605save_inst(Picklerobject *self, PyObject *args)
1606{
1607 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1608 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1609 char *module_str, *name_str;
1610 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001612 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if (self->fast && !fast_save_enter(self, args))
1615 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if ((*self->write_func)(self, &MARKv, 1) < 0)
1618 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620 if (!( class = PyObject_GetAttr(args, __class___str)))
1621 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001623 if (self->bin) {
1624 if (save(self, class, 0) < 0)
1625 goto finally;
1626 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1629 PyObject *element = 0;
1630 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 if (!( class_args =
1633 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1634 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001636 if ((len = PyObject_Size(class_args)) < 0)
1637 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001639 for (i = 0; i < len; i++) {
1640 if (!( element = PySequence_GetItem(class_args, i)))
1641 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 if (save(self, element, 0) < 0) {
1644 Py_DECREF(element);
1645 goto finally;
1646 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 Py_DECREF(element);
1649 }
1650 }
1651 else {
1652 PyErr_Clear();
1653 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 if (!self->bin) {
1656 if (!( name = ((PyClassObject *)class)->cl_name )) {
1657 PyErr_SetString(PicklingError, "class has no name");
1658 goto finally;
1659 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661 if (!( module = whichmodule(class, name)))
1662 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001663
Tim Peters84e87f32001-03-17 04:50:51 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if ((module_size = PyString_Size(module)) < 0 ||
1666 (name_size = PyString_Size(name)) < 0)
1667 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 module_str = PyString_AS_STRING((PyStringObject *)module);
1670 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 if ((*self->write_func)(self, &inst, 1) < 0)
1673 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 if ((*self->write_func)(self, module_str, module_size) < 0)
1676 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 if ((*self->write_func)(self, "\n", 1) < 0)
1679 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001681 if ((*self->write_func)(self, name_str, name_size) < 0)
1682 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001684 if ((*self->write_func)(self, "\n", 1) < 0)
1685 goto finally;
1686 }
1687 else if ((*self->write_func)(self, &obj, 1) < 0) {
1688 goto finally;
1689 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1692 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1693 if (!state)
1694 goto finally;
1695 }
1696 else {
1697 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001699 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1700 PyErr_Clear();
1701 res = 0;
1702 goto finally;
1703 }
1704 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if (!PyDict_Check(state)) {
1707 if (put2(self, args) < 0)
1708 goto finally;
1709 }
1710 else {
1711 if (put(self, args) < 0)
1712 goto finally;
1713 }
Tim Peters84e87f32001-03-17 04:50:51 +00001714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 if (save(self, state, 0) < 0)
1716 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 if ((*self->write_func)(self, &build, 1) < 0)
1719 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001721 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001723 finally:
1724 if (self->fast && !fast_save_leave(self, args))
1725 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 Py_XDECREF(module);
1728 Py_XDECREF(class);
1729 Py_XDECREF(state);
1730 Py_XDECREF(getinitargs_func);
1731 Py_XDECREF(getstate_func);
1732 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001734 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001735}
1736
1737
Guido van Rossum60456fd1997-04-09 17:36:32 +00001738static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739save_global(Picklerobject *self, PyObject *args, PyObject *name)
1740{
1741 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1742 char *name_str, *module_str;
1743 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 if (name) {
1748 global_name = name;
1749 Py_INCREF(global_name);
1750 }
1751 else {
1752 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1753 goto finally;
1754 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if (!( module = whichmodule(args, global_name)))
1757 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if ((module_size = PyString_Size(module)) < 0 ||
1760 (name_size = PyString_Size(global_name)) < 0)
1761 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 module_str = PyString_AS_STRING((PyStringObject *)module);
1764 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 mod = PyImport_ImportModule(module_str);
1767 if (mod == NULL) {
1768 /* Py_ErrClear(); ?? */
1769 cPickle_ErrFormat(PicklingError,
1770 "Can't pickle %s: it's not found as %s.%s",
1771 "OSS", args, module, global_name);
1772 goto finally;
1773 }
1774 /* borrowed ref */
1775 moddict = PyModule_GetDict(mod);
1776 /* borrowed ref */
1777 klass = PyDict_GetItemString(moddict, name_str);
1778 if (klass == NULL) {
1779 cPickle_ErrFormat(PicklingError,
1780 "Can't pickle %s: it's not found as %s.%s",
1781 "OSS", args, module, global_name);
1782 goto finally;
1783 }
1784 if (klass != args) {
1785 cPickle_ErrFormat(PicklingError,
1786 "Can't pickle %s: it's not the same object as %s.%s",
1787 "OSS", args, module, global_name);
1788 goto finally;
1789 }
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791 if ((*self->write_func)(self, &global, 1) < 0)
1792 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001794 if ((*self->write_func)(self, module_str, module_size) < 0)
1795 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 if ((*self->write_func)(self, "\n", 1) < 0)
1798 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 if ((*self->write_func)(self, name_str, name_size) < 0)
1801 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 if ((*self->write_func)(self, "\n", 1) < 0)
1804 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 if (put(self, args) < 0)
1807 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 finally:
1812 Py_XDECREF(module);
1813 Py_XDECREF(global_name);
1814 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817}
1818
Guido van Rossum60456fd1997-04-09 17:36:32 +00001819static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1821{
1822 PyObject *pid = 0;
1823 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 Py_INCREF(args);
1828 ARG_TUP(self, args);
1829 if (self->arg) {
1830 pid = PyObject_Call(f, self->arg, NULL);
1831 FREE_ARG_TUP(self);
1832 }
1833 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 if (pid != Py_None) {
1836 if (!self->bin) {
1837 if (!PyString_Check(pid)) {
1838 PyErr_SetString(PicklingError,
1839 "persistent id must be string");
1840 goto finally;
1841 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if ((*self->write_func)(self, &persid, 1) < 0)
1844 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if ((size = PyString_Size(pid)) < 0)
1847 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 if ((*self->write_func)(self,
1850 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1851 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853 if ((*self->write_func)(self, "\n", 1) < 0)
1854 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001856 res = 1;
1857 goto finally;
1858 }
1859 else if (save(self, pid, 1) >= 0) {
1860 if ((*self->write_func)(self, &binpersid, 1) < 0)
1861 res = -1;
1862 else
1863 res = 1;
1864 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 goto finally;
1867 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001869 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 finally:
1872 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001876
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001877
Tim Peters84e87f32001-03-17 04:50:51 +00001878static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001879save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 PyObject *tup, PyObject *state, PyObject *ob)
1881{
1882 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001884 if (save(self, callable, 0) < 0)
1885 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001887 if (save(self, tup, 0) < 0)
1888 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 if ((*self->write_func)(self, &reduce, 1) < 0)
1891 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893 if (ob != NULL) {
1894 if (state && !PyDict_Check(state)) {
1895 if (put2(self, ob) < 0)
1896 return -1;
1897 }
1898 else {
1899 if (put(self, ob) < 0)
1900 return -1;
1901 }
1902 }
Tim Peters84e87f32001-03-17 04:50:51 +00001903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 if (state) {
1905 if (save(self, state, 0) < 0)
1906 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 if ((*self->write_func)(self, &build, 1) < 0)
1909 return -1;
1910 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001913}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001914
Guido van Rossum60456fd1997-04-09 17:36:32 +00001915static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916save(Picklerobject *self, PyObject *args, int pers_save)
1917{
1918 PyTypeObject *type;
1919 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1920 *callable = 0, *state = 0;
1921 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 if (!pers_save && self->pers_func) {
1924 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1925 res = tmp;
1926 goto finally;
1927 }
1928 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 if (args == Py_None) {
1931 res = save_none(self, args);
1932 goto finally;
1933 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001938 case 'b':
1939 if (args == Py_False || args == Py_True) {
1940 res = save_bool(self, args);
1941 goto finally;
1942 }
1943 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001944 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if (type == &PyInt_Type) {
1946 res = save_int(self, args);
1947 goto finally;
1948 }
1949 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001950
Guido van Rossum60456fd1997-04-09 17:36:32 +00001951 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 if (type == &PyLong_Type) {
1953 res = save_long(self, args);
1954 goto finally;
1955 }
1956 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Guido van Rossum60456fd1997-04-09 17:36:32 +00001958 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (type == &PyFloat_Type) {
1960 res = save_float(self, args);
1961 goto finally;
1962 }
1963 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Guido van Rossum60456fd1997-04-09 17:36:32 +00001965 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1967 if (self->bin) res = save_empty_tuple(self, args);
1968 else res = save_tuple(self, args);
1969 goto finally;
1970 }
1971 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001972
Guido van Rossum60456fd1997-04-09 17:36:32 +00001973 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1975 res = save_string(self, args, 0);
1976 goto finally;
1977 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001978
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001979#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001980 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1982 res = save_unicode(self, args, 0);
1983 goto finally;
1984 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001985#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001988 if (args->ob_refcnt > 1) {
1989 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1990 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 if (PyDict_GetItem(self->memo, py_ob_id)) {
1993 if (get(self, py_ob_id) < 0)
1994 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 res = 0;
1997 goto finally;
1998 }
1999 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002001 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002002 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002003 if (type == &PyString_Type) {
2004 res = save_string(self, args, 1);
2005 goto finally;
2006 }
2007 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002008
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002009#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002010 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 if (type == &PyUnicode_Type) {
2012 res = save_unicode(self, args, 1);
2013 goto finally;
2014 }
2015 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002016#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002017
Guido van Rossum60456fd1997-04-09 17:36:32 +00002018 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 if (type == &PyTuple_Type) {
2020 res = save_tuple(self, args);
2021 goto finally;
2022 }
2023 if (type == &PyType_Type) {
2024 res = save_global(self, args, NULL);
2025 goto finally;
2026 }
2027 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002028
Guido van Rossum60456fd1997-04-09 17:36:32 +00002029 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002030 if (type == &PyList_Type) {
2031 res = save_list(self, args);
2032 goto finally;
2033 }
2034 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002035
2036 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002037 if (type == &PyDict_Type) {
2038 res = save_dict(self, args);
2039 goto finally;
2040 }
2041 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002042
2043 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 if (type == &PyInstance_Type) {
2045 res = save_inst(self, args);
2046 goto finally;
2047 }
2048 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002049
2050 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 if (type == &PyClass_Type) {
2052 res = save_global(self, args, NULL);
2053 goto finally;
2054 }
2055 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002056
2057 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002058 if (type == &PyFunction_Type) {
2059 res = save_global(self, args, NULL);
2060 goto finally;
2061 }
2062 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002063
2064 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 if (type == &PyCFunction_Type) {
2066 res = save_global(self, args, NULL);
2067 goto finally;
2068 }
2069 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002071 if (PyType_IsSubtype(type, &PyType_Type)) {
2072 res = save_global(self, args, NULL);
2073 goto finally;
2074 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 if (!pers_save && self->inst_pers_func) {
2077 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2078 res = tmp;
2079 goto finally;
2080 }
2081 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2084 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 Py_INCREF(args);
2087 ARG_TUP(self, args);
2088 if (self->arg) {
2089 t = PyObject_Call(__reduce__, self->arg, NULL);
2090 FREE_ARG_TUP(self);
2091 }
2092 if (! t) goto finally;
2093 }
2094 else {
2095 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2098 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2099 if (!t)
2100 goto finally;
2101 }
2102 else {
2103 PyErr_Clear();
2104 }
2105 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 if (t) {
2108 if (PyString_Check(t)) {
2109 res = save_global(self, args, t);
2110 goto finally;
2111 }
Tim Peters84e87f32001-03-17 04:50:51 +00002112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002113 if (!PyTuple_Check(t)) {
2114 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2115 "be a tuple", "O", __reduce__);
2116 goto finally;
2117 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 if ((size != 3) && (size != 2)) {
2122 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2123 "contain only two or three elements", "O", __reduce__);
2124 goto finally;
2125 }
Tim Peters84e87f32001-03-17 04:50:51 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002131 if (size > 2) {
2132 state = PyTuple_GET_ITEM(t, 2);
2133 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2136 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2137 "returned by %s must be a tuple", "O", __reduce__);
2138 goto finally;
2139 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 res = save_reduce(self, callable, arg_tup, state, args);
2142 goto finally;
2143 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002145 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 finally:
2148 Py_XDECREF(py_ob_id);
2149 Py_XDECREF(__reduce__);
2150 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002153}
2154
2155
2156static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002157dump(Picklerobject *self, PyObject *args)
2158{
2159 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 if (save(self, args, 0) < 0)
2162 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164 if ((*self->write_func)(self, &stop, 1) < 0)
2165 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167 if ((*self->write_func)(self, NULL, 0) < 0)
2168 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002171}
2172
2173static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174Pickle_clear_memo(Picklerobject *self, PyObject *args)
2175{
2176 if (!PyArg_ParseTuple(args,":clear_memo"))
2177 return NULL;
2178 if (self->memo)
2179 PyDict_Clear(self->memo);
2180 Py_INCREF(Py_None);
2181 return Py_None;
2182}
2183
2184static PyObject *
2185Pickle_getvalue(Picklerobject *self, PyObject *args)
2186{
2187 int l, i, rsize, ssize, clear=1, lm;
2188 long ik;
2189 PyObject *k, *r;
2190 char *s, *p, *have_get;
2191 Pdata *data;
2192
2193 /* Can be called by Python code or C code */
2194 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2195 return NULL;
2196
2197 /* Check to make sure we are based on a list */
2198 if (! Pdata_Check(self->file)) {
2199 PyErr_SetString(PicklingError,
2200 "Attempt to getvalue() a non-list-based pickler");
2201 return NULL;
2202 }
2203
2204 /* flush write buffer */
2205 if (write_other(self, NULL, 0) < 0) return NULL;
2206
2207 data=(Pdata*)self->file;
2208 l=data->length;
2209
2210 /* set up an array to hold get/put status */
2211 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2212 lm++;
2213 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2214 memset(have_get,0,lm);
2215
2216 /* Scan for gets. */
2217 for (rsize=0, i=l; --i >= 0; ) {
2218 k=data->data[i];
2219
2220 if (PyString_Check(k)) {
2221 rsize += PyString_GET_SIZE(k);
2222 }
2223
2224 else if (PyInt_Check(k)) { /* put */
2225 ik=PyInt_AS_LONG((PyIntObject*)k);
2226 if (ik >= lm || ik==0) {
2227 PyErr_SetString(PicklingError,
2228 "Invalid get data");
2229 return NULL;
2230 }
2231 if (have_get[ik]) { /* with matching get */
2232 if (ik < 256) rsize += 2;
2233 else rsize+=5;
2234 }
2235 }
2236
2237 else if (! (PyTuple_Check(k) &&
2238 PyTuple_GET_SIZE(k) == 2 &&
2239 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2240 ) {
2241 PyErr_SetString(PicklingError,
2242 "Unexpected data in internal list");
2243 return NULL;
2244 }
2245
2246 else { /* put */
2247 ik=PyInt_AS_LONG((PyIntObject*)k);
2248 if (ik >= lm || ik==0) {
2249 PyErr_SetString(PicklingError,
2250 "Invalid get data");
2251 return NULL;
2252 }
2253 have_get[ik]=1;
2254 if (ik < 256) rsize += 2;
2255 else rsize+=5;
2256 }
2257
2258 }
2259
2260 /* Now generate the result */
2261 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2262 s=PyString_AS_STRING((PyStringObject*)r);
2263
2264 for (i=0; i<l; i++) {
2265 k=data->data[i];
2266
2267 if (PyString_Check(k)) {
2268 ssize=PyString_GET_SIZE(k);
2269 if (ssize) {
2270 p=PyString_AS_STRING((PyStringObject*)k);
2271 while (--ssize >= 0) *s++=*p++;
2272 }
2273 }
2274
2275 else if (PyTuple_Check(k)) { /* get */
2276 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2277 if (ik < 256) {
2278 *s++ = BINGET;
2279 *s++ = (int)(ik & 0xff);
2280 }
2281 else {
2282 *s++ = LONG_BINGET;
2283 *s++ = (int)(ik & 0xff);
2284 *s++ = (int)((ik >> 8) & 0xff);
2285 *s++ = (int)((ik >> 16) & 0xff);
2286 *s++ = (int)((ik >> 24) & 0xff);
2287 }
2288 }
2289
2290 else { /* put */
2291 ik=PyInt_AS_LONG((PyIntObject*)k);
2292
2293 if (have_get[ik]) { /* with matching get */
2294 if (ik < 256) {
2295 *s++ = BINPUT;
2296 *s++ = (int)(ik & 0xff);
2297 }
2298 else {
2299 *s++ = LONG_BINPUT;
2300 *s++ = (int)(ik & 0xff);
2301 *s++ = (int)((ik >> 8) & 0xff);
2302 *s++ = (int)((ik >> 16) & 0xff);
2303 *s++ = (int)((ik >> 24) & 0xff);
2304 }
2305 }
2306 }
2307
2308 }
2309
2310 if (clear) {
2311 PyDict_Clear(self->memo);
2312 Pdata_clear(data,0);
2313 }
2314
2315 free(have_get);
2316 return r;
2317 err:
2318 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002319 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002320}
2321
2322static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002323Pickler_dump(Picklerobject *self, PyObject *args)
2324{
2325 PyObject *ob;
2326 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2329 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 if (dump(self, ob) < 0)
2332 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 /* XXX Why does dump() return self? */
2337 Py_INCREF(self);
2338 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002339}
2340
2341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342static struct PyMethodDef Pickler_methods[] =
2343{
Neal Norwitzb0493252002-03-31 14:44:22 +00002344 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002345 "dump(object) --"
2346 "Write an object in pickle format to the object's pickle stream\n"
2347 },
Neal Norwitzb0493252002-03-31 14:44:22 +00002348 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002349 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002350 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002351 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002352 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002353};
2354
2355
2356static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357newPicklerobject(PyObject *file, int bin)
2358{
2359 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2362 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 self->fp = NULL;
2365 self->write = NULL;
2366 self->memo = NULL;
2367 self->arg = NULL;
2368 self->pers_func = NULL;
2369 self->inst_pers_func = NULL;
2370 self->write_buf = NULL;
2371 self->bin = bin;
2372 self->fast = 0;
2373 self->fast_container = 0;
2374 self->fast_memo = NULL;
2375 self->buf_size = 0;
2376 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378 if (file)
2379 Py_INCREF(file);
2380 else
2381 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 if (!( self->file = file ))
2384 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 if (!( self->memo = PyDict_New()))
2387 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002389 if (PyFile_Check(file)) {
2390 self->fp = PyFile_AsFile(file);
2391 if (self->fp == NULL) {
2392 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2393 goto err;
2394 }
2395 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002396 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 else if (PycStringIO_OutputCheck(file)) {
2398 self->write_func = write_cStringIO;
2399 }
2400 else if (file == Py_None) {
2401 self->write_func = write_none;
2402 }
2403 else {
2404 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 if (! Pdata_Check(file)) {
2407 self->write = PyObject_GetAttr(file, write_str);
2408 if (!self->write) {
2409 PyErr_Clear();
2410 PyErr_SetString(PyExc_TypeError,
2411 "argument must have 'write' "
2412 "attribute");
2413 goto err;
2414 }
2415 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 if (!( self->write_buf =
2418 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2419 PyErr_NoMemory();
2420 goto err;
2421 }
2422 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 if (PyEval_GetRestricted()) {
2425 /* Restricted execution, get private tables */
2426 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2429 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2430 Py_DECREF(m);
2431 if (!( self->dispatch_table )) goto err;
2432 }
2433 else {
2434 self->dispatch_table=dispatch_table;
2435 Py_INCREF(dispatch_table);
2436 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 err:
2441 Py_DECREF((PyObject *)self);
2442 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002443}
2444
2445
2446static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447get_Pickler(PyObject *self, PyObject *args)
2448{
2449 PyObject *file = NULL;
2450 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2453 PyErr_Clear();
2454 bin = 0;
2455 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2456 return NULL;
2457 }
2458 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002459}
2460
2461
2462static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463Pickler_dealloc(Picklerobject *self)
2464{
2465 Py_XDECREF(self->write);
2466 Py_XDECREF(self->memo);
2467 Py_XDECREF(self->fast_memo);
2468 Py_XDECREF(self->arg);
2469 Py_XDECREF(self->file);
2470 Py_XDECREF(self->pers_func);
2471 Py_XDECREF(self->inst_pers_func);
2472 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 if (self->write_buf) {
2475 free(self->write_buf);
2476 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002479}
2480
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002481static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002482Pickler_get_pers_func(Picklerobject *p)
2483{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002484 if (p->pers_func == NULL)
2485 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2486 else
2487 Py_INCREF(p->pers_func);
2488 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002489}
2490
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002491static int
2492Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2493{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 if (v == NULL) {
2495 PyErr_SetString(PyExc_TypeError,
2496 "attribute deletion is not supported");
2497 return -1;
2498 }
2499 Py_XDECREF(p->pers_func);
2500 Py_INCREF(v);
2501 p->pers_func = v;
2502 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002503}
2504
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002505static int
2506Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2507{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002508 if (v == NULL) {
2509 PyErr_SetString(PyExc_TypeError,
2510 "attribute deletion is not supported");
2511 return -1;
2512 }
2513 Py_XDECREF(p->inst_pers_func);
2514 Py_INCREF(v);
2515 p->inst_pers_func = v;
2516 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002517}
2518
2519static PyObject *
2520Pickler_get_memo(Picklerobject *p)
2521{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 if (p->memo == NULL)
2523 PyErr_SetString(PyExc_AttributeError, "memo");
2524 else
2525 Py_INCREF(p->memo);
2526 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002527}
2528
2529static int
2530Pickler_set_memo(Picklerobject *p, PyObject *v)
2531{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532 if (v == NULL) {
2533 PyErr_SetString(PyExc_TypeError,
2534 "attribute deletion is not supported");
2535 return -1;
2536 }
2537 if (!PyDict_Check(v)) {
2538 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2539 return -1;
2540 }
2541 Py_XDECREF(p->memo);
2542 Py_INCREF(v);
2543 p->memo = v;
2544 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002545}
2546
2547static PyObject *
2548Pickler_get_error(Picklerobject *p)
2549{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550 /* why is this an attribute on the Pickler? */
2551 Py_INCREF(PicklingError);
2552 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002553}
2554
2555static PyMemberDef Pickler_members[] = {
2556 {"binary", T_INT, offsetof(Picklerobject, bin)},
2557 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002558 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002559};
2560
2561static PyGetSetDef Pickler_getsets[] = {
2562 {"persistent_id", (getter)Pickler_get_pers_func,
2563 (setter)Pickler_set_pers_func},
2564 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2565 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002566 {"PicklingError", (getter)Pickler_get_error, NULL},
2567 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002568};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002569
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002570static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002571"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002572
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002573static PyTypeObject Picklertype = {
2574 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002575 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002576 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002577 sizeof(Picklerobject), /*tp_basicsize*/
2578 0,
2579 (destructor)Pickler_dealloc, /* tp_dealloc */
2580 0, /* tp_print */
2581 0, /* tp_getattr */
2582 0, /* tp_setattr */
2583 0, /* tp_compare */
2584 0, /* tp_repr */
2585 0, /* tp_as_number */
2586 0, /* tp_as_sequence */
2587 0, /* tp_as_mapping */
2588 0, /* tp_hash */
2589 0, /* tp_call */
2590 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002591 0, /* set below */ /* tp_getattro */
2592 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002593 0, /* tp_as_buffer */
2594 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2595 Picklertype__doc__, /* tp_doc */
2596 0, /* tp_traverse */
2597 0, /* tp_clear */
2598 0, /* tp_richcompare */
2599 0, /* tp_weaklistoffset */
2600 0, /* tp_iter */
2601 0, /* tp_iternext */
2602 Pickler_methods, /* tp_methods */
2603 Pickler_members, /* tp_members */
2604 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002605};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002607static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2609{
2610 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612 if (fc) {
2613 if (fc==Py_None) {
2614 PyErr_SetString(UnpicklingError,
2615 "Global and instance pickles are not supported.");
2616 return NULL;
2617 }
2618 return PyObject_CallFunction(fc, "OO", py_module_name,
2619 py_global_name);
2620 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002622 module = PySys_GetObject("modules");
2623 if (module == NULL)
2624 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626 module = PyDict_GetItem(module, py_module_name);
2627 if (module == NULL) {
2628 module = PyImport_Import(py_module_name);
2629 if (!module)
2630 return NULL;
2631 global = PyObject_GetAttr(module, py_global_name);
2632 Py_DECREF(module);
2633 }
2634 else
2635 global = PyObject_GetAttr(module, py_global_name);
2636 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002637}
2638
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002639static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640marker(Unpicklerobject *self)
2641{
2642 if (self->num_marks < 1) {
2643 PyErr_SetString(UnpicklingError, "could not find MARK");
2644 return -1;
2645 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002648}
2649
Tim Peters84e87f32001-03-17 04:50:51 +00002650
Guido van Rossum60456fd1997-04-09 17:36:32 +00002651static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652load_none(Unpicklerobject *self)
2653{
2654 PDATA_APPEND(self->stack, Py_None, -1);
2655 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656}
2657
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002658static int
Guido van Rossum77f6a652002-04-03 22:41:51 +00002659load_false(Unpicklerobject *self)
2660{
2661 PDATA_APPEND(self->stack, Py_False, -1);
2662 return 0;
2663}
2664
2665static int
2666load_true(Unpicklerobject *self)
2667{
2668 PDATA_APPEND(self->stack, Py_True, -1);
2669 return 0;
2670}
2671
2672static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673bad_readline(void)
2674{
2675 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2676 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002677}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002678
2679static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680load_int(Unpicklerobject *self)
2681{
2682 PyObject *py_int = 0;
2683 char *endptr, *s;
2684 int len, res = -1;
2685 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2688 if (len < 2) return bad_readline();
2689 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691 errno = 0;
2692 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2695 /* Hm, maybe we've got something long. Let's try reading
2696 it as a Python long object. */
2697 errno = 0;
2698 py_int = PyLong_FromString(s, NULL, 0);
2699 if (py_int == NULL) {
2700 PyErr_SetString(PyExc_ValueError,
2701 "could not convert string to int");
2702 goto finally;
2703 }
2704 }
2705 else {
2706 if (!( py_int = PyInt_FromLong(l))) goto finally;
2707 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 free(s);
2710 PDATA_PUSH(self->stack, py_int, -1);
2711 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002713 finally:
2714 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002717}
2718
2719
Tim Peters84e87f32001-03-17 04:50:51 +00002720static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721calc_binint(char *s, int x)
2722{
2723 unsigned char c;
2724 int i;
2725 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 for (i = 0, l = 0L; i < x; i++) {
2728 c = (unsigned char)s[i];
2729 l |= (long)c << (i * 8);
2730 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002731#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2733 * is signed, so on a box with longs bigger than 4 bytes we need
2734 * to extend a BININT's sign bit to the full width.
2735 */
2736 if (x == 4 && l & (1L << 31))
2737 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002738#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740}
2741
2742
2743static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744load_binintx(Unpicklerobject *self, char *s, int x)
2745{
2746 PyObject *py_int = 0;
2747 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 if (!( py_int = PyInt_FromLong(l)))
2752 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 PDATA_PUSH(self->stack, py_int, -1);
2755 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002756}
2757
2758
2759static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002760load_binint(Unpicklerobject *self)
2761{
2762 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002764 if ((*self->read_func)(self, &s, 4) < 0)
2765 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002767 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768}
2769
2770
2771static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002772load_binint1(Unpicklerobject *self)
2773{
2774 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002776 if ((*self->read_func)(self, &s, 1) < 0)
2777 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780}
2781
2782
2783static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784load_binint2(Unpicklerobject *self)
2785{
2786 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 if ((*self->read_func)(self, &s, 2) < 0)
2789 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792}
Tim Peters84e87f32001-03-17 04:50:51 +00002793
Guido van Rossum60456fd1997-04-09 17:36:32 +00002794static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002795load_long(Unpicklerobject *self)
2796{
2797 PyObject *l = 0;
2798 char *end, *s;
2799 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2802 if (len < 2) return bad_readline();
2803 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 if (!( l = PyLong_FromString(s, &end, 0)))
2806 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 free(s);
2809 PDATA_PUSH(self->stack, l, -1);
2810 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 finally:
2813 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002816}
2817
Tim Peters84e87f32001-03-17 04:50:51 +00002818
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820load_float(Unpicklerobject *self)
2821{
2822 PyObject *py_float = 0;
2823 char *endptr, *s;
2824 int len, res = -1;
2825 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002827 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2828 if (len < 2) return bad_readline();
2829 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 errno = 0;
2832 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002834 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2835 PyErr_SetString(PyExc_ValueError,
2836 "could not convert string to float");
2837 goto finally;
2838 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002840 if (!( py_float = PyFloat_FromDouble(d)))
2841 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 free(s);
2844 PDATA_PUSH(self->stack, py_float, -1);
2845 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 finally:
2848 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002851}
2852
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854load_binfloat(Unpicklerobject *self)
2855{
2856 PyObject *py_float = 0;
2857 int s, e;
2858 long fhi, flo;
2859 double x;
2860 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 if ((*self->read_func)(self, &p, 8) < 0)
2863 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865 /* First byte */
2866 s = (*p>>7) & 1;
2867 e = (*p & 0x7F) << 4;
2868 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 /* Second byte */
2871 e |= (*p>>4) & 0xF;
2872 fhi = (*p & 0xF) << 24;
2873 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875 /* Third byte */
2876 fhi |= (*p & 0xFF) << 16;
2877 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 /* Fourth byte */
2880 fhi |= (*p & 0xFF) << 8;
2881 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002883 /* Fifth byte */
2884 fhi |= *p & 0xFF;
2885 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887 /* Sixth byte */
2888 flo = (*p & 0xFF) << 16;
2889 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 /* Seventh byte */
2892 flo |= (*p & 0xFF) << 8;
2893 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 /* Eighth byte */
2896 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2899 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 /* XXX This sadly ignores Inf/NaN */
2902 if (e == 0)
2903 e = -1022;
2904 else {
2905 x += 1.0;
2906 e -= 1023;
2907 }
2908 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002910 if (s)
2911 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002913 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915 PDATA_PUSH(self->stack, py_float, -1);
2916 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002918
2919static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920load_string(Unpicklerobject *self)
2921{
2922 PyObject *str = 0;
2923 int len, res = -1, nslash;
2924 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2929 if (len < 2) return bad_readline();
2930 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932 /* Check for unquoted quotes (evil strings) */
2933 q=*s;
2934 if (q != '"' && q != '\'') goto insecure;
2935 for (p=s+1, nslash=0; *p; p++) {
2936 if (*p==q && nslash%2==0) break;
2937 if (*p=='\\') nslash++;
2938 else nslash=0;
2939 }
2940 if (*p == q) {
2941 for (p++; *p; p++)
2942 if (*(unsigned char *)p > ' ')
2943 goto insecure;
2944 }
2945 else
2946 goto insecure;
2947 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 if (!( eval_dict ))
2950 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2951 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2954 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 free(s);
2957 PDATA_PUSH(self->stack, str, -1);
2958 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 finally:
2961 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965 insecure:
2966 free(s);
2967 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2968 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002969}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002970
2971
2972static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973load_binstring(Unpicklerobject *self)
2974{
2975 PyObject *py_string = 0;
2976 long l;
2977 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 if ((*self->read_func)(self, &s, l) < 0)
2984 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 if (!( py_string = PyString_FromStringAndSize(s, l)))
2987 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 PDATA_PUSH(self->stack, py_string, -1);
2990 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002991}
2992
2993
2994static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995load_short_binstring(Unpicklerobject *self)
2996{
2997 PyObject *py_string = 0;
2998 unsigned char l;
2999 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 if ((*self->read_func)(self, &s, 1) < 0)
3002 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010 PDATA_PUSH(self->stack, py_string, -1);
3011 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003012}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
3014
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003015#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003017load_unicode(Unpicklerobject *self)
3018{
3019 PyObject *str = 0;
3020 int len, res = -1;
3021 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3024 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
3027 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029 PDATA_PUSH(self->stack, str, -1);
3030 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032 finally:
3033 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003034}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003035#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003036
3037
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003038#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003039static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003040load_binunicode(Unpicklerobject *self)
3041{
3042 PyObject *unicode;
3043 long l;
3044 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050 if ((*self->read_func)(self, &s, l) < 0)
3051 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
3054 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056 PDATA_PUSH(self->stack, unicode, -1);
3057 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003058}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003059#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003060
3061
3062static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063load_tuple(Unpicklerobject *self)
3064{
3065 PyObject *tup;
3066 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068 if ((i = marker(self)) < 0) return -1;
3069 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3070 PDATA_PUSH(self->stack, tup, -1);
3071 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072}
3073
3074static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075load_empty_tuple(Unpicklerobject *self)
3076{
3077 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 if (!( tup=PyTuple_New(0))) return -1;
3080 PDATA_PUSH(self->stack, tup, -1);
3081 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082}
3083
3084static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085load_empty_list(Unpicklerobject *self)
3086{
3087 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 if (!( list=PyList_New(0))) return -1;
3090 PDATA_PUSH(self->stack, list, -1);
3091 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092}
3093
3094static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095load_empty_dict(Unpicklerobject *self)
3096{
3097 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 if (!( dict=PyDict_New())) return -1;
3100 PDATA_PUSH(self->stack, dict, -1);
3101 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102}
3103
3104
3105static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106load_list(Unpicklerobject *self)
3107{
3108 PyObject *list = 0;
3109 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 if ((i = marker(self)) < 0) return -1;
3112 if (!( list=Pdata_popList(self->stack, i))) return -1;
3113 PDATA_PUSH(self->stack, list, -1);
3114 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003115}
3116
3117static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118load_dict(Unpicklerobject *self)
3119{
3120 PyObject *dict, *key, *value;
3121 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 if ((i = marker(self)) < 0) return -1;
3124 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 for (k = i+1; k < j; k += 2) {
3129 key =self->stack->data[k-1];
3130 value=self->stack->data[k ];
3131 if (PyDict_SetItem(dict, key, value) < 0) {
3132 Py_DECREF(dict);
3133 return -1;
3134 }
3135 }
3136 Pdata_clear(self->stack, i);
3137 PDATA_PUSH(self->stack, dict, -1);
3138 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139}
3140
3141static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142Instance_New(PyObject *cls, PyObject *args)
3143{
3144 int has_key;
3145 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147 if (PyClass_Check(cls)) {
3148 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 if ((l=PyObject_Size(args)) < 0) goto err;
3151 if (!( l )) {
3152 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 __getinitargs__ = PyObject_GetAttr(cls,
3155 __getinitargs___str);
3156 if (!__getinitargs__) {
3157 /* We have a class with no __getinitargs__,
3158 so bypass usual construction */
3159 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003161 PyErr_Clear();
3162 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3163 goto err;
3164 return inst;
3165 }
3166 Py_DECREF(__getinitargs__);
3167 }
Tim Peters84e87f32001-03-17 04:50:51 +00003168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169 if ((r=PyInstance_New(cls, args, NULL))) return r;
3170 else goto err;
3171 }
Tim Peters84e87f32001-03-17 04:50:51 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 /* Is safe_constructors always a dict? */
3174 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3175 if (!has_key) {
3176 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3177 if (!safe ||
3178 !PyObject_IsTrue(safe)) {
3179 cPickle_ErrFormat(UnpicklingError,
3180 "%s is not safe for unpickling",
3181 "O", cls);
3182 Py_XDECREF(safe);
3183 return NULL;
3184 }
3185 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 if (args==Py_None) {
3188 /* Special case, call cls.__basicnew__() */
3189 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3192 if (!basicnew) return NULL;
3193 r=PyObject_CallObject(basicnew, NULL);
3194 Py_DECREF(basicnew);
3195 if (r) return r;
3196 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 err:
3201 {
3202 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 PyErr_Fetch(&tp, &v, &tb);
3205 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3206 Py_XDECREF(v);
3207 v=r;
3208 }
3209 PyErr_Restore(tp,v,tb);
3210 }
3211 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212}
Tim Peters84e87f32001-03-17 04:50:51 +00003213
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
3215static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216load_obj(Unpicklerobject *self)
3217{
3218 PyObject *class, *tup, *obj=0;
3219 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221 if ((i = marker(self)) < 0) return -1;
3222 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3223 PDATA_POP(self->stack, class);
3224 if (class) {
3225 obj = Instance_New(class, tup);
3226 Py_DECREF(class);
3227 }
3228 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 if (! obj) return -1;
3231 PDATA_PUSH(self->stack, obj, -1);
3232 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233}
3234
3235
3236static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237load_inst(Unpicklerobject *self)
3238{
3239 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3240 int i, len;
3241 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3246 if (len < 2) return bad_readline();
3247 module_name = PyString_FromStringAndSize(s, len - 1);
3248 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003250 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3251 if (len < 2) return bad_readline();
3252 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3253 class = find_class(module_name, class_name,
3254 self->find_class);
3255 Py_DECREF(class_name);
3256 }
3257 }
3258 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003260 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262 if ((tup=Pdata_popTuple(self->stack, i))) {
3263 obj = Instance_New(class, tup);
3264 Py_DECREF(tup);
3265 }
3266 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003268 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 PDATA_PUSH(self->stack, obj, -1);
3271 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003272}
3273
3274
3275static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276load_global(Unpicklerobject *self)
3277{
3278 PyObject *class = 0, *module_name = 0, *class_name = 0;
3279 int len;
3280 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3283 if (len < 2) return bad_readline();
3284 module_name = PyString_FromStringAndSize(s, len - 1);
3285 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003287 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3288 if (len < 2) return bad_readline();
3289 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3290 class = find_class(module_name, class_name,
3291 self->find_class);
3292 Py_DECREF(class_name);
3293 }
3294 }
3295 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003297 if (! class) return -1;
3298 PDATA_PUSH(self->stack, class, -1);
3299 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003300}
3301
3302
3303static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304load_persid(Unpicklerobject *self)
3305{
3306 PyObject *pid = 0;
3307 int len;
3308 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310 if (self->pers_func) {
3311 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3312 if (len < 2) return bad_readline();
3313
3314 pid = PyString_FromStringAndSize(s, len - 1);
3315 if (!pid) return -1;
3316
3317 if (PyList_Check(self->pers_func)) {
3318 if (PyList_Append(self->pers_func, pid) < 0) {
3319 Py_DECREF(pid);
3320 return -1;
3321 }
3322 }
3323 else {
3324 ARG_TUP(self, pid);
3325 if (self->arg) {
3326 pid = PyObject_Call(self->pers_func, self->arg,
3327 NULL);
3328 FREE_ARG_TUP(self);
3329 }
3330 }
3331
3332 if (! pid) return -1;
3333
3334 PDATA_PUSH(self->stack, pid, -1);
3335 return 0;
3336 }
3337 else {
3338 PyErr_SetString(UnpicklingError,
3339 "A load persistent id instruction was encountered,\n"
3340 "but no persistent_load function was specified.");
3341 return -1;
3342 }
3343}
3344
3345static int
3346load_binpersid(Unpicklerobject *self)
3347{
3348 PyObject *pid = 0;
3349
3350 if (self->pers_func) {
3351 PDATA_POP(self->stack, pid);
3352 if (! pid) return -1;
3353
3354 if (PyList_Check(self->pers_func)) {
3355 if (PyList_Append(self->pers_func, pid) < 0) {
3356 Py_DECREF(pid);
3357 return -1;
3358 }
3359 }
3360 else {
3361 ARG_TUP(self, pid);
3362 if (self->arg) {
3363 pid = PyObject_Call(self->pers_func, self->arg,
3364 NULL);
3365 FREE_ARG_TUP(self);
3366 }
3367 if (! pid) return -1;
3368 }
3369
3370 PDATA_PUSH(self->stack, pid, -1);
3371 return 0;
3372 }
3373 else {
3374 PyErr_SetString(UnpicklingError,
3375 "A load persistent id instruction was encountered,\n"
3376 "but no persistent_load function was specified.");
3377 return -1;
3378 }
3379}
3380
3381
3382static int
3383load_pop(Unpicklerobject *self)
3384{
3385 int len;
3386
3387 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3388
3389 /* Note that we split the (pickle.py) stack into two stacks,
3390 an object stack and a mark stack. We have to be clever and
3391 pop the right one. We do this by looking at the top of the
3392 mark stack.
3393 */
3394
3395 if ((self->num_marks > 0) &&
3396 (self->marks[self->num_marks - 1] == len))
3397 self->num_marks--;
3398 else {
3399 len--;
3400 Py_DECREF(self->stack->data[len]);
3401 self->stack->length=len;
3402 }
3403
3404 return 0;
3405}
3406
3407
3408static int
3409load_pop_mark(Unpicklerobject *self)
3410{
3411 int i;
3412
3413 if ((i = marker(self)) < 0)
3414 return -1;
3415
3416 Pdata_clear(self->stack, i);
3417
3418 return 0;
3419}
3420
3421
3422static int
3423load_dup(Unpicklerobject *self)
3424{
3425 PyObject *last;
3426 int len;
3427
3428 if ((len = self->stack->length) <= 0) return stackUnderflow();
3429 last=self->stack->data[len-1];
3430 Py_INCREF(last);
3431 PDATA_PUSH(self->stack, last, -1);
3432 return 0;
3433}
3434
3435
3436static int
3437load_get(Unpicklerobject *self)
3438{
3439 PyObject *py_str = 0, *value = 0;
3440 int len;
3441 char *s;
3442 int rc;
3443
3444 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003445 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003449 value = PyDict_GetItem(self->memo, py_str);
3450 if (! value) {
3451 PyErr_SetObject(BadPickleGet, py_str);
3452 rc = -1;
3453 } else {
3454 PDATA_APPEND(self->stack, value, -1);
3455 rc = 0;
3456 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458 Py_DECREF(py_str);
3459 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460}
3461
3462
3463static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464load_binget(Unpicklerobject *self)
3465{
3466 PyObject *py_key = 0, *value = 0;
3467 unsigned char key;
3468 char *s;
3469 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473 key = (unsigned char)s[0];
3474 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 value = PyDict_GetItem(self->memo, py_key);
3477 if (! value) {
3478 PyErr_SetObject(BadPickleGet, py_key);
3479 rc = -1;
3480 } else {
3481 PDATA_APPEND(self->stack, value, -1);
3482 rc = 0;
3483 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 Py_DECREF(py_key);
3486 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487}
3488
3489
3490static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491load_long_binget(Unpicklerobject *self)
3492{
3493 PyObject *py_key = 0, *value = 0;
3494 unsigned char c;
3495 char *s;
3496 long key;
3497 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501 c = (unsigned char)s[0];
3502 key = (long)c;
3503 c = (unsigned char)s[1];
3504 key |= (long)c << 8;
3505 c = (unsigned char)s[2];
3506 key |= (long)c << 16;
3507 c = (unsigned char)s[3];
3508 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3511
3512 value = PyDict_GetItem(self->memo, py_key);
3513 if (! value) {
3514 PyErr_SetObject(BadPickleGet, py_key);
3515 rc = -1;
3516 } else {
3517 PDATA_APPEND(self->stack, value, -1);
3518 rc = 0;
3519 }
3520
3521 Py_DECREF(py_key);
3522 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003523}
3524
3525
3526static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527load_put(Unpicklerobject *self)
3528{
3529 PyObject *py_str = 0, *value = 0;
3530 int len, l;
3531 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3534 if (l < 2) return bad_readline();
3535 if (!( len=self->stack->length )) return stackUnderflow();
3536 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3537 value=self->stack->data[len-1];
3538 l=PyDict_SetItem(self->memo, py_str, value);
3539 Py_DECREF(py_str);
3540 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541}
3542
3543
3544static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545load_binput(Unpicklerobject *self)
3546{
3547 PyObject *py_key = 0, *value = 0;
3548 unsigned char key;
3549 char *s;
3550 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3553 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003557 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3558 value=self->stack->data[len-1];
3559 len=PyDict_SetItem(self->memo, py_key, value);
3560 Py_DECREF(py_key);
3561 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562}
3563
3564
3565static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566load_long_binput(Unpicklerobject *self)
3567{
3568 PyObject *py_key = 0, *value = 0;
3569 long key;
3570 unsigned char c;
3571 char *s;
3572 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003574 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3575 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003577 c = (unsigned char)s[0];
3578 key = (long)c;
3579 c = (unsigned char)s[1];
3580 key |= (long)c << 8;
3581 c = (unsigned char)s[2];
3582 key |= (long)c << 16;
3583 c = (unsigned char)s[3];
3584 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586 if (!( py_key = PyInt_FromLong(key))) return -1;
3587 value=self->stack->data[len-1];
3588 len=PyDict_SetItem(self->memo, py_key, value);
3589 Py_DECREF(py_key);
3590 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591}
3592
3593
3594static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595do_append(Unpicklerobject *self, int x)
3596{
3597 PyObject *value = 0, *list = 0, *append_method = 0;
3598 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003600 len=self->stack->length;
3601 if (!( len >= x && x > 0 )) return stackUnderflow();
3602 /* nothing to do */
3603 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 if (PyList_Check(list)) {
3608 PyObject *slice;
3609 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003611 slice=Pdata_popList(self->stack, x);
3612 list_len = PyList_GET_SIZE(list);
3613 i=PyList_SetSlice(list, list_len, list_len, slice);
3614 Py_DECREF(slice);
3615 return i;
3616 }
3617 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 if (!( append_method = PyObject_GetAttr(list, append_str)))
3620 return -1;
3621
3622 for (i = x; i < len; i++) {
3623 PyObject *junk;
3624
3625 value=self->stack->data[i];
3626 junk=0;
3627 ARG_TUP(self, value);
3628 if (self->arg) {
3629 junk = PyObject_Call(append_method, self->arg,
3630 NULL);
3631 FREE_ARG_TUP(self);
3632 }
3633 if (! junk) {
3634 Pdata_clear(self->stack, i+1);
3635 self->stack->length=x;
3636 Py_DECREF(append_method);
3637 return -1;
3638 }
3639 Py_DECREF(junk);
3640 }
3641 self->stack->length=x;
3642 Py_DECREF(append_method);
3643 }
3644
3645 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646}
3647
3648
3649static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003650load_append(Unpicklerobject *self)
3651{
3652 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003653}
3654
3655
3656static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657load_appends(Unpicklerobject *self)
3658{
3659 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660}
3661
3662
3663static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003664do_setitems(Unpicklerobject *self, int x)
3665{
3666 PyObject *value = 0, *key = 0, *dict = 0;
3667 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669 if (!( (len=self->stack->length) >= x
3670 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003672 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003674 for (i = x+1; i < len; i += 2) {
3675 key =self->stack->data[i-1];
3676 value=self->stack->data[i ];
3677 if (PyObject_SetItem(dict, key, value) < 0) {
3678 r=-1;
3679 break;
3680 }
3681 }
3682
3683 Pdata_clear(self->stack, x);
3684
3685 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686}
3687
3688
Tim Peters84e87f32001-03-17 04:50:51 +00003689static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690load_setitem(Unpicklerobject *self)
3691{
3692 return do_setitems(self, self->stack->length - 2);
3693}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695static int
3696load_setitems(Unpicklerobject *self)
3697{
3698 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003699}
3700
Tim Peters84e87f32001-03-17 04:50:51 +00003701
Guido van Rossum60456fd1997-04-09 17:36:32 +00003702static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703load_build(Unpicklerobject *self)
3704{
3705 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3706 *junk = 0, *__setstate__ = 0;
3707 int i, r = 0;
3708
3709 if (self->stack->length < 2) return stackUnderflow();
3710 PDATA_POP(self->stack, value);
3711 if (! value) return -1;
3712 inst=self->stack->data[self->stack->length-1];
3713
3714 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3715 ARG_TUP(self, value);
3716 if (self->arg) {
3717 junk = PyObject_Call(__setstate__, self->arg, NULL);
3718 FREE_ARG_TUP(self);
3719 }
3720 Py_DECREF(__setstate__);
3721 if (! junk) return -1;
3722 Py_DECREF(junk);
3723 return 0;
3724 }
3725
3726 PyErr_Clear();
3727 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3728 i = 0;
3729 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3730 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3731 r=-1;
3732 break;
3733 }
3734 }
3735 Py_DECREF(instdict);
3736 }
3737 else r=-1;
3738
3739 Py_XDECREF(value);
3740
3741 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742}
3743
3744
3745static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746load_mark(Unpicklerobject *self)
3747{
3748 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003750 /* Note that we split the (pickle.py) stack into two stacks, an
3751 object stack and a mark stack. Here we push a mark onto the
3752 mark stack.
3753 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003755 if ((self->num_marks + 1) >= self->marks_size) {
3756 s=self->marks_size+20;
3757 if (s <= self->num_marks) s=self->num_marks + 1;
3758 if (self->marks == NULL)
3759 self->marks=(int *)malloc(s * sizeof(int));
3760 else
3761 self->marks=(int *)realloc(self->marks,
3762 s * sizeof(int));
3763 if (! self->marks) {
3764 PyErr_NoMemory();
3765 return -1;
3766 }
3767 self->marks_size = s;
3768 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773}
3774
Guido van Rossum60456fd1997-04-09 17:36:32 +00003775static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003776load_reduce(Unpicklerobject *self)
3777{
3778 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 PDATA_POP(self->stack, arg_tup);
3781 if (! arg_tup) return -1;
3782 PDATA_POP(self->stack, callable);
3783 if (callable) {
3784 ob = Instance_New(callable, arg_tup);
3785 Py_DECREF(callable);
3786 }
3787 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003791 PDATA_PUSH(self->stack, ob, -1);
3792 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003793}
Tim Peters84e87f32001-03-17 04:50:51 +00003794
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003796load(Unpicklerobject *self)
3797{
3798 PyObject *err = 0, *val = 0;
3799 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801 self->num_marks = 0;
3802 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 while (1) {
3805 if ((*self->read_func)(self, &s, 1) < 0)
3806 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 switch (s[0]) {
3809 case NONE:
3810 if (load_none(self) < 0)
3811 break;
3812 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003813
Guido van Rossum77f6a652002-04-03 22:41:51 +00003814 case FALSE:
3815 if (load_false(self) < 0)
3816 break;
3817 continue;
3818
3819 case TRUE:
3820 if (load_true(self) < 0)
3821 break;
3822 continue;
3823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 case BININT:
3825 if (load_binint(self) < 0)
3826 break;
3827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 case BININT1:
3830 if (load_binint1(self) < 0)
3831 break;
3832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 case BININT2:
3835 if (load_binint2(self) < 0)
3836 break;
3837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 case INT:
3840 if (load_int(self) < 0)
3841 break;
3842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 case LONG:
3845 if (load_long(self) < 0)
3846 break;
3847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 case FLOAT:
3850 if (load_float(self) < 0)
3851 break;
3852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 case BINFLOAT:
3855 if (load_binfloat(self) < 0)
3856 break;
3857 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 case BINSTRING:
3860 if (load_binstring(self) < 0)
3861 break;
3862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 case SHORT_BINSTRING:
3865 if (load_short_binstring(self) < 0)
3866 break;
3867 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003869 case STRING:
3870 if (load_string(self) < 0)
3871 break;
3872 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003874#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 case UNICODE:
3876 if (load_unicode(self) < 0)
3877 break;
3878 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 case BINUNICODE:
3881 if (load_binunicode(self) < 0)
3882 break;
3883 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003884#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 case EMPTY_TUPLE:
3887 if (load_empty_tuple(self) < 0)
3888 break;
3889 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891 case TUPLE:
3892 if (load_tuple(self) < 0)
3893 break;
3894 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896 case EMPTY_LIST:
3897 if (load_empty_list(self) < 0)
3898 break;
3899 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901 case LIST:
3902 if (load_list(self) < 0)
3903 break;
3904 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906 case EMPTY_DICT:
3907 if (load_empty_dict(self) < 0)
3908 break;
3909 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911 case DICT:
3912 if (load_dict(self) < 0)
3913 break;
3914 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 case OBJ:
3917 if (load_obj(self) < 0)
3918 break;
3919 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 case INST:
3922 if (load_inst(self) < 0)
3923 break;
3924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 case GLOBAL:
3927 if (load_global(self) < 0)
3928 break;
3929 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 case APPEND:
3932 if (load_append(self) < 0)
3933 break;
3934 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936 case APPENDS:
3937 if (load_appends(self) < 0)
3938 break;
3939 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003941 case BUILD:
3942 if (load_build(self) < 0)
3943 break;
3944 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946 case DUP:
3947 if (load_dup(self) < 0)
3948 break;
3949 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 case BINGET:
3952 if (load_binget(self) < 0)
3953 break;
3954 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956 case LONG_BINGET:
3957 if (load_long_binget(self) < 0)
3958 break;
3959 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 case GET:
3962 if (load_get(self) < 0)
3963 break;
3964 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966 case MARK:
3967 if (load_mark(self) < 0)
3968 break;
3969 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 case BINPUT:
3972 if (load_binput(self) < 0)
3973 break;
3974 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976 case LONG_BINPUT:
3977 if (load_long_binput(self) < 0)
3978 break;
3979 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981 case PUT:
3982 if (load_put(self) < 0)
3983 break;
3984 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003986 case POP:
3987 if (load_pop(self) < 0)
3988 break;
3989 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991 case POP_MARK:
3992 if (load_pop_mark(self) < 0)
3993 break;
3994 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996 case SETITEM:
3997 if (load_setitem(self) < 0)
3998 break;
3999 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 case SETITEMS:
4002 if (load_setitems(self) < 0)
4003 break;
4004 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004006 case STOP:
4007 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 case PERSID:
4010 if (load_persid(self) < 0)
4011 break;
4012 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 case BINPERSID:
4015 if (load_binpersid(self) < 0)
4016 break;
4017 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 case REDUCE:
4020 if (load_reduce(self) < 0)
4021 break;
4022 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024 case '\0':
4025 /* end of file */
4026 PyErr_SetNone(PyExc_EOFError);
4027 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00004028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004029 default:
4030 cPickle_ErrFormat(UnpicklingError,
4031 "invalid load key, '%s'.",
4032 "c", s[0]);
4033 return NULL;
4034 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004036 break;
4037 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 if ((err = PyErr_Occurred())) {
4040 if (err == PyExc_EOFError) {
4041 PyErr_SetNone(PyExc_EOFError);
4042 }
4043 return NULL;
4044 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 PDATA_POP(self->stack, val);
4047 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004048}
Tim Peters84e87f32001-03-17 04:50:51 +00004049
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004051/* No-load functions to support noload, which is used to
4052 find persistent references. */
4053
4054static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055noload_obj(Unpicklerobject *self)
4056{
4057 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 if ((i = marker(self)) < 0) return -1;
4060 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004061}
4062
4063
4064static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065noload_inst(Unpicklerobject *self)
4066{
4067 int i;
4068 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 if ((i = marker(self)) < 0) return -1;
4071 Pdata_clear(self->stack, i);
4072 if ((*self->readline_func)(self, &s) < 0) return -1;
4073 if ((*self->readline_func)(self, &s) < 0) return -1;
4074 PDATA_APPEND(self->stack, Py_None,-1);
4075 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004076}
4077
4078static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004079noload_global(Unpicklerobject *self)
4080{
4081 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004083 if ((*self->readline_func)(self, &s) < 0) return -1;
4084 if ((*self->readline_func)(self, &s) < 0) return -1;
4085 PDATA_APPEND(self->stack, Py_None,-1);
4086 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004087}
4088
4089static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090noload_reduce(Unpicklerobject *self)
4091{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 if (self->stack->length < 2) return stackUnderflow();
4094 Pdata_clear(self->stack, self->stack->length-2);
4095 PDATA_APPEND(self->stack, Py_None,-1);
4096 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004097}
4098
4099static int
4100noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004101
Guido van Rossum053b8df1998-11-25 16:18:00 +00004102 if (self->stack->length < 1) return stackUnderflow();
4103 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004104 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004105}
4106
4107
4108static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109noload(Unpicklerobject *self)
4110{
4111 PyObject *err = 0, *val = 0;
4112 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 self->num_marks = 0;
4115 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 while (1) {
4118 if ((*self->read_func)(self, &s, 1) < 0)
4119 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 switch (s[0]) {
4122 case NONE:
4123 if (load_none(self) < 0)
4124 break;
4125 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case BININT:
4128 if (load_binint(self) < 0)
4129 break;
4130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case BININT1:
4133 if (load_binint1(self) < 0)
4134 break;
4135 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case BININT2:
4138 if (load_binint2(self) < 0)
4139 break;
4140 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case INT:
4143 if (load_int(self) < 0)
4144 break;
4145 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case LONG:
4148 if (load_long(self) < 0)
4149 break;
4150 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case FLOAT:
4153 if (load_float(self) < 0)
4154 break;
4155 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case BINFLOAT:
4158 if (load_binfloat(self) < 0)
4159 break;
4160 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case BINSTRING:
4163 if (load_binstring(self) < 0)
4164 break;
4165 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case SHORT_BINSTRING:
4168 if (load_short_binstring(self) < 0)
4169 break;
4170 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 case STRING:
4173 if (load_string(self) < 0)
4174 break;
4175 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004176
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004177#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 case UNICODE:
4179 if (load_unicode(self) < 0)
4180 break;
4181 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 case BINUNICODE:
4184 if (load_binunicode(self) < 0)
4185 break;
4186 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004187#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case EMPTY_TUPLE:
4190 if (load_empty_tuple(self) < 0)
4191 break;
4192 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case TUPLE:
4195 if (load_tuple(self) < 0)
4196 break;
4197 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case EMPTY_LIST:
4200 if (load_empty_list(self) < 0)
4201 break;
4202 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 case LIST:
4205 if (load_list(self) < 0)
4206 break;
4207 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 case EMPTY_DICT:
4210 if (load_empty_dict(self) < 0)
4211 break;
4212 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case DICT:
4215 if (load_dict(self) < 0)
4216 break;
4217 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case OBJ:
4220 if (noload_obj(self) < 0)
4221 break;
4222 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 case INST:
4225 if (noload_inst(self) < 0)
4226 break;
4227 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 case GLOBAL:
4230 if (noload_global(self) < 0)
4231 break;
4232 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 case APPEND:
4235 if (load_append(self) < 0)
4236 break;
4237 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 case APPENDS:
4240 if (load_appends(self) < 0)
4241 break;
4242 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244 case BUILD:
4245 if (noload_build(self) < 0)
4246 break;
4247 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004249 case DUP:
4250 if (load_dup(self) < 0)
4251 break;
4252 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 case BINGET:
4255 if (load_binget(self) < 0)
4256 break;
4257 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 case LONG_BINGET:
4260 if (load_long_binget(self) < 0)
4261 break;
4262 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264 case GET:
4265 if (load_get(self) < 0)
4266 break;
4267 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004269 case MARK:
4270 if (load_mark(self) < 0)
4271 break;
4272 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004274 case BINPUT:
4275 if (load_binput(self) < 0)
4276 break;
4277 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 case LONG_BINPUT:
4280 if (load_long_binput(self) < 0)
4281 break;
4282 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284 case PUT:
4285 if (load_put(self) < 0)
4286 break;
4287 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 case POP:
4290 if (load_pop(self) < 0)
4291 break;
4292 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004294 case POP_MARK:
4295 if (load_pop_mark(self) < 0)
4296 break;
4297 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 case SETITEM:
4300 if (load_setitem(self) < 0)
4301 break;
4302 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 case SETITEMS:
4305 if (load_setitems(self) < 0)
4306 break;
4307 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309 case STOP:
4310 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 case PERSID:
4313 if (load_persid(self) < 0)
4314 break;
4315 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 case BINPERSID:
4318 if (load_binpersid(self) < 0)
4319 break;
4320 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322 case REDUCE:
4323 if (noload_reduce(self) < 0)
4324 break;
4325 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 default:
4328 cPickle_ErrFormat(UnpicklingError,
4329 "invalid load key, '%s'.",
4330 "c", s[0]);
4331 return NULL;
4332 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 break;
4335 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 if ((err = PyErr_Occurred())) {
4338 if (err == PyExc_EOFError) {
4339 PyErr_SetNone(PyExc_EOFError);
4340 }
4341 return NULL;
4342 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004344 PDATA_POP(self->stack, val);
4345 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004346}
Tim Peters84e87f32001-03-17 04:50:51 +00004347
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004348
Guido van Rossum60456fd1997-04-09 17:36:32 +00004349static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350Unpickler_load(Unpicklerobject *self, PyObject *args)
4351{
4352 if (!( PyArg_ParseTuple(args, ":load")))
4353 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356}
4357
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004358static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359Unpickler_noload(Unpicklerobject *self, PyObject *args)
4360{
4361 if (!( PyArg_ParseTuple(args, ":noload")))
4362 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004365}
4366
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
4368static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004369 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004370 "load() -- Load a pickle"
4371 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004372 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004373 "noload() -- not load a pickle, but go through most of the motions\n"
4374 "\n"
4375 "This function can be used to read past a pickle without instantiating\n"
4376 "any objects or importing any modules. It can also be used to find all\n"
4377 "persistent references without instantiating any objects or importing\n"
4378 "any modules.\n"
4379 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380 {NULL, NULL} /* sentinel */
4381};
4382
4383
4384static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385newUnpicklerobject(PyObject *f)
4386{
4387 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4390 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 self->file = NULL;
4393 self->arg = NULL;
4394 self->stack = (Pdata*)Pdata_New();
4395 self->pers_func = NULL;
4396 self->last_string = NULL;
4397 self->marks = NULL;
4398 self->num_marks = 0;
4399 self->marks_size = 0;
4400 self->buf_size = 0;
4401 self->read = NULL;
4402 self->readline = NULL;
4403 self->safe_constructors = NULL;
4404 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 if (!( self->memo = PyDict_New()))
4407 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409 Py_INCREF(f);
4410 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004412 /* Set read, readline based on type of f */
4413 if (PyFile_Check(f)) {
4414 self->fp = PyFile_AsFile(f);
4415 if (self->fp == NULL) {
4416 PyErr_SetString(PyExc_ValueError,
4417 "I/O operation on closed file");
4418 goto err;
4419 }
4420 self->read_func = read_file;
4421 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004422 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 else if (PycStringIO_InputCheck(f)) {
4424 self->fp = NULL;
4425 self->read_func = read_cStringIO;
4426 self->readline_func = readline_cStringIO;
4427 }
4428 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004430 self->fp = NULL;
4431 self->read_func = read_other;
4432 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4435 (self->read = PyObject_GetAttr(f, read_str)))) {
4436 PyErr_Clear();
4437 PyErr_SetString( PyExc_TypeError,
4438 "argument must have 'read' and "
4439 "'readline' attributes" );
4440 goto err;
4441 }
4442 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 if (PyEval_GetRestricted()) {
4445 /* Restricted execution, get private tables */
4446 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4449 self->safe_constructors=PyObject_GetAttr(m,
4450 safe_constructors_str);
4451 Py_DECREF(m);
4452 if (!( self->safe_constructors )) goto err;
4453 }
4454 else {
4455 self->safe_constructors=safe_constructors;
4456 Py_INCREF(safe_constructors);
4457 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 err:
4462 Py_DECREF((PyObject *)self);
4463 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004464}
4465
4466
4467static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468get_Unpickler(PyObject *self, PyObject *args)
4469{
4470 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4473 return NULL;
4474 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004476
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004477
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479Unpickler_dealloc(Unpicklerobject *self)
4480{
4481 Py_XDECREF(self->readline);
4482 Py_XDECREF(self->read);
4483 Py_XDECREF(self->file);
4484 Py_XDECREF(self->memo);
4485 Py_XDECREF(self->stack);
4486 Py_XDECREF(self->pers_func);
4487 Py_XDECREF(self->arg);
4488 Py_XDECREF(self->last_string);
4489 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 if (self->marks) {
4492 free(self->marks);
4493 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 if (self->buf_size) {
4496 free(self->buf);
4497 }
Tim Peters84e87f32001-03-17 04:50:51 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004500}
4501
4502
4503static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504Unpickler_getattr(Unpicklerobject *self, char *name)
4505{
4506 if (!strcmp(name, "persistent_load")) {
4507 if (!self->pers_func) {
4508 PyErr_SetString(PyExc_AttributeError, name);
4509 return NULL;
4510 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 Py_INCREF(self->pers_func);
4513 return self->pers_func;
4514 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516 if (!strcmp(name, "find_global")) {
4517 if (!self->find_class) {
4518 PyErr_SetString(PyExc_AttributeError, name);
4519 return NULL;
4520 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 Py_INCREF(self->find_class);
4523 return self->find_class;
4524 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 if (!strcmp(name, "memo")) {
4527 if (!self->memo) {
4528 PyErr_SetString(PyExc_AttributeError, name);
4529 return NULL;
4530 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 Py_INCREF(self->memo);
4533 return self->memo;
4534 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 if (!strcmp(name, "UnpicklingError")) {
4537 Py_INCREF(UnpicklingError);
4538 return UnpicklingError;
4539 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004542}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004543
Guido van Rossum60456fd1997-04-09 17:36:32 +00004544
4545static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4547{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 if (!strcmp(name, "persistent_load")) {
4550 Py_XDECREF(self->pers_func);
4551 self->pers_func = value;
4552 Py_XINCREF(value);
4553 return 0;
4554 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 if (!strcmp(name, "find_global")) {
4557 Py_XDECREF(self->find_class);
4558 self->find_class = value;
4559 Py_XINCREF(value);
4560 return 0;
4561 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 if (! value) {
4564 PyErr_SetString(PyExc_TypeError,
4565 "attribute deletion is not supported");
4566 return -1;
4567 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 if (strcmp(name, "memo") == 0) {
4570 if (!PyDict_Check(value)) {
4571 PyErr_SetString(PyExc_TypeError,
4572 "memo must be a dictionary");
4573 return -1;
4574 }
4575 Py_XDECREF(self->memo);
4576 self->memo = value;
4577 Py_INCREF(value);
4578 return 0;
4579 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 PyErr_SetString(PyExc_AttributeError, name);
4582 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004583}
4584
4585
4586static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587cpm_dump(PyObject *self, PyObject *args)
4588{
4589 PyObject *ob, *file, *res = NULL;
4590 Picklerobject *pickler = 0;
4591 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4594 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 if (!( pickler = newPicklerobject(file, bin)))
4597 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004599 if (dump(pickler, ob) < 0)
4600 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 Py_INCREF(Py_None);
4603 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 finally:
4606 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004609}
4610
4611
4612static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613cpm_dumps(PyObject *self, PyObject *args)
4614{
4615 PyObject *ob, *file = 0, *res = NULL;
4616 Picklerobject *pickler = 0;
4617 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4620 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 if (!( file = PycStringIO->NewOutput(128)))
4623 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004625 if (!( pickler = newPicklerobject(file, bin)))
4626 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 if (dump(pickler, ob) < 0)
4629 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004631 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 finally:
4634 Py_XDECREF(pickler);
4635 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004638}
4639
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004640
4641static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642cpm_load(PyObject *self, PyObject *args)
4643{
4644 Unpicklerobject *unpickler = 0;
4645 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004647 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4648 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004650 if (!( unpickler = newUnpicklerobject(ob)))
4651 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004653 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004655 finally:
4656 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004659}
4660
4661
4662static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663cpm_loads(PyObject *self, PyObject *args)
4664{
4665 PyObject *ob, *file = 0, *res = NULL;
4666 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4669 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 if (!( file = PycStringIO->NewInput(ob)))
4672 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 if (!( unpickler = newUnpicklerobject(file)))
4675 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 finally:
4680 Py_XDECREF(file);
4681 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004684}
4685
4686
Tim Peters84e87f32001-03-17 04:50:51 +00004687static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004688"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004689
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004690static PyTypeObject Unpicklertype = {
4691 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004692 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004693 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694 sizeof(Unpicklerobject), /*tp_basicsize*/
4695 0, /*tp_itemsize*/
4696 /* methods */
4697 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4698 (printfunc)0, /*tp_print*/
4699 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4700 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4701 (cmpfunc)0, /*tp_compare*/
4702 (reprfunc)0, /*tp_repr*/
4703 0, /*tp_as_number*/
4704 0, /*tp_as_sequence*/
4705 0, /*tp_as_mapping*/
4706 (hashfunc)0, /*tp_hash*/
4707 (ternaryfunc)0, /*tp_call*/
4708 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004709
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710 /* Space for future expansion */
4711 0L,0L,0L,0L,
4712 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004713};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004714
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004716 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004717 "dump(object, file, [binary]) --"
4718 "Write an object in pickle format to the given file\n"
4719 "\n"
4720 "If the optional argument, binary, is provided and is true, then the\n"
4721 "pickle will be written in binary format, which is more space and\n"
4722 "computationally efficient. \n"
4723 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004724 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004725 "dumps(object, [binary]) --"
4726 "Return a string containing an object in pickle format\n"
4727 "\n"
4728 "If the optional argument, binary, is provided and is true, then the\n"
4729 "pickle will be written in binary format, which is more space and\n"
4730 "computationally efficient. \n"
4731 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004732 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004733 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004734 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004735 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004736 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004737 "Pickler(file, [binary]) -- Create a pickler\n"
4738 "\n"
4739 "If the optional argument, binary, is provided and is true, then\n"
4740 "pickles will be written in binary format, which is more space and\n"
4741 "computationally efficient. \n"
4742 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004743 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004744 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004745 { NULL, NULL }
4746};
4747
Guido van Rossum60456fd1997-04-09 17:36:32 +00004748static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749init_stuff(PyObject *module_dict)
4750{
4751 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004752
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004753#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 INIT_STR(__class__);
4756 INIT_STR(__getinitargs__);
4757 INIT_STR(__dict__);
4758 INIT_STR(__getstate__);
4759 INIT_STR(__setstate__);
4760 INIT_STR(__name__);
4761 INIT_STR(__main__);
4762 INIT_STR(__reduce__);
4763 INIT_STR(write);
4764 INIT_STR(__safe_for_unpickling__);
4765 INIT_STR(append);
4766 INIT_STR(read);
4767 INIT_STR(readline);
4768 INIT_STR(copy_reg);
4769 INIT_STR(dispatch_table);
4770 INIT_STR(safe_constructors);
4771 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4774 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 /* These next few are special because we want to use different
4777 ones in restricted mode. */
4778 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4779 if (!dispatch_table)
4780 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4783 safe_constructors_str)))
4784 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 if (!( empty_tuple = PyTuple_New(0)))
4791 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 /* Ugh */
4794 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4795 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4796 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 if (!( t=PyDict_New())) return -1;
4799 if (!( r=PyRun_String(
4800 "def __init__(self, *args): self.args=args\n\n"
4801 "def __str__(self):\n"
4802 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4803 Py_file_input,
4804 module_dict, t) )) return -1;
4805 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4808 if (!PickleError)
4809 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 PicklingError = PyErr_NewException("cPickle.PicklingError",
4814 PickleError, NULL);
4815 if (!PicklingError)
4816 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 if (!( t=PyDict_New())) return -1;
4819 if (!( r=PyRun_String(
4820 "def __init__(self, *args): self.args=args\n\n"
4821 "def __str__(self):\n"
4822 " a=self.args\n"
4823 " a=a and type(a[0]) or '(what)'\n"
4824 " return 'Cannot pickle %s objects' % a\n"
4825 , Py_file_input,
4826 module_dict, t) )) return -1;
4827 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 if (!( UnpickleableError = PyErr_NewException(
4830 "cPickle.UnpickleableError", PicklingError, t)))
4831 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4836 PickleError, NULL)))
4837 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 if (PyDict_SetItemString(module_dict, "PickleError",
4840 PickleError) < 0)
4841 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004843 if (PyDict_SetItemString(module_dict, "PicklingError",
4844 PicklingError) < 0)
4845 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004847 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4848 UnpicklingError) < 0)
4849 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004851 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4852 UnpickleableError) < 0)
4853 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004855 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4856 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4859 BadPickleGet) < 0)
4860 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004864 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004865}
4866
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004867#ifndef DL_EXPORT /* declarations for DLL import/export */
4868#define DL_EXPORT(RTYPE) RTYPE
4869#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004870DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004871initcPickle(void)
4872{
4873 PyObject *m, *d, *di, *v, *k;
4874 int i;
4875 char *rev="1.71";
4876 PyObject *format_version;
4877 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 Picklertype.ob_type = &PyType_Type;
4880 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4881 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4882 Unpicklertype.ob_type = &PyType_Type;
4883 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004885 /* Initialize some pieces. We need to do this before module creation,
4886 so we're forced to use a temporary dictionary. :(
4887 */
4888 di=PyDict_New();
4889 if (!di) return;
4890 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 /* Create the module and add the functions */
4893 m = Py_InitModule4("cPickle", cPickle_methods,
4894 cPickle_module_documentation,
4895 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 /* Add some symbolic constants to the module */
4898 d = PyModule_GetDict(m);
4899 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4900 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 /* Copy data from di. Waaa. */
4903 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4904 if (PyObject_SetItem(d, k, v) < 0) {
4905 Py_DECREF(di);
4906 return;
4907 }
4908 }
4909 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 format_version = PyString_FromString("1.3");
4912 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 PyDict_SetItemString(d, "format_version", format_version);
4915 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4916 Py_XDECREF(format_version);
4917 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004918}