blob: fb44f05f20a51d4b9984e1b16e93e05b4b14865e [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 Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum60456fd1997-04-09 17:36:32 +0000129static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000130
Guido van Rossumc03158b1999-06-09 15:23:31 +0000131static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000132static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000133static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000134static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000135static PyObject *BadPickleGet;
136
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000137
Guido van Rossum60456fd1997-04-09 17:36:32 +0000138static PyObject *dispatch_table;
139static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000140static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000141
Guido van Rossum60456fd1997-04-09 17:36:32 +0000142static PyObject *__class___str, *__getinitargs___str, *__dict___str,
143 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
144 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000145 *read_str, *readline_str, *__main___str, *__basicnew___str,
Fred Drake2c7a6852001-07-17 18:34:03 +0000146 *copy_reg_str, *dispatch_table_str, *safe_constructors_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000147
Guido van Rossum053b8df1998-11-25 16:18:00 +0000148/*************************************************************************
149 Internal Data type for pickle data. */
150
151typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000152 PyObject_HEAD
153 int length, size;
154 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000155} Pdata;
156
Tim Peters84e87f32001-03-17 04:50:51 +0000157static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000158Pdata_dealloc(Pdata *self)
159{
160 int i;
161 PyObject **p;
162
163 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000165 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000167 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168}
169
170static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000171 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
172 (destructor)Pdata_dealloc,
173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174};
175
176#define Pdata_Check(O) ((O)->ob_type == &PdataType)
177
178static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179Pdata_New(void)
180{
181 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000183 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
184 self->size=8;
185 self->length=0;
186 self->data=malloc(self->size * sizeof(PyObject*));
187 if (self->data) return (PyObject*)self;
188 Py_DECREF(self);
189 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000190}
191
Tim Peters84e87f32001-03-17 04:50:51 +0000192static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193stackUnderflow(void)
194{
195 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
196 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000197}
198
199static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000200Pdata_clear(Pdata *self, int clearto)
201{
202 int i;
203 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000205 if (clearto < 0) return stackUnderflow();
206 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
209 Py_DECREF(*p);
210 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000212 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000213}
214
215
Tim Peters84e87f32001-03-17 04:50:51 +0000216static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000217Pdata_grow(Pdata *self)
218{
219 if (! self->size) {
220 PyErr_NoMemory();
221 return -1;
222 }
223 self->size *= 2;
224 self->data = realloc(self->data, self->size*sizeof(PyObject*));
225 if (! self->data) {
226 self->size = 0;
227 PyErr_NoMemory();
228 return -1;
229 }
230 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
233#define PDATA_POP(D,V) { \
234 if ((D)->length) V=D->data[--((D)->length)]; \
235 else { \
236 PyErr_SetString(UnpicklingError, "bad pickle data"); \
237 V=NULL; \
238 } \
239}
240
241
242static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000243Pdata_popTuple(Pdata *self, int start)
244{
245 PyObject *r;
246 int i, j, l;
247
248 l=self->length-start;
249 if (!( r=PyTuple_New(l))) return NULL;
250 for (i=start, j=0 ; j < l; i++, j++)
251 PyTuple_SET_ITEM(r, j, self->data[i]);
252
253 self->length=start;
254 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000255}
256
257static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000258Pdata_popList(Pdata *self, int start)
259{
260 PyObject *r;
261 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000263 l=self->length-start;
264 if (!( r=PyList_New(l))) return NULL;
265 for (i=start, j=0 ; j < l; i++, j++)
266 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000268 self->length=start;
269 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000270}
271
272#define PDATA_APPEND_(D,O,ER) { \
273 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
274}
275
276#define PDATA_APPEND(D,O,ER) { \
277 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
278 Pdata_grow((Pdata*)(D)) < 0) \
279 return ER; \
280 Py_INCREF(O); \
281 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
282}
283
284#define PDATA_PUSH(D,O,ER) { \
285 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
286 Pdata_grow((Pdata*)(D)) < 0) { \
287 Py_DECREF(O); \
288 return ER; \
289 } \
290 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
291}
292
293/*************************************************************************/
294
295#define ARG_TUP(self, o) { \
296 if (self->arg || (self->arg=PyTuple_New(1))) { \
297 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
298 PyTuple_SET_ITEM(self->arg,0,o); \
299 } \
300 else { \
301 Py_DECREF(o); \
302 } \
303}
304
305#define FREE_ARG_TUP(self) { \
306 if (self->arg->ob_refcnt > 1) { \
307 Py_DECREF(self->arg); \
308 self->arg=NULL; \
309 } \
310 }
311
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000312typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000313 PyObject_HEAD
314 FILE *fp;
315 PyObject *write;
316 PyObject *file;
317 PyObject *memo;
318 PyObject *arg;
319 PyObject *pers_func;
320 PyObject *inst_pers_func;
321 int bin;
322 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
323 int (*write_func)(struct Picklerobject *, char *, int);
324 char *write_buf;
325 int buf_size;
326 PyObject *dispatch_table;
327 int fast_container; /* count nested container dumps */
328 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000329} Picklerobject;
330
Barry Warsaw52acb492001-12-21 20:04:22 +0000331#ifndef PY_CPICKLE_FAST_LIMIT
332#define PY_CPICKLE_FAST_LIMIT 50
333#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000334
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000335staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000336
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000337typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000338 PyObject_HEAD
339 FILE *fp;
340 PyObject *file;
341 PyObject *readline;
342 PyObject *read;
343 PyObject *memo;
344 PyObject *arg;
345 Pdata *stack;
346 PyObject *mark;
347 PyObject *pers_func;
348 PyObject *last_string;
349 int *marks;
350 int num_marks;
351 int marks_size;
352 int (*read_func)(struct Unpicklerobject *, char **, int);
353 int (*readline_func)(struct Unpicklerobject *, char **);
354 int buf_size;
355 char *buf;
356 PyObject *safe_constructors;
357 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000358} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000359
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000360staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000361
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000362/* Forward decls that need the above structs */
363static int save(Picklerobject *, PyObject *, int);
364static int put2(Picklerobject *, PyObject *);
365
Tim Peters84e87f32001-03-17 04:50:51 +0000366int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000367cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
368{
369 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000371 if ((v = PyObject_GetItem(o,key))) {
372 Py_DECREF(v);
373 return 1;
374 }
375
376 PyErr_Clear();
377 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000378}
379
Guido van Rossumd385d591997-04-09 17:47:47 +0000380static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000381PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000382cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
383{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000384 va_list va;
385 PyObject *args=0, *retval=0;
386 va_start(va, format);
387
388 if (format) args = Py_VaBuildValue(format, va);
389 va_end(va);
390 if (format && ! args) return NULL;
391 if (stringformat && !(retval=PyString_FromString(stringformat)))
392 return NULL;
393
394 if (retval) {
395 if (args) {
396 PyObject *v;
397 v=PyString_Format(retval, args);
398 Py_DECREF(retval);
399 Py_DECREF(args);
400 if (! v) return NULL;
401 retval=v;
402 }
403 }
404 else
405 if (args) retval=args;
406 else {
407 PyErr_SetObject(ErrType,Py_None);
408 return NULL;
409 }
410 PyErr_SetObject(ErrType,retval);
411 Py_DECREF(retval);
412 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000413}
414
Tim Peters84e87f32001-03-17 04:50:51 +0000415static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000416write_file(Picklerobject *self, char *s, int n)
417{
418 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420 if (s == NULL) {
421 return 0;
422 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000424 Py_BEGIN_ALLOW_THREADS
425 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
426 Py_END_ALLOW_THREADS
427 if (nbyteswritten != (size_t)n) {
428 PyErr_SetFromErrno(PyExc_IOError);
429 return -1;
430 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000432 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000433}
434
Tim Peters84e87f32001-03-17 04:50:51 +0000435static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436write_cStringIO(Picklerobject *self, char *s, int n)
437{
438 if (s == NULL) {
439 return 0;
440 }
441
442 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
443 return -1;
444 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000446 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000447}
448
Tim Peters84e87f32001-03-17 04:50:51 +0000449static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000450write_none(Picklerobject *self, char *s, int n)
451{
452 if (s == NULL) return 0;
453 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000454}
455
Tim Peters84e87f32001-03-17 04:50:51 +0000456static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000457write_other(Picklerobject *self, char *s, int n)
458{
459 PyObject *py_str = 0, *junk = 0;
460
461 if (s == NULL) {
462 if (!( self->buf_size )) return 0;
463 py_str = PyString_FromStringAndSize(self->write_buf,
464 self->buf_size);
465 if (!py_str)
466 return -1;
467 }
468 else {
469 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
470 if (write_other(self, NULL, 0) < 0)
471 return -1;
472 }
473
474 if (n > WRITE_BUF_SIZE) {
475 if (!( py_str =
476 PyString_FromStringAndSize(s, n)))
477 return -1;
478 }
479 else {
480 memcpy(self->write_buf + self->buf_size, s, n);
481 self->buf_size += n;
482 return n;
483 }
484 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000486 if (self->write) {
487 /* object with write method */
488 ARG_TUP(self, py_str);
489 if (self->arg) {
490 junk = PyObject_Call(self->write, self->arg, NULL);
491 FREE_ARG_TUP(self);
492 }
493 if (junk) Py_DECREF(junk);
494 else return -1;
495 }
496 else
497 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 self->buf_size = 0;
500 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501}
502
503
Tim Peters84e87f32001-03-17 04:50:51 +0000504static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505read_file(Unpicklerobject *self, char **s, int n)
506{
507 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509 if (self->buf_size == 0) {
510 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512 size = ((n < 32) ? 32 : n);
513 if (!( self->buf = (char *)malloc(size * sizeof(char)))) {
514 PyErr_NoMemory();
515 return -1;
516 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000518 self->buf_size = size;
519 }
520 else if (n > self->buf_size) {
521 self->buf = (char *)realloc(self->buf, n * sizeof(char));
522 if (!self->buf) {
523 PyErr_NoMemory();
524 return -1;
525 }
Tim Peters84e87f32001-03-17 04:50:51 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 self->buf_size = n;
528 }
Tim Peters84e87f32001-03-17 04:50:51 +0000529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530 Py_BEGIN_ALLOW_THREADS
531 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
532 Py_END_ALLOW_THREADS
533 if (nbytesread != (size_t)n) {
534 if (feof(self->fp)) {
535 PyErr_SetNone(PyExc_EOFError);
536 return -1;
537 }
538
539 PyErr_SetFromErrno(PyExc_IOError);
540 return -1;
541 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000546}
547
548
Tim Peters84e87f32001-03-17 04:50:51 +0000549static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550readline_file(Unpicklerobject *self, char **s)
551{
552 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (self->buf_size == 0) {
555 if (!( self->buf = (char *)malloc(40 * sizeof(char)))) {
556 PyErr_NoMemory();
557 return -1;
558 }
Tim Peters84e87f32001-03-17 04:50:51 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 self->buf_size = 40;
561 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000563 i = 0;
564 while (1) {
565 for (; i < (self->buf_size - 1); i++) {
566 if (feof(self->fp) ||
567 (self->buf[i] = getc(self->fp)) == '\n') {
568 self->buf[i + 1] = '\0';
569 *s = self->buf;
570 return i + 1;
571 }
572 }
573 self->buf = (char *)realloc(self->buf,
574 (self->buf_size * 2) * sizeof(char));
575 if (!self->buf) {
576 PyErr_NoMemory();
577 return -1;
578 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 self->buf_size *= 2;
581 }
Tim Peters84e87f32001-03-17 04:50:51 +0000582}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000583
584
Tim Peters84e87f32001-03-17 04:50:51 +0000585static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586read_cStringIO(Unpicklerobject *self, char **s, int n)
587{
588 char *ptr;
589
590 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
591 PyErr_SetNone(PyExc_EOFError);
592 return -1;
593 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 *s = ptr;
596
597 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598}
599
600
Tim Peters84e87f32001-03-17 04:50:51 +0000601static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602readline_cStringIO(Unpicklerobject *self, char **s)
603{
604 int n;
605 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
608 return -1;
609 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000614}
615
616
Tim Peters84e87f32001-03-17 04:50:51 +0000617static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618read_other(Unpicklerobject *self, char **s, int n)
619{
620 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624 ARG_TUP(self, bytes);
625 if (self->arg) {
626 str = PyObject_Call(self->read, self->arg, NULL);
627 FREE_ARG_TUP(self);
628 }
629 if (! str) return -1;
630
631 Py_XDECREF(self->last_string);
632 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634 if (! (*s = PyString_AsString(str))) return -1;
635 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000636}
637
638
Tim Peters84e87f32001-03-17 04:50:51 +0000639static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640readline_other(Unpicklerobject *self, char **s)
641{
642 PyObject *str;
643 int str_size;
644
645 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
646 return -1;
647 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 if ((str_size = PyString_Size(str)) < 0)
650 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000652 Py_XDECREF(self->last_string);
653 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 if (! (*s = PyString_AsString(str)))
656 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659}
660
661
662static char *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663pystrndup(char *s, int l)
664{
665 char *r;
666 if (!( r=malloc((l+1)*sizeof(char)))) return (char*)PyErr_NoMemory();
667 memcpy(r,s,l);
668 r[l]=0;
669 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000670}
671
672
673static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000674get(Picklerobject *self, PyObject *id)
675{
676 PyObject *value, *mv;
677 long c_value;
678 char s[30];
679 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681 if (!( mv = PyDict_GetItem(self->memo, id))) {
682 PyErr_SetObject(PyExc_KeyError, id);
683 return -1;
684 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000686 if (!( value = PyTuple_GetItem(mv, 0)))
687 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 if (!( PyInt_Check(value))) {
690 PyErr_SetString(PicklingError, "no int where int expected in memo");
691 return -1;
692 }
693 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000695 if (!self->bin) {
696 s[0] = GET;
697 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
698 len = strlen(s);
699 }
700 else if (Pdata_Check(self->file)) {
701 if (write_other(self, NULL, 0) < 0) return -1;
702 PDATA_APPEND(self->file, mv, -1);
703 return 0;
704 }
705 else {
706 if (c_value < 256) {
707 s[0] = BINGET;
708 s[1] = (int)(c_value & 0xff);
709 len = 2;
710 }
711 else {
712 s[0] = LONG_BINGET;
713 s[1] = (int)(c_value & 0xff);
714 s[2] = (int)((c_value >> 8) & 0xff);
715 s[3] = (int)((c_value >> 16) & 0xff);
716 s[4] = (int)((c_value >> 24) & 0xff);
717 len = 5;
718 }
719 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 if ((*self->write_func)(self, s, len) < 0)
722 return -1;
723
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000724 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000725}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000726
Guido van Rossum60456fd1997-04-09 17:36:32 +0000727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728static int
729put(Picklerobject *self, PyObject *ob)
730{
731 if (ob->ob_refcnt < 2 || self->fast)
732 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000734 return put2(self, ob);
735}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000736
Guido van Rossum053b8df1998-11-25 16:18:00 +0000737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000738static int
739put2(Picklerobject *self, PyObject *ob)
740{
741 char c_str[30];
742 int p;
743 size_t len;
744 int res = -1;
745 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000747 if (self->fast)
748 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000750 if ((p = PyDict_Size(self->memo)) < 0)
751 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753 /* Make sure memo keys are positive! */
754 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
757 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 if (!( memo_len = PyInt_FromLong(p)))
760 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 if (!( t = PyTuple_New(2)))
763 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 PyTuple_SET_ITEM(t, 0, memo_len);
766 Py_INCREF(memo_len);
767 PyTuple_SET_ITEM(t, 1, ob);
768 Py_INCREF(ob);
769
770 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
771 goto finally;
772
773 if (!self->bin) {
774 c_str[0] = PUT;
775 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
776 len = strlen(c_str);
777 }
778 else if (Pdata_Check(self->file)) {
779 if (write_other(self, NULL, 0) < 0) return -1;
780 PDATA_APPEND(self->file, memo_len, -1);
781 res=0; /* Job well done ;) */
782 goto finally;
783 }
784 else {
785 if (p >= 256) {
786 c_str[0] = LONG_BINPUT;
787 c_str[1] = (int)(p & 0xff);
788 c_str[2] = (int)((p >> 8) & 0xff);
789 c_str[3] = (int)((p >> 16) & 0xff);
790 c_str[4] = (int)((p >> 24) & 0xff);
791 len = 5;
792 }
793 else {
794 c_str[0] = BINPUT;
795 c_str[1] = p;
796 len = 2;
797 }
798 }
799
800 if ((*self->write_func)(self, c_str, len) < 0)
801 goto finally;
802
803 res = 0;
804
805 finally:
806 Py_XDECREF(py_ob_id);
807 Py_XDECREF(memo_len);
808 Py_XDECREF(t);
809
810 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000811}
812
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000813#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000814
815static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816PyImport_Import(PyObject *module_name)
817{
818 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
819 static PyObject *standard_builtins=0;
820 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000822 if (!( silly_list )) {
823 if (!( __import___str=PyString_FromString("__import__")))
824 return NULL;
825 if (!( __builtins___str=PyString_FromString("__builtins__")))
826 return NULL;
827 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
828 return NULL;
829 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831 if ((globals=PyEval_GetGlobals())) {
832 Py_INCREF(globals);
833 __builtins__=PyObject_GetItem(globals,__builtins___str);
834 if (!__builtins__)
835 goto err;
836 }
837 else {
838 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000840 if (!(standard_builtins ||
841 (standard_builtins=PyImport_ImportModule("__builtin__"))))
842 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 __builtins__=standard_builtins;
845 Py_INCREF(__builtins__);
846 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
847 if (!globals)
848 goto err;
849 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 if (PyDict_Check(__builtins__)) {
852 __import__=PyObject_GetItem(__builtins__,__import___str);
853 if (!__import__) goto err;
854 }
855 else {
856 __import__=PyObject_GetAttr(__builtins__,__import___str);
857 if (!__import__) goto err;
858 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 r=PyObject_CallFunction(__import__,"OOOO",
861 module_name, globals, globals, silly_list);
862 if (!r)
863 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 Py_DECREF(globals);
866 Py_DECREF(__builtins__);
867 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 return r;
870 err:
871 Py_XDECREF(globals);
872 Py_XDECREF(__builtins__);
873 Py_XDECREF(__import__);
874 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000875}
876
877static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878whichmodule(PyObject *global, PyObject *global_name)
879{
880 int i, j;
881 PyObject *module = 0, *modules_dict = 0,
882 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 module = PyObject_GetAttrString(global, "__module__");
885 if (module) return module;
886 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 if (!( modules_dict = PySys_GetObject("modules")))
889 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000891 i = 0;
892 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000896 global_name_attr = PyObject_GetAttr(module, global_name);
897 if (!global_name_attr) {
898 PyErr_Clear();
899 continue;
900 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000902 if (global_name_attr != global) {
903 Py_DECREF(global_name_attr);
904 continue;
905 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000907 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000909 break;
910 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000912 /* The following implements the rule in pickle.py added in 1.5
913 that used __main__ if no module is found. I don't actually
914 like this rule. jlf
915 */
916 if (!j) {
917 j=1;
918 name=__main___str;
919 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000921 Py_INCREF(name);
922 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000923}
924
925
Guido van Rossum60456fd1997-04-09 17:36:32 +0000926static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000927fast_save_enter(Picklerobject *self, PyObject *obj)
928{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000929 /* if fast_container < 0, we're doing an error exit. */
930 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
931 PyObject *key = NULL;
932 if (self->fast_memo == NULL) {
933 self->fast_memo = PyDict_New();
934 if (self->fast_memo == NULL) {
935 self->fast_container = -1;
936 return 0;
937 }
938 }
939 key = PyLong_FromVoidPtr(obj);
940 if (key == NULL)
941 return 0;
942 if (PyDict_GetItem(self->fast_memo, key)) {
943 PyErr_Format(PyExc_ValueError,
944 "fast mode: can't pickle cyclic objects including object type %s at %p",
945 obj->ob_type->tp_name, obj);
946 self->fast_container = -1;
947 return 0;
948 }
949 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
950 self->fast_container = -1;
951 return 0;
952 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000953 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000954 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000955}
956
957int
958fast_save_leave(Picklerobject *self, PyObject *obj)
959{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000960 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
961 PyObject *key = PyLong_FromVoidPtr(obj);
962 if (key == NULL)
963 return 0;
964 if (PyDict_DelItem(self->fast_memo, key) < 0) {
965 return 0;
966 }
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000967 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000968 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000969}
970
971static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000972save_none(Picklerobject *self, PyObject *args)
973{
974 static char none = NONE;
975 if ((*self->write_func)(self, &none, 1) < 0)
976 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000979}
980
Tim Peters84e87f32001-03-17 04:50:51 +0000981
Guido van Rossum60456fd1997-04-09 17:36:32 +0000982static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983save_int(Picklerobject *self, PyObject *args)
984{
985 char c_str[32];
986 long l = PyInt_AS_LONG((PyIntObject *)args);
987 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000990#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000991 || l > 0x7fffffffL
992 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000993#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000994 ) {
995 /* Text-mode pickle, or long too big to fit in the 4-byte
996 * signed BININT format: store as a string.
997 */
998 c_str[0] = INT;
999 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
1000 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1001 return -1;
1002 }
1003 else {
1004 /* Binary pickle and l fits in a signed 4-byte int. */
1005 c_str[1] = (int)( l & 0xff);
1006 c_str[2] = (int)((l >> 8) & 0xff);
1007 c_str[3] = (int)((l >> 16) & 0xff);
1008 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001010 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1011 if (c_str[2] == 0) {
1012 c_str[0] = BININT1;
1013 len = 2;
1014 }
1015 else {
1016 c_str[0] = BININT2;
1017 len = 3;
1018 }
1019 }
1020 else {
1021 c_str[0] = BININT;
1022 len = 5;
1023 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 if ((*self->write_func)(self, c_str, len) < 0)
1026 return -1;
1027 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030}
1031
1032
1033static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034save_long(Picklerobject *self, PyObject *args)
1035{
1036 int size, res = -1;
1037 PyObject *repr = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041 if (!( repr = PyObject_Repr(args)))
1042 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001044 if ((size = PyString_Size(repr)) < 0)
1045 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001047 if ((*self->write_func)(self, &l, 1) < 0)
1048 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 if ((*self->write_func)(self,
1051 PyString_AS_STRING((PyStringObject *)repr),
1052 size) < 0)
1053 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001055 if ((*self->write_func)(self, "\n", 1) < 0)
1056 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001058 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 finally:
1061 Py_XDECREF(repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001063 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064}
1065
1066
1067static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001068save_float(Picklerobject *self, PyObject *args)
1069{
1070 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001072 if (self->bin) {
1073 int s, e;
1074 double f;
1075 long fhi, flo;
1076 char str[9];
1077 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001079 *p = BINFLOAT;
1080 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001082 if (x < 0) {
1083 s = 1;
1084 x = -x;
1085 }
1086 else
1087 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001089 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001091 /* Normalize f to be in the range [1.0, 2.0) */
1092 if (0.5 <= f && f < 1.0) {
1093 f *= 2.0;
1094 e--;
1095 }
1096 else if (f == 0.0) {
1097 e = 0;
1098 }
1099 else {
1100 PyErr_SetString(PyExc_SystemError,
1101 "frexp() result out of range");
1102 return -1;
1103 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001105 if (e >= 1024) {
1106 /* XXX 1024 itself is reserved for Inf/NaN */
1107 PyErr_SetString(PyExc_OverflowError,
1108 "float too large to pack with d format");
1109 return -1;
1110 }
1111 else if (e < -1022) {
1112 /* Gradual underflow */
1113 f = ldexp(f, 1022 + e);
1114 e = 0;
1115 }
1116 else if (!(e == 0 && f == 0.0)) {
1117 e += 1023;
1118 f -= 1.0; /* Get rid of leading 1 */
1119 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 /* fhi receives the high 28 bits;
1122 flo the low 24 bits (== 52 bits) */
1123 f *= 268435456.0; /* 2**28 */
1124 fhi = (long) floor(f); /* Truncate */
1125 f -= (double)fhi;
1126 f *= 16777216.0; /* 2**24 */
1127 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 /* First byte */
1130 *p = (s<<7) | (e>>4);
1131 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001133 /* Second byte */
1134 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1135 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 /* Third byte */
1138 *p = (unsigned char) ((fhi>>16) & 0xFF);
1139 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 /* Fourth byte */
1142 *p = (unsigned char) ((fhi>>8) & 0xFF);
1143 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 /* Fifth byte */
1146 *p = (unsigned char) (fhi & 0xFF);
1147 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 /* Sixth byte */
1150 *p = (unsigned char) ((flo>>16) & 0xFF);
1151 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 /* Seventh byte */
1154 *p = (unsigned char) ((flo>>8) & 0xFF);
1155 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 /* Eighth byte */
1158 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 if ((*self->write_func)(self, str, 9) < 0)
1161 return -1;
1162 }
1163 else {
1164 char c_str[250];
1165 c_str[0] = FLOAT;
1166 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1169 return -1;
1170 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173}
1174
1175
1176static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001177save_string(Picklerobject *self, PyObject *args, int doput)
1178{
1179 int size, len;
1180 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if ((size = PyString_Size(args)) < 0)
1183 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 if (!self->bin) {
1186 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 if (!( repr = PyObject_Repr(args)))
1191 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 if ((len = PyString_Size(repr)) < 0)
1194 goto err;
1195 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if ((*self->write_func)(self, &string, 1) < 0)
1198 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 if ((*self->write_func)(self, repr_str, len) < 0)
1201 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 if ((*self->write_func)(self, "\n", 1) < 0)
1204 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 Py_XDECREF(repr);
1207 }
1208 else {
1209 int i;
1210 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 if ((size = PyString_Size(args)) < 0)
1213 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 if (size < 256) {
1216 c_str[0] = SHORT_BINSTRING;
1217 c_str[1] = size;
1218 len = 2;
1219 }
1220 else {
1221 c_str[0] = BINSTRING;
1222 for (i = 1; i < 5; i++)
1223 c_str[i] = (int)(size >> ((i - 1) * 8));
1224 len = 5;
1225 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 if ((*self->write_func)(self, c_str, len) < 0)
1228 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001230 if (size > 128 && Pdata_Check(self->file)) {
1231 if (write_other(self, NULL, 0) < 0) return -1;
1232 PDATA_APPEND(self->file, args, -1);
1233 }
1234 else {
1235 if ((*self->write_func)(self,
1236 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1237 return -1;
1238 }
1239 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 if (doput)
1242 if (put(self, args) < 0)
1243 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 err:
1248 Py_XDECREF(repr);
1249 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250}
1251
1252
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001253#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001254/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1255 backslash and newline characters to \uXXXX escapes. */
1256static PyObject *
1257modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1258{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 PyObject *repr;
1260 char *p;
1261 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 repr = PyString_FromStringAndSize(NULL, 6 * size);
1266 if (repr == NULL)
1267 return NULL;
1268 if (size == 0)
1269 return repr;
1270
1271 p = q = PyString_AS_STRING(repr);
1272 while (size-- > 0) {
1273 Py_UNICODE ch = *s++;
1274 /* Map 16-bit characters to '\uxxxx' */
1275 if (ch >= 256 || ch == '\\' || ch == '\n') {
1276 *p++ = '\\';
1277 *p++ = 'u';
1278 *p++ = hexdigit[(ch >> 12) & 0xf];
1279 *p++ = hexdigit[(ch >> 8) & 0xf];
1280 *p++ = hexdigit[(ch >> 4) & 0xf];
1281 *p++ = hexdigit[ch & 15];
1282 }
1283 /* Copy everything else as-is */
1284 else
1285 *p++ = (char) ch;
1286 }
1287 *p = '\0';
1288 if (_PyString_Resize(&repr, p - q))
1289 goto onError;
1290
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001291 return repr;
1292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001293 onError:
1294 Py_DECREF(repr);
1295 return NULL;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001296}
1297
1298
Guido van Rossum60456fd1997-04-09 17:36:32 +00001299static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300save_unicode(Picklerobject *self, PyObject *args, int doput)
1301{
1302 int size, len;
1303 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 if (!PyUnicode_Check(args))
1306 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 if (!self->bin) {
1309 char *repr_str;
1310 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 repr = modified_EncodeRawUnicodeEscape(
1313 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
1314 if (!repr)
1315 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 if ((len = PyString_Size(repr)) < 0)
1318 goto err;
1319 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 if ((*self->write_func)(self, &string, 1) < 0)
1322 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 if ((*self->write_func)(self, repr_str, len) < 0)
1325 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 if ((*self->write_func)(self, "\n", 1) < 0)
1328 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 Py_XDECREF(repr);
1331 }
1332 else {
1333 int i;
1334 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 if (!( repr = PyUnicode_AsUTF8String(args)))
1337 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339 if ((size = PyString_Size(repr)) < 0)
1340 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342 c_str[0] = BINUNICODE;
1343 for (i = 1; i < 5; i++)
1344 c_str[i] = (int)(size >> ((i - 1) * 8));
1345 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 if ((*self->write_func)(self, c_str, len) < 0)
1348 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 if (size > 128 && Pdata_Check(self->file)) {
1351 if (write_other(self, NULL, 0) < 0)
1352 goto err;
1353 PDATA_APPEND(self->file, repr, -1);
1354 }
1355 else {
1356 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1357 size) < 0)
1358 goto err;
1359 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 Py_DECREF(repr);
1362 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 if (doput)
1365 if (put(self, args) < 0)
1366 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 err:
1371 Py_XDECREF(repr);
1372 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001374#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375
1376
1377static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001378save_tuple(Picklerobject *self, PyObject *args)
1379{
1380 PyObject *element = 0, *py_tuple_id = 0;
1381 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001385 if ((*self->write_func)(self, &MARKv, 1) < 0)
1386 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001388 if ((len = PyTuple_Size(args)) < 0)
1389 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 for (i = 0; i < len; i++) {
1392 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
1393 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 if (save(self, element, 0) < 0)
1396 goto finally;
1397 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
1400 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 if (len) {
1403 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1404 if (self->bin) {
1405 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1408 goto finally;
1409 }
1410 else {
1411 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 for (i = 0; i <= len; i++) {
1414 if ((*self->write_func)(self, &pop, 1) < 0)
1415 goto finally;
1416 }
1417 }
Tim Peters84e87f32001-03-17 04:50:51 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if (get(self, py_tuple_id) < 0)
1420 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 res = 0;
1423 goto finally;
1424 }
1425 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 if ((*self->write_func)(self, &tuple, 1) < 0) {
1428 goto finally;
1429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001431 if (put(self, args) < 0)
1432 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 finally:
1437 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001440}
1441
1442static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443save_empty_tuple(Picklerobject *self, PyObject *args)
1444{
1445 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001448}
1449
1450
1451static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452save_list(Picklerobject *self, PyObject *args)
1453{
1454 PyObject *element = 0;
1455 int s_len, len, i, using_appends, res = -1;
1456 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (self->fast && !fast_save_enter(self, args))
1461 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 if (self->bin) {
1464 s[0] = EMPTY_LIST;
1465 s_len = 1;
1466 }
1467 else {
1468 s[0] = MARK;
1469 s[1] = LIST;
1470 s_len = 2;
1471 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 if ((len = PyList_Size(args)) < 0)
1474 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 if ((*self->write_func)(self, s, s_len) < 0)
1477 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 if (len == 0) {
1480 if (put(self, args) < 0)
1481 goto finally;
1482 }
1483 else {
1484 if (put2(self, args) < 0)
1485 goto finally;
1486 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 if ((using_appends = (self->bin && (len > 1))))
1489 if ((*self->write_func)(self, &MARKv, 1) < 0)
1490 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 for (i = 0; i < len; i++) {
1493 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
1494 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if (save(self, element, 0) < 0)
1497 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 if (!using_appends) {
1500 if ((*self->write_func)(self, &append, 1) < 0)
1501 goto finally;
1502 }
1503 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 if (using_appends) {
1506 if ((*self->write_func)(self, &appends, 1) < 0)
1507 goto finally;
1508 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 finally:
1513 if (self->fast && !fast_save_leave(self, args))
1514 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001516 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001517}
1518
1519
Guido van Rossum60456fd1997-04-09 17:36:32 +00001520static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521save_dict(Picklerobject *self, PyObject *args)
1522{
1523 PyObject *key = 0, *value = 0;
1524 int i, len, res = -1, using_setitems;
1525 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001527 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 if (self->fast && !fast_save_enter(self, args))
1530 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 if (self->bin) {
1533 s[0] = EMPTY_DICT;
1534 len = 1;
1535 }
1536 else {
1537 s[0] = MARK;
1538 s[1] = DICT;
1539 len = 2;
1540 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if ((*self->write_func)(self, s, len) < 0)
1543 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 if ((len = PyDict_Size(args)) < 0)
1546 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 if (len == 0) {
1549 if (put(self, args) < 0)
1550 goto finally;
1551 }
1552 else {
1553 if (put2(self, args) < 0)
1554 goto finally;
1555 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001557 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1558 if ((*self->write_func)(self, &MARKv, 1) < 0)
1559 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 i = 0;
1562 while (PyDict_Next(args, &i, &key, &value)) {
1563 if (save(self, key, 0) < 0)
1564 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001566 if (save(self, value, 0) < 0)
1567 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001569 if (!using_setitems) {
1570 if ((*self->write_func)(self, &setitem, 1) < 0)
1571 goto finally;
1572 }
1573 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001575 if (using_setitems) {
1576 if ((*self->write_func)(self, &setitems, 1) < 0)
1577 goto finally;
1578 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 finally:
1583 if (self->fast && !fast_save_leave(self, args))
1584 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001586 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001587}
1588
1589
Tim Peters84e87f32001-03-17 04:50:51 +00001590static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591save_inst(Picklerobject *self, PyObject *args)
1592{
1593 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1594 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1595 char *module_str, *name_str;
1596 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 if (self->fast && !fast_save_enter(self, args))
1601 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 if ((*self->write_func)(self, &MARKv, 1) < 0)
1604 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606 if (!( class = PyObject_GetAttr(args, __class___str)))
1607 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 if (self->bin) {
1610 if (save(self, class, 0) < 0)
1611 goto finally;
1612 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1615 PyObject *element = 0;
1616 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if (!( class_args =
1619 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
1620 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if ((len = PyObject_Size(class_args)) < 0)
1623 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 for (i = 0; i < len; i++) {
1626 if (!( element = PySequence_GetItem(class_args, i)))
1627 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 if (save(self, element, 0) < 0) {
1630 Py_DECREF(element);
1631 goto finally;
1632 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 Py_DECREF(element);
1635 }
1636 }
1637 else {
1638 PyErr_Clear();
1639 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 if (!self->bin) {
1642 if (!( name = ((PyClassObject *)class)->cl_name )) {
1643 PyErr_SetString(PicklingError, "class has no name");
1644 goto finally;
1645 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001647 if (!( module = whichmodule(class, name)))
1648 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001649
Tim Peters84e87f32001-03-17 04:50:51 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 if ((module_size = PyString_Size(module)) < 0 ||
1652 (name_size = PyString_Size(name)) < 0)
1653 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 module_str = PyString_AS_STRING((PyStringObject *)module);
1656 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001658 if ((*self->write_func)(self, &inst, 1) < 0)
1659 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661 if ((*self->write_func)(self, module_str, module_size) < 0)
1662 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001664 if ((*self->write_func)(self, "\n", 1) < 0)
1665 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 if ((*self->write_func)(self, name_str, name_size) < 0)
1668 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001670 if ((*self->write_func)(self, "\n", 1) < 0)
1671 goto finally;
1672 }
1673 else if ((*self->write_func)(self, &obj, 1) < 0) {
1674 goto finally;
1675 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1678 state = PyObject_Call(getstate_func, empty_tuple, NULL);
1679 if (!state)
1680 goto finally;
1681 }
1682 else {
1683 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1686 PyErr_Clear();
1687 res = 0;
1688 goto finally;
1689 }
1690 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 if (!PyDict_Check(state)) {
1693 if (put2(self, args) < 0)
1694 goto finally;
1695 }
1696 else {
1697 if (put(self, args) < 0)
1698 goto finally;
1699 }
Tim Peters84e87f32001-03-17 04:50:51 +00001700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 if (save(self, state, 0) < 0)
1702 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 if ((*self->write_func)(self, &build, 1) < 0)
1705 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 finally:
1710 if (self->fast && !fast_save_leave(self, args))
1711 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 Py_XDECREF(module);
1714 Py_XDECREF(class);
1715 Py_XDECREF(state);
1716 Py_XDECREF(getinitargs_func);
1717 Py_XDECREF(getstate_func);
1718 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001721}
1722
1723
Guido van Rossum60456fd1997-04-09 17:36:32 +00001724static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001725save_global(Picklerobject *self, PyObject *args, PyObject *name)
1726{
1727 PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
1728 char *name_str, *module_str;
1729 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001731 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 if (name) {
1734 global_name = name;
1735 Py_INCREF(global_name);
1736 }
1737 else {
1738 if (!( global_name = PyObject_GetAttr(args, __name___str)))
1739 goto finally;
1740 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 if (!( module = whichmodule(args, global_name)))
1743 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 if ((module_size = PyString_Size(module)) < 0 ||
1746 (name_size = PyString_Size(global_name)) < 0)
1747 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 module_str = PyString_AS_STRING((PyStringObject *)module);
1750 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 mod = PyImport_ImportModule(module_str);
1753 if (mod == NULL) {
1754 /* Py_ErrClear(); ?? */
1755 cPickle_ErrFormat(PicklingError,
1756 "Can't pickle %s: it's not found as %s.%s",
1757 "OSS", args, module, global_name);
1758 goto finally;
1759 }
1760 /* borrowed ref */
1761 moddict = PyModule_GetDict(mod);
1762 /* borrowed ref */
1763 klass = PyDict_GetItemString(moddict, name_str);
1764 if (klass == NULL) {
1765 cPickle_ErrFormat(PicklingError,
1766 "Can't pickle %s: it's not found as %s.%s",
1767 "OSS", args, module, global_name);
1768 goto finally;
1769 }
1770 if (klass != args) {
1771 cPickle_ErrFormat(PicklingError,
1772 "Can't pickle %s: it's not the same object as %s.%s",
1773 "OSS", args, module, global_name);
1774 goto finally;
1775 }
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 if ((*self->write_func)(self, &global, 1) < 0)
1778 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 if ((*self->write_func)(self, module_str, module_size) < 0)
1781 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783 if ((*self->write_func)(self, "\n", 1) < 0)
1784 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001786 if ((*self->write_func)(self, name_str, name_size) < 0)
1787 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 if ((*self->write_func)(self, "\n", 1) < 0)
1790 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 if (put(self, args) < 0)
1793 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 finally:
1798 Py_XDECREF(module);
1799 Py_XDECREF(global_name);
1800 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803}
1804
Guido van Rossum60456fd1997-04-09 17:36:32 +00001805static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806save_pers(Picklerobject *self, PyObject *args, PyObject *f)
1807{
1808 PyObject *pid = 0;
1809 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 Py_INCREF(args);
1814 ARG_TUP(self, args);
1815 if (self->arg) {
1816 pid = PyObject_Call(f, self->arg, NULL);
1817 FREE_ARG_TUP(self);
1818 }
1819 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 if (pid != Py_None) {
1822 if (!self->bin) {
1823 if (!PyString_Check(pid)) {
1824 PyErr_SetString(PicklingError,
1825 "persistent id must be string");
1826 goto finally;
1827 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 if ((*self->write_func)(self, &persid, 1) < 0)
1830 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 if ((size = PyString_Size(pid)) < 0)
1833 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 if ((*self->write_func)(self,
1836 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1837 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 if ((*self->write_func)(self, "\n", 1) < 0)
1840 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001842 res = 1;
1843 goto finally;
1844 }
1845 else if (save(self, pid, 1) >= 0) {
1846 if ((*self->write_func)(self, &binpersid, 1) < 0)
1847 res = -1;
1848 else
1849 res = 1;
1850 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 goto finally;
1853 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 finally:
1858 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001861}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001862
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Tim Peters84e87f32001-03-17 04:50:51 +00001864static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865save_reduce(Picklerobject *self, PyObject *callable,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 PyObject *tup, PyObject *state, PyObject *ob)
1867{
1868 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if (save(self, callable, 0) < 0)
1871 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001873 if (save(self, tup, 0) < 0)
1874 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 if ((*self->write_func)(self, &reduce, 1) < 0)
1877 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879 if (ob != NULL) {
1880 if (state && !PyDict_Check(state)) {
1881 if (put2(self, ob) < 0)
1882 return -1;
1883 }
1884 else {
1885 if (put(self, ob) < 0)
1886 return -1;
1887 }
1888 }
Tim Peters84e87f32001-03-17 04:50:51 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 if (state) {
1891 if (save(self, state, 0) < 0)
1892 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001894 if ((*self->write_func)(self, &build, 1) < 0)
1895 return -1;
1896 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001899}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001900
Guido van Rossum60456fd1997-04-09 17:36:32 +00001901static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902save(Picklerobject *self, PyObject *args, int pers_save)
1903{
1904 PyTypeObject *type;
1905 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1906 *callable = 0, *state = 0;
1907 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001909 if (!pers_save && self->pers_func) {
1910 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1911 res = tmp;
1912 goto finally;
1913 }
1914 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 if (args == Py_None) {
1917 res = save_none(self, args);
1918 goto finally;
1919 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001924 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 if (type == &PyInt_Type) {
1926 res = save_int(self, args);
1927 goto finally;
1928 }
1929 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001930
Guido van Rossum60456fd1997-04-09 17:36:32 +00001931 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 if (type == &PyLong_Type) {
1933 res = save_long(self, args);
1934 goto finally;
1935 }
1936 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Guido van Rossum60456fd1997-04-09 17:36:32 +00001938 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if (type == &PyFloat_Type) {
1940 res = save_float(self, args);
1941 goto finally;
1942 }
1943 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Guido van Rossum60456fd1997-04-09 17:36:32 +00001945 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
1947 if (self->bin) res = save_empty_tuple(self, args);
1948 else res = save_tuple(self, args);
1949 goto finally;
1950 }
1951 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Guido van Rossum60456fd1997-04-09 17:36:32 +00001953 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
1955 res = save_string(self, args, 0);
1956 goto finally;
1957 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001958
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001959#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001960 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001961 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
1962 res = save_unicode(self, args, 0);
1963 goto finally;
1964 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001965#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 if (args->ob_refcnt > 1) {
1969 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
1970 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 if (PyDict_GetItem(self->memo, py_ob_id)) {
1973 if (get(self, py_ob_id) < 0)
1974 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976 res = 0;
1977 goto finally;
1978 }
1979 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001982 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 if (type == &PyString_Type) {
1984 res = save_string(self, args, 1);
1985 goto finally;
1986 }
1987 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001988
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001989#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001990 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 if (type == &PyUnicode_Type) {
1992 res = save_unicode(self, args, 1);
1993 goto finally;
1994 }
1995 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001996#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001997
Guido van Rossum60456fd1997-04-09 17:36:32 +00001998 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 if (type == &PyTuple_Type) {
2000 res = save_tuple(self, args);
2001 goto finally;
2002 }
2003 if (type == &PyType_Type) {
2004 res = save_global(self, args, NULL);
2005 goto finally;
2006 }
2007 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002008
Guido van Rossum60456fd1997-04-09 17:36:32 +00002009 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002010 if (type == &PyList_Type) {
2011 res = save_list(self, args);
2012 goto finally;
2013 }
2014 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015
2016 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 if (type == &PyDict_Type) {
2018 res = save_dict(self, args);
2019 goto finally;
2020 }
2021 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002022
2023 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 if (type == &PyInstance_Type) {
2025 res = save_inst(self, args);
2026 goto finally;
2027 }
2028 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002029
2030 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 if (type == &PyClass_Type) {
2032 res = save_global(self, args, NULL);
2033 goto finally;
2034 }
2035 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002036
2037 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 if (type == &PyFunction_Type) {
2039 res = save_global(self, args, NULL);
2040 goto finally;
2041 }
2042 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
2044 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 if (type == &PyCFunction_Type) {
2046 res = save_global(self, args, NULL);
2047 goto finally;
2048 }
2049 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 if (PyType_IsSubtype(type, &PyType_Type)) {
2052 res = save_global(self, args, NULL);
2053 goto finally;
2054 }
Guido van Rossum950dce62001-12-19 16:56:54 +00002055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002056 if (!pers_save && self->inst_pers_func) {
2057 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2058 res = tmp;
2059 goto finally;
2060 }
2061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2064 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 Py_INCREF(args);
2067 ARG_TUP(self, args);
2068 if (self->arg) {
2069 t = PyObject_Call(__reduce__, self->arg, NULL);
2070 FREE_ARG_TUP(self);
2071 }
2072 if (! t) goto finally;
2073 }
2074 else {
2075 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2078 t = PyObject_Call(__reduce__, empty_tuple, NULL);
2079 if (!t)
2080 goto finally;
2081 }
2082 else {
2083 PyErr_Clear();
2084 }
2085 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if (t) {
2088 if (PyString_Check(t)) {
2089 res = save_global(self, args, t);
2090 goto finally;
2091 }
Tim Peters84e87f32001-03-17 04:50:51 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 if (!PyTuple_Check(t)) {
2094 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2095 "be a tuple", "O", __reduce__);
2096 goto finally;
2097 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 if ((size != 3) && (size != 2)) {
2102 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2103 "contain only two or three elements", "O", __reduce__);
2104 goto finally;
2105 }
Tim Peters84e87f32001-03-17 04:50:51 +00002106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 if (size > 2) {
2112 state = PyTuple_GET_ITEM(t, 2);
2113 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2116 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2117 "returned by %s must be a tuple", "O", __reduce__);
2118 goto finally;
2119 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 res = save_reduce(self, callable, arg_tup, state, args);
2122 goto finally;
2123 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 finally:
2128 Py_XDECREF(py_ob_id);
2129 Py_XDECREF(__reduce__);
2130 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002133}
2134
2135
2136static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137dump(Picklerobject *self, PyObject *args)
2138{
2139 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 if (save(self, args, 0) < 0)
2142 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 if ((*self->write_func)(self, &stop, 1) < 0)
2145 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 if ((*self->write_func)(self, NULL, 0) < 0)
2148 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002150 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002151}
2152
2153static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002154Pickle_clear_memo(Picklerobject *self, PyObject *args)
2155{
2156 if (!PyArg_ParseTuple(args,":clear_memo"))
2157 return NULL;
2158 if (self->memo)
2159 PyDict_Clear(self->memo);
2160 Py_INCREF(Py_None);
2161 return Py_None;
2162}
2163
2164static PyObject *
2165Pickle_getvalue(Picklerobject *self, PyObject *args)
2166{
2167 int l, i, rsize, ssize, clear=1, lm;
2168 long ik;
2169 PyObject *k, *r;
2170 char *s, *p, *have_get;
2171 Pdata *data;
2172
2173 /* Can be called by Python code or C code */
2174 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
2175 return NULL;
2176
2177 /* Check to make sure we are based on a list */
2178 if (! Pdata_Check(self->file)) {
2179 PyErr_SetString(PicklingError,
2180 "Attempt to getvalue() a non-list-based pickler");
2181 return NULL;
2182 }
2183
2184 /* flush write buffer */
2185 if (write_other(self, NULL, 0) < 0) return NULL;
2186
2187 data=(Pdata*)self->file;
2188 l=data->length;
2189
2190 /* set up an array to hold get/put status */
2191 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2192 lm++;
2193 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2194 memset(have_get,0,lm);
2195
2196 /* Scan for gets. */
2197 for (rsize=0, i=l; --i >= 0; ) {
2198 k=data->data[i];
2199
2200 if (PyString_Check(k)) {
2201 rsize += PyString_GET_SIZE(k);
2202 }
2203
2204 else if (PyInt_Check(k)) { /* put */
2205 ik=PyInt_AS_LONG((PyIntObject*)k);
2206 if (ik >= lm || ik==0) {
2207 PyErr_SetString(PicklingError,
2208 "Invalid get data");
2209 return NULL;
2210 }
2211 if (have_get[ik]) { /* with matching get */
2212 if (ik < 256) rsize += 2;
2213 else rsize+=5;
2214 }
2215 }
2216
2217 else if (! (PyTuple_Check(k) &&
2218 PyTuple_GET_SIZE(k) == 2 &&
2219 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2220 ) {
2221 PyErr_SetString(PicklingError,
2222 "Unexpected data in internal list");
2223 return NULL;
2224 }
2225
2226 else { /* put */
2227 ik=PyInt_AS_LONG((PyIntObject*)k);
2228 if (ik >= lm || ik==0) {
2229 PyErr_SetString(PicklingError,
2230 "Invalid get data");
2231 return NULL;
2232 }
2233 have_get[ik]=1;
2234 if (ik < 256) rsize += 2;
2235 else rsize+=5;
2236 }
2237
2238 }
2239
2240 /* Now generate the result */
2241 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2242 s=PyString_AS_STRING((PyStringObject*)r);
2243
2244 for (i=0; i<l; i++) {
2245 k=data->data[i];
2246
2247 if (PyString_Check(k)) {
2248 ssize=PyString_GET_SIZE(k);
2249 if (ssize) {
2250 p=PyString_AS_STRING((PyStringObject*)k);
2251 while (--ssize >= 0) *s++=*p++;
2252 }
2253 }
2254
2255 else if (PyTuple_Check(k)) { /* get */
2256 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2257 if (ik < 256) {
2258 *s++ = BINGET;
2259 *s++ = (int)(ik & 0xff);
2260 }
2261 else {
2262 *s++ = LONG_BINGET;
2263 *s++ = (int)(ik & 0xff);
2264 *s++ = (int)((ik >> 8) & 0xff);
2265 *s++ = (int)((ik >> 16) & 0xff);
2266 *s++ = (int)((ik >> 24) & 0xff);
2267 }
2268 }
2269
2270 else { /* put */
2271 ik=PyInt_AS_LONG((PyIntObject*)k);
2272
2273 if (have_get[ik]) { /* with matching get */
2274 if (ik < 256) {
2275 *s++ = BINPUT;
2276 *s++ = (int)(ik & 0xff);
2277 }
2278 else {
2279 *s++ = LONG_BINPUT;
2280 *s++ = (int)(ik & 0xff);
2281 *s++ = (int)((ik >> 8) & 0xff);
2282 *s++ = (int)((ik >> 16) & 0xff);
2283 *s++ = (int)((ik >> 24) & 0xff);
2284 }
2285 }
2286 }
2287
2288 }
2289
2290 if (clear) {
2291 PyDict_Clear(self->memo);
2292 Pdata_clear(data,0);
2293 }
2294
2295 free(have_get);
2296 return r;
2297 err:
2298 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002299 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002300}
2301
2302static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303Pickler_dump(Picklerobject *self, PyObject *args)
2304{
2305 PyObject *ob;
2306 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
2309 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 if (dump(self, ob) < 0)
2312 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002316 /* XXX Why does dump() return self? */
2317 Py_INCREF(self);
2318 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002319}
2320
2321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322static struct PyMethodDef Pickler_methods[] =
2323{
Neal Norwitzb0493252002-03-31 14:44:22 +00002324 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002325 "dump(object) --"
2326 "Write an object in pickle format to the object's pickle stream\n"
2327 },
Neal Norwitzb0493252002-03-31 14:44:22 +00002328 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002329 "clear_memo() -- Clear the picklers memo"},
Neal Norwitzb0493252002-03-31 14:44:22 +00002330 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002331 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002332 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002333};
2334
2335
2336static Picklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337newPicklerobject(PyObject *file, int bin)
2338{
2339 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 if (!( self = PyObject_New(Picklerobject, &Picklertype)))
2342 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 self->fp = NULL;
2345 self->write = NULL;
2346 self->memo = NULL;
2347 self->arg = NULL;
2348 self->pers_func = NULL;
2349 self->inst_pers_func = NULL;
2350 self->write_buf = NULL;
2351 self->bin = bin;
2352 self->fast = 0;
2353 self->fast_container = 0;
2354 self->fast_memo = NULL;
2355 self->buf_size = 0;
2356 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002358 if (file)
2359 Py_INCREF(file);
2360 else
2361 file=Pdata_New();
Tim Peters84e87f32001-03-17 04:50:51 +00002362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 if (!( self->file = file ))
2364 goto err;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002366 if (!( self->memo = PyDict_New()))
2367 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002369 if (PyFile_Check(file)) {
2370 self->fp = PyFile_AsFile(file);
2371 if (self->fp == NULL) {
2372 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
2373 goto err;
2374 }
2375 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002376 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 else if (PycStringIO_OutputCheck(file)) {
2378 self->write_func = write_cStringIO;
2379 }
2380 else if (file == Py_None) {
2381 self->write_func = write_none;
2382 }
2383 else {
2384 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 if (! Pdata_Check(file)) {
2387 self->write = PyObject_GetAttr(file, write_str);
2388 if (!self->write) {
2389 PyErr_Clear();
2390 PyErr_SetString(PyExc_TypeError,
2391 "argument must have 'write' "
2392 "attribute");
2393 goto err;
2394 }
2395 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 if (!( self->write_buf =
2398 (char *)malloc(WRITE_BUF_SIZE * sizeof(char)))) {
2399 PyErr_NoMemory();
2400 goto err;
2401 }
2402 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404 if (PyEval_GetRestricted()) {
2405 /* Restricted execution, get private tables */
2406 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2409 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2410 Py_DECREF(m);
2411 if (!( self->dispatch_table )) goto err;
2412 }
2413 else {
2414 self->dispatch_table=dispatch_table;
2415 Py_INCREF(dispatch_table);
2416 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002420 err:
2421 Py_DECREF((PyObject *)self);
2422 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002423}
2424
2425
2426static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427get_Pickler(PyObject *self, PyObject *args)
2428{
2429 PyObject *file = NULL;
2430 int bin = 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432 if (!PyArg_ParseTuple(args, "|i:Pickler", &bin)) {
2433 PyErr_Clear();
2434 bin = 0;
2435 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &bin))
2436 return NULL;
2437 }
2438 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002439}
2440
2441
2442static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443Pickler_dealloc(Picklerobject *self)
2444{
2445 Py_XDECREF(self->write);
2446 Py_XDECREF(self->memo);
2447 Py_XDECREF(self->fast_memo);
2448 Py_XDECREF(self->arg);
2449 Py_XDECREF(self->file);
2450 Py_XDECREF(self->pers_func);
2451 Py_XDECREF(self->inst_pers_func);
2452 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002454 if (self->write_buf) {
2455 free(self->write_buf);
2456 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002458 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002459}
2460
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002461static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002462Pickler_get_pers_func(Picklerobject *p)
2463{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 if (p->pers_func == NULL)
2465 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2466 else
2467 Py_INCREF(p->pers_func);
2468 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002469}
2470
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002471static int
2472Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2473{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 if (v == NULL) {
2475 PyErr_SetString(PyExc_TypeError,
2476 "attribute deletion is not supported");
2477 return -1;
2478 }
2479 Py_XDECREF(p->pers_func);
2480 Py_INCREF(v);
2481 p->pers_func = v;
2482 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002483}
2484
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002485static int
2486Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2487{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 if (v == NULL) {
2489 PyErr_SetString(PyExc_TypeError,
2490 "attribute deletion is not supported");
2491 return -1;
2492 }
2493 Py_XDECREF(p->inst_pers_func);
2494 Py_INCREF(v);
2495 p->inst_pers_func = v;
2496 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002497}
2498
2499static PyObject *
2500Pickler_get_memo(Picklerobject *p)
2501{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 if (p->memo == NULL)
2503 PyErr_SetString(PyExc_AttributeError, "memo");
2504 else
2505 Py_INCREF(p->memo);
2506 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002507}
2508
2509static int
2510Pickler_set_memo(Picklerobject *p, PyObject *v)
2511{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 if (v == NULL) {
2513 PyErr_SetString(PyExc_TypeError,
2514 "attribute deletion is not supported");
2515 return -1;
2516 }
2517 if (!PyDict_Check(v)) {
2518 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2519 return -1;
2520 }
2521 Py_XDECREF(p->memo);
2522 Py_INCREF(v);
2523 p->memo = v;
2524 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002525}
2526
2527static PyObject *
2528Pickler_get_error(Picklerobject *p)
2529{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 /* why is this an attribute on the Pickler? */
2531 Py_INCREF(PicklingError);
2532 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002533}
2534
2535static PyMemberDef Pickler_members[] = {
2536 {"binary", T_INT, offsetof(Picklerobject, bin)},
2537 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002538 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002539};
2540
2541static PyGetSetDef Pickler_getsets[] = {
2542 {"persistent_id", (getter)Pickler_get_pers_func,
2543 (setter)Pickler_set_pers_func},
2544 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2545 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002546 {"PicklingError", (getter)Pickler_get_error, NULL},
2547 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002548};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002549
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002550static char Picklertype__doc__[] =
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002551"Objects that know how to pickle objects\n";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002552
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002553static PyTypeObject Picklertype = {
2554 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002555 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002556 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002557 sizeof(Picklerobject), /*tp_basicsize*/
2558 0,
2559 (destructor)Pickler_dealloc, /* tp_dealloc */
2560 0, /* tp_print */
2561 0, /* tp_getattr */
2562 0, /* tp_setattr */
2563 0, /* tp_compare */
2564 0, /* tp_repr */
2565 0, /* tp_as_number */
2566 0, /* tp_as_sequence */
2567 0, /* tp_as_mapping */
2568 0, /* tp_hash */
2569 0, /* tp_call */
2570 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002571 0, /* set below */ /* tp_getattro */
2572 0, /* set below */ /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002573 0, /* tp_as_buffer */
2574 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2575 Picklertype__doc__, /* tp_doc */
2576 0, /* tp_traverse */
2577 0, /* tp_clear */
2578 0, /* tp_richcompare */
2579 0, /* tp_weaklistoffset */
2580 0, /* tp_iter */
2581 0, /* tp_iternext */
2582 Pickler_methods, /* tp_methods */
2583 Pickler_members, /* tp_members */
2584 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002585};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002586
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002587static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
2589{
2590 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002592 if (fc) {
2593 if (fc==Py_None) {
2594 PyErr_SetString(UnpicklingError,
2595 "Global and instance pickles are not supported.");
2596 return NULL;
2597 }
2598 return PyObject_CallFunction(fc, "OO", py_module_name,
2599 py_global_name);
2600 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 module = PySys_GetObject("modules");
2603 if (module == NULL)
2604 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606 module = PyDict_GetItem(module, py_module_name);
2607 if (module == NULL) {
2608 module = PyImport_Import(py_module_name);
2609 if (!module)
2610 return NULL;
2611 global = PyObject_GetAttr(module, py_global_name);
2612 Py_DECREF(module);
2613 }
2614 else
2615 global = PyObject_GetAttr(module, py_global_name);
2616 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002617}
2618
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002619static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620marker(Unpicklerobject *self)
2621{
2622 if (self->num_marks < 1) {
2623 PyErr_SetString(UnpicklingError, "could not find MARK");
2624 return -1;
2625 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002628}
2629
Tim Peters84e87f32001-03-17 04:50:51 +00002630
Guido van Rossum60456fd1997-04-09 17:36:32 +00002631static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632load_none(Unpicklerobject *self)
2633{
2634 PDATA_APPEND(self->stack, Py_None, -1);
2635 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636}
2637
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002638static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002639bad_readline(void)
2640{
2641 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2642 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002643}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002644
2645static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002646load_int(Unpicklerobject *self)
2647{
2648 PyObject *py_int = 0;
2649 char *endptr, *s;
2650 int len, res = -1;
2651 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2654 if (len < 2) return bad_readline();
2655 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 errno = 0;
2658 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2661 /* Hm, maybe we've got something long. Let's try reading
2662 it as a Python long object. */
2663 errno = 0;
2664 py_int = PyLong_FromString(s, NULL, 0);
2665 if (py_int == NULL) {
2666 PyErr_SetString(PyExc_ValueError,
2667 "could not convert string to int");
2668 goto finally;
2669 }
2670 }
2671 else {
2672 if (!( py_int = PyInt_FromLong(l))) goto finally;
2673 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002675 free(s);
2676 PDATA_PUSH(self->stack, py_int, -1);
2677 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002679 finally:
2680 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002682 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683}
2684
2685
Tim Peters84e87f32001-03-17 04:50:51 +00002686static long
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687calc_binint(char *s, int x)
2688{
2689 unsigned char c;
2690 int i;
2691 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 for (i = 0, l = 0L; i < x; i++) {
2694 c = (unsigned char)s[i];
2695 l |= (long)c << (i * 8);
2696 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002697#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2699 * is signed, so on a box with longs bigger than 4 bytes we need
2700 * to extend a BININT's sign bit to the full width.
2701 */
2702 if (x == 4 && l & (1L << 31))
2703 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002704#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002705 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002706}
2707
2708
2709static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710load_binintx(Unpicklerobject *self, char *s, int x)
2711{
2712 PyObject *py_int = 0;
2713 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717 if (!( py_int = PyInt_FromLong(l)))
2718 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 PDATA_PUSH(self->stack, py_int, -1);
2721 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722}
2723
2724
2725static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726load_binint(Unpicklerobject *self)
2727{
2728 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730 if ((*self->read_func)(self, &s, 4) < 0)
2731 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734}
2735
2736
2737static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002738load_binint1(Unpicklerobject *self)
2739{
2740 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742 if ((*self->read_func)(self, &s, 1) < 0)
2743 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746}
2747
2748
2749static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750load_binint2(Unpicklerobject *self)
2751{
2752 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 if ((*self->read_func)(self, &s, 2) < 0)
2755 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002757 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758}
Tim Peters84e87f32001-03-17 04:50:51 +00002759
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761load_long(Unpicklerobject *self)
2762{
2763 PyObject *l = 0;
2764 char *end, *s;
2765 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002767 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2768 if (len < 2) return bad_readline();
2769 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002771 if (!( l = PyLong_FromString(s, &end, 0)))
2772 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002774 free(s);
2775 PDATA_PUSH(self->stack, l, -1);
2776 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 finally:
2779 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002782}
2783
Tim Peters84e87f32001-03-17 04:50:51 +00002784
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786load_float(Unpicklerobject *self)
2787{
2788 PyObject *py_float = 0;
2789 char *endptr, *s;
2790 int len, res = -1;
2791 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2794 if (len < 2) return bad_readline();
2795 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 errno = 0;
2798 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2801 PyErr_SetString(PyExc_ValueError,
2802 "could not convert string to float");
2803 goto finally;
2804 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 if (!( py_float = PyFloat_FromDouble(d)))
2807 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 free(s);
2810 PDATA_PUSH(self->stack, py_float, -1);
2811 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002813 finally:
2814 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002817}
2818
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820load_binfloat(Unpicklerobject *self)
2821{
2822 PyObject *py_float = 0;
2823 int s, e;
2824 long fhi, flo;
2825 double x;
2826 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 if ((*self->read_func)(self, &p, 8) < 0)
2829 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 /* First byte */
2832 s = (*p>>7) & 1;
2833 e = (*p & 0x7F) << 4;
2834 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 /* Second byte */
2837 e |= (*p>>4) & 0xF;
2838 fhi = (*p & 0xF) << 24;
2839 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 /* Third byte */
2842 fhi |= (*p & 0xFF) << 16;
2843 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 /* Fourth byte */
2846 fhi |= (*p & 0xFF) << 8;
2847 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 /* Fifth byte */
2850 fhi |= *p & 0xFF;
2851 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 /* Sixth byte */
2854 flo = (*p & 0xFF) << 16;
2855 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857 /* Seventh byte */
2858 flo |= (*p & 0xFF) << 8;
2859 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 /* Eighth byte */
2862 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2865 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 /* XXX This sadly ignores Inf/NaN */
2868 if (e == 0)
2869 e = -1022;
2870 else {
2871 x += 1.0;
2872 e -= 1023;
2873 }
2874 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002876 if (s)
2877 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002881 PDATA_PUSH(self->stack, py_float, -1);
2882 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002884
2885static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886load_string(Unpicklerobject *self)
2887{
2888 PyObject *str = 0;
2889 int len, res = -1, nslash;
2890 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 static PyObject *eval_dict = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002894 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2895 if (len < 2) return bad_readline();
2896 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 /* Check for unquoted quotes (evil strings) */
2899 q=*s;
2900 if (q != '"' && q != '\'') goto insecure;
2901 for (p=s+1, nslash=0; *p; p++) {
2902 if (*p==q && nslash%2==0) break;
2903 if (*p=='\\') nslash++;
2904 else nslash=0;
2905 }
2906 if (*p == q) {
2907 for (p++; *p; p++)
2908 if (*(unsigned char *)p > ' ')
2909 goto insecure;
2910 }
2911 else
2912 goto insecure;
2913 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915 if (!( eval_dict ))
2916 if (!( eval_dict = Py_BuildValue("{s{}}", "__builtins__")))
2917 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 if (!( str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict)))
2920 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 free(s);
2923 PDATA_PUSH(self->stack, str, -1);
2924 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 finally:
2927 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00002930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002931 insecure:
2932 free(s);
2933 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2934 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00002935}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936
2937
2938static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939load_binstring(Unpicklerobject *self)
2940{
2941 PyObject *py_string = 0;
2942 long l;
2943 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 if ((*self->read_func)(self, &s, l) < 0)
2950 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 if (!( py_string = PyString_FromStringAndSize(s, l)))
2953 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002955 PDATA_PUSH(self->stack, py_string, -1);
2956 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002957}
2958
2959
2960static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961load_short_binstring(Unpicklerobject *self)
2962{
2963 PyObject *py_string = 0;
2964 unsigned char l;
2965 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 if ((*self->read_func)(self, &s, 1) < 0)
2968 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 PDATA_PUSH(self->stack, py_string, -1);
2977 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00002978}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979
2980
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002981#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00002982static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983load_unicode(Unpicklerobject *self)
2984{
2985 PyObject *str = 0;
2986 int len, res = -1;
2987 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2990 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002992 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
2993 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 PDATA_PUSH(self->stack, str, -1);
2996 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 finally:
2999 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003000}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003001#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003002
3003
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003004#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003005static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006load_binunicode(Unpicklerobject *self)
3007{
3008 PyObject *unicode;
3009 long l;
3010 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003016 if ((*self->read_func)(self, &s, l) < 0)
3017 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
3020 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003022 PDATA_PUSH(self->stack, unicode, -1);
3023 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003024}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003025#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003026
3027
3028static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029load_tuple(Unpicklerobject *self)
3030{
3031 PyObject *tup;
3032 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 if ((i = marker(self)) < 0) return -1;
3035 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3036 PDATA_PUSH(self->stack, tup, -1);
3037 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038}
3039
3040static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041load_empty_tuple(Unpicklerobject *self)
3042{
3043 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 if (!( tup=PyTuple_New(0))) return -1;
3046 PDATA_PUSH(self->stack, tup, -1);
3047 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048}
3049
3050static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051load_empty_list(Unpicklerobject *self)
3052{
3053 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 if (!( list=PyList_New(0))) return -1;
3056 PDATA_PUSH(self->stack, list, -1);
3057 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058}
3059
3060static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061load_empty_dict(Unpicklerobject *self)
3062{
3063 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065 if (!( dict=PyDict_New())) return -1;
3066 PDATA_PUSH(self->stack, dict, -1);
3067 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068}
3069
3070
3071static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072load_list(Unpicklerobject *self)
3073{
3074 PyObject *list = 0;
3075 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 if ((i = marker(self)) < 0) return -1;
3078 if (!( list=Pdata_popList(self->stack, i))) return -1;
3079 PDATA_PUSH(self->stack, list, -1);
3080 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081}
3082
3083static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084load_dict(Unpicklerobject *self)
3085{
3086 PyObject *dict, *key, *value;
3087 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 if ((i = marker(self)) < 0) return -1;
3090 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 for (k = i+1; k < j; k += 2) {
3095 key =self->stack->data[k-1];
3096 value=self->stack->data[k ];
3097 if (PyDict_SetItem(dict, key, value) < 0) {
3098 Py_DECREF(dict);
3099 return -1;
3100 }
3101 }
3102 Pdata_clear(self->stack, i);
3103 PDATA_PUSH(self->stack, dict, -1);
3104 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105}
3106
3107static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108Instance_New(PyObject *cls, PyObject *args)
3109{
3110 int has_key;
3111 PyObject *safe=0, *r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 if (PyClass_Check(cls)) {
3114 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116 if ((l=PyObject_Size(args)) < 0) goto err;
3117 if (!( l )) {
3118 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 __getinitargs__ = PyObject_GetAttr(cls,
3121 __getinitargs___str);
3122 if (!__getinitargs__) {
3123 /* We have a class with no __getinitargs__,
3124 so bypass usual construction */
3125 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 PyErr_Clear();
3128 if (!( inst=PyInstance_NewRaw(cls, NULL)))
3129 goto err;
3130 return inst;
3131 }
3132 Py_DECREF(__getinitargs__);
3133 }
Tim Peters84e87f32001-03-17 04:50:51 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 if ((r=PyInstance_New(cls, args, NULL))) return r;
3136 else goto err;
3137 }
Tim Peters84e87f32001-03-17 04:50:51 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 /* Is safe_constructors always a dict? */
3140 has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
3141 if (!has_key) {
3142 safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
3143 if (!safe ||
3144 !PyObject_IsTrue(safe)) {
3145 cPickle_ErrFormat(UnpicklingError,
3146 "%s is not safe for unpickling",
3147 "O", cls);
3148 Py_XDECREF(safe);
3149 return NULL;
3150 }
3151 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 if (args==Py_None) {
3154 /* Special case, call cls.__basicnew__() */
3155 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3158 if (!basicnew) return NULL;
3159 r=PyObject_CallObject(basicnew, NULL);
3160 Py_DECREF(basicnew);
3161 if (r) return r;
3162 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 err:
3167 {
3168 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170 PyErr_Fetch(&tp, &v, &tb);
3171 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3172 Py_XDECREF(v);
3173 v=r;
3174 }
3175 PyErr_Restore(tp,v,tb);
3176 }
3177 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178}
Tim Peters84e87f32001-03-17 04:50:51 +00003179
Guido van Rossum60456fd1997-04-09 17:36:32 +00003180
3181static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003182load_obj(Unpicklerobject *self)
3183{
3184 PyObject *class, *tup, *obj=0;
3185 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 if ((i = marker(self)) < 0) return -1;
3188 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3189 PDATA_POP(self->stack, class);
3190 if (class) {
3191 obj = Instance_New(class, tup);
3192 Py_DECREF(class);
3193 }
3194 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if (! obj) return -1;
3197 PDATA_PUSH(self->stack, obj, -1);
3198 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199}
3200
3201
3202static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203load_inst(Unpicklerobject *self)
3204{
3205 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3206 int i, len;
3207 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3212 if (len < 2) return bad_readline();
3213 module_name = PyString_FromStringAndSize(s, len - 1);
3214 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3217 if (len < 2) return bad_readline();
3218 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3219 class = find_class(module_name, class_name,
3220 self->find_class);
3221 Py_DECREF(class_name);
3222 }
3223 }
3224 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 if ((tup=Pdata_popTuple(self->stack, i))) {
3229 obj = Instance_New(class, tup);
3230 Py_DECREF(tup);
3231 }
3232 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003234 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236 PDATA_PUSH(self->stack, obj, -1);
3237 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003238}
3239
3240
3241static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242load_global(Unpicklerobject *self)
3243{
3244 PyObject *class = 0, *module_name = 0, *class_name = 0;
3245 int len;
3246 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3249 if (len < 2) return bad_readline();
3250 module_name = PyString_FromStringAndSize(s, len - 1);
3251 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3254 if (len < 2) return bad_readline();
3255 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
3256 class = find_class(module_name, class_name,
3257 self->find_class);
3258 Py_DECREF(class_name);
3259 }
3260 }
3261 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 if (! class) return -1;
3264 PDATA_PUSH(self->stack, class, -1);
3265 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266}
3267
3268
3269static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270load_persid(Unpicklerobject *self)
3271{
3272 PyObject *pid = 0;
3273 int len;
3274 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 if (self->pers_func) {
3277 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3278 if (len < 2) return bad_readline();
3279
3280 pid = PyString_FromStringAndSize(s, len - 1);
3281 if (!pid) return -1;
3282
3283 if (PyList_Check(self->pers_func)) {
3284 if (PyList_Append(self->pers_func, pid) < 0) {
3285 Py_DECREF(pid);
3286 return -1;
3287 }
3288 }
3289 else {
3290 ARG_TUP(self, pid);
3291 if (self->arg) {
3292 pid = PyObject_Call(self->pers_func, self->arg,
3293 NULL);
3294 FREE_ARG_TUP(self);
3295 }
3296 }
3297
3298 if (! pid) return -1;
3299
3300 PDATA_PUSH(self->stack, pid, -1);
3301 return 0;
3302 }
3303 else {
3304 PyErr_SetString(UnpicklingError,
3305 "A load persistent id instruction was encountered,\n"
3306 "but no persistent_load function was specified.");
3307 return -1;
3308 }
3309}
3310
3311static int
3312load_binpersid(Unpicklerobject *self)
3313{
3314 PyObject *pid = 0;
3315
3316 if (self->pers_func) {
3317 PDATA_POP(self->stack, pid);
3318 if (! pid) return -1;
3319
3320 if (PyList_Check(self->pers_func)) {
3321 if (PyList_Append(self->pers_func, pid) < 0) {
3322 Py_DECREF(pid);
3323 return -1;
3324 }
3325 }
3326 else {
3327 ARG_TUP(self, pid);
3328 if (self->arg) {
3329 pid = PyObject_Call(self->pers_func, self->arg,
3330 NULL);
3331 FREE_ARG_TUP(self);
3332 }
3333 if (! pid) return -1;
3334 }
3335
3336 PDATA_PUSH(self->stack, pid, -1);
3337 return 0;
3338 }
3339 else {
3340 PyErr_SetString(UnpicklingError,
3341 "A load persistent id instruction was encountered,\n"
3342 "but no persistent_load function was specified.");
3343 return -1;
3344 }
3345}
3346
3347
3348static int
3349load_pop(Unpicklerobject *self)
3350{
3351 int len;
3352
3353 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3354
3355 /* Note that we split the (pickle.py) stack into two stacks,
3356 an object stack and a mark stack. We have to be clever and
3357 pop the right one. We do this by looking at the top of the
3358 mark stack.
3359 */
3360
3361 if ((self->num_marks > 0) &&
3362 (self->marks[self->num_marks - 1] == len))
3363 self->num_marks--;
3364 else {
3365 len--;
3366 Py_DECREF(self->stack->data[len]);
3367 self->stack->length=len;
3368 }
3369
3370 return 0;
3371}
3372
3373
3374static int
3375load_pop_mark(Unpicklerobject *self)
3376{
3377 int i;
3378
3379 if ((i = marker(self)) < 0)
3380 return -1;
3381
3382 Pdata_clear(self->stack, i);
3383
3384 return 0;
3385}
3386
3387
3388static int
3389load_dup(Unpicklerobject *self)
3390{
3391 PyObject *last;
3392 int len;
3393
3394 if ((len = self->stack->length) <= 0) return stackUnderflow();
3395 last=self->stack->data[len-1];
3396 Py_INCREF(last);
3397 PDATA_PUSH(self->stack, last, -1);
3398 return 0;
3399}
3400
3401
3402static int
3403load_get(Unpicklerobject *self)
3404{
3405 PyObject *py_str = 0, *value = 0;
3406 int len;
3407 char *s;
3408 int rc;
3409
3410 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003411 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 value = PyDict_GetItem(self->memo, py_str);
3416 if (! value) {
3417 PyErr_SetObject(BadPickleGet, py_str);
3418 rc = -1;
3419 } else {
3420 PDATA_APPEND(self->stack, value, -1);
3421 rc = 0;
3422 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 Py_DECREF(py_str);
3425 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003426}
3427
3428
3429static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430load_binget(Unpicklerobject *self)
3431{
3432 PyObject *py_key = 0, *value = 0;
3433 unsigned char key;
3434 char *s;
3435 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 key = (unsigned char)s[0];
3440 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 value = PyDict_GetItem(self->memo, py_key);
3443 if (! value) {
3444 PyErr_SetObject(BadPickleGet, py_key);
3445 rc = -1;
3446 } else {
3447 PDATA_APPEND(self->stack, value, -1);
3448 rc = 0;
3449 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003451 Py_DECREF(py_key);
3452 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453}
3454
3455
3456static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003457load_long_binget(Unpicklerobject *self)
3458{
3459 PyObject *py_key = 0, *value = 0;
3460 unsigned char c;
3461 char *s;
3462 long key;
3463 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467 c = (unsigned char)s[0];
3468 key = (long)c;
3469 c = (unsigned char)s[1];
3470 key |= (long)c << 8;
3471 c = (unsigned char)s[2];
3472 key |= (long)c << 16;
3473 c = (unsigned char)s[3];
3474 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3477
3478 value = PyDict_GetItem(self->memo, py_key);
3479 if (! value) {
3480 PyErr_SetObject(BadPickleGet, py_key);
3481 rc = -1;
3482 } else {
3483 PDATA_APPEND(self->stack, value, -1);
3484 rc = 0;
3485 }
3486
3487 Py_DECREF(py_key);
3488 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489}
3490
3491
3492static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493load_put(Unpicklerobject *self)
3494{
3495 PyObject *py_str = 0, *value = 0;
3496 int len, l;
3497 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3500 if (l < 2) return bad_readline();
3501 if (!( len=self->stack->length )) return stackUnderflow();
3502 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3503 value=self->stack->data[len-1];
3504 l=PyDict_SetItem(self->memo, py_str, value);
3505 Py_DECREF(py_str);
3506 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507}
3508
3509
3510static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511load_binput(Unpicklerobject *self)
3512{
3513 PyObject *py_key = 0, *value = 0;
3514 unsigned char key;
3515 char *s;
3516 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3519 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3524 value=self->stack->data[len-1];
3525 len=PyDict_SetItem(self->memo, py_key, value);
3526 Py_DECREF(py_key);
3527 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003528}
3529
3530
3531static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532load_long_binput(Unpicklerobject *self)
3533{
3534 PyObject *py_key = 0, *value = 0;
3535 long key;
3536 unsigned char c;
3537 char *s;
3538 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3541 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543 c = (unsigned char)s[0];
3544 key = (long)c;
3545 c = (unsigned char)s[1];
3546 key |= (long)c << 8;
3547 c = (unsigned char)s[2];
3548 key |= (long)c << 16;
3549 c = (unsigned char)s[3];
3550 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if (!( py_key = PyInt_FromLong(key))) return -1;
3553 value=self->stack->data[len-1];
3554 len=PyDict_SetItem(self->memo, py_key, value);
3555 Py_DECREF(py_key);
3556 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557}
3558
3559
3560static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561do_append(Unpicklerobject *self, int x)
3562{
3563 PyObject *value = 0, *list = 0, *append_method = 0;
3564 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566 len=self->stack->length;
3567 if (!( len >= x && x > 0 )) return stackUnderflow();
3568 /* nothing to do */
3569 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003573 if (PyList_Check(list)) {
3574 PyObject *slice;
3575 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003577 slice=Pdata_popList(self->stack, x);
3578 list_len = PyList_GET_SIZE(list);
3579 i=PyList_SetSlice(list, list_len, list_len, slice);
3580 Py_DECREF(slice);
3581 return i;
3582 }
3583 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585 if (!( append_method = PyObject_GetAttr(list, append_str)))
3586 return -1;
3587
3588 for (i = x; i < len; i++) {
3589 PyObject *junk;
3590
3591 value=self->stack->data[i];
3592 junk=0;
3593 ARG_TUP(self, value);
3594 if (self->arg) {
3595 junk = PyObject_Call(append_method, self->arg,
3596 NULL);
3597 FREE_ARG_TUP(self);
3598 }
3599 if (! junk) {
3600 Pdata_clear(self->stack, i+1);
3601 self->stack->length=x;
3602 Py_DECREF(append_method);
3603 return -1;
3604 }
3605 Py_DECREF(junk);
3606 }
3607 self->stack->length=x;
3608 Py_DECREF(append_method);
3609 }
3610
3611 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003612}
3613
3614
3615static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616load_append(Unpicklerobject *self)
3617{
3618 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003619}
3620
3621
3622static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623load_appends(Unpicklerobject *self)
3624{
3625 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003626}
3627
3628
3629static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630do_setitems(Unpicklerobject *self, int x)
3631{
3632 PyObject *value = 0, *key = 0, *dict = 0;
3633 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635 if (!( (len=self->stack->length) >= x
3636 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003640 for (i = x+1; i < len; i += 2) {
3641 key =self->stack->data[i-1];
3642 value=self->stack->data[i ];
3643 if (PyObject_SetItem(dict, key, value) < 0) {
3644 r=-1;
3645 break;
3646 }
3647 }
3648
3649 Pdata_clear(self->stack, x);
3650
3651 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003652}
3653
3654
Tim Peters84e87f32001-03-17 04:50:51 +00003655static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003656load_setitem(Unpicklerobject *self)
3657{
3658 return do_setitems(self, self->stack->length - 2);
3659}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661static int
3662load_setitems(Unpicklerobject *self)
3663{
3664 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665}
3666
Tim Peters84e87f32001-03-17 04:50:51 +00003667
Guido van Rossum60456fd1997-04-09 17:36:32 +00003668static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669load_build(Unpicklerobject *self)
3670{
3671 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3672 *junk = 0, *__setstate__ = 0;
3673 int i, r = 0;
3674
3675 if (self->stack->length < 2) return stackUnderflow();
3676 PDATA_POP(self->stack, value);
3677 if (! value) return -1;
3678 inst=self->stack->data[self->stack->length-1];
3679
3680 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3681 ARG_TUP(self, value);
3682 if (self->arg) {
3683 junk = PyObject_Call(__setstate__, self->arg, NULL);
3684 FREE_ARG_TUP(self);
3685 }
3686 Py_DECREF(__setstate__);
3687 if (! junk) return -1;
3688 Py_DECREF(junk);
3689 return 0;
3690 }
3691
3692 PyErr_Clear();
3693 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3694 i = 0;
3695 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3696 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3697 r=-1;
3698 break;
3699 }
3700 }
3701 Py_DECREF(instdict);
3702 }
3703 else r=-1;
3704
3705 Py_XDECREF(value);
3706
3707 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708}
3709
3710
3711static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712load_mark(Unpicklerobject *self)
3713{
3714 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003716 /* Note that we split the (pickle.py) stack into two stacks, an
3717 object stack and a mark stack. Here we push a mark onto the
3718 mark stack.
3719 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003721 if ((self->num_marks + 1) >= self->marks_size) {
3722 s=self->marks_size+20;
3723 if (s <= self->num_marks) s=self->num_marks + 1;
3724 if (self->marks == NULL)
3725 self->marks=(int *)malloc(s * sizeof(int));
3726 else
3727 self->marks=(int *)realloc(self->marks,
3728 s * sizeof(int));
3729 if (! self->marks) {
3730 PyErr_NoMemory();
3731 return -1;
3732 }
3733 self->marks_size = s;
3734 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003738 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739}
3740
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742load_reduce(Unpicklerobject *self)
3743{
3744 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746 PDATA_POP(self->stack, arg_tup);
3747 if (! arg_tup) return -1;
3748 PDATA_POP(self->stack, callable);
3749 if (callable) {
3750 ob = Instance_New(callable, arg_tup);
3751 Py_DECREF(callable);
3752 }
3753 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003755 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 PDATA_PUSH(self->stack, ob, -1);
3758 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759}
Tim Peters84e87f32001-03-17 04:50:51 +00003760
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762load(Unpicklerobject *self)
3763{
3764 PyObject *err = 0, *val = 0;
3765 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 self->num_marks = 0;
3768 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 while (1) {
3771 if ((*self->read_func)(self, &s, 1) < 0)
3772 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 switch (s[0]) {
3775 case NONE:
3776 if (load_none(self) < 0)
3777 break;
3778 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 case BININT:
3781 if (load_binint(self) < 0)
3782 break;
3783 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 case BININT1:
3786 if (load_binint1(self) < 0)
3787 break;
3788 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003790 case BININT2:
3791 if (load_binint2(self) < 0)
3792 break;
3793 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795 case INT:
3796 if (load_int(self) < 0)
3797 break;
3798 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 case LONG:
3801 if (load_long(self) < 0)
3802 break;
3803 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 case FLOAT:
3806 if (load_float(self) < 0)
3807 break;
3808 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 case BINFLOAT:
3811 if (load_binfloat(self) < 0)
3812 break;
3813 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003815 case BINSTRING:
3816 if (load_binstring(self) < 0)
3817 break;
3818 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820 case SHORT_BINSTRING:
3821 if (load_short_binstring(self) < 0)
3822 break;
3823 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 case STRING:
3826 if (load_string(self) < 0)
3827 break;
3828 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003830#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 case UNICODE:
3832 if (load_unicode(self) < 0)
3833 break;
3834 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 case BINUNICODE:
3837 if (load_binunicode(self) < 0)
3838 break;
3839 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003840#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 case EMPTY_TUPLE:
3843 if (load_empty_tuple(self) < 0)
3844 break;
3845 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003847 case TUPLE:
3848 if (load_tuple(self) < 0)
3849 break;
3850 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003852 case EMPTY_LIST:
3853 if (load_empty_list(self) < 0)
3854 break;
3855 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003857 case LIST:
3858 if (load_list(self) < 0)
3859 break;
3860 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862 case EMPTY_DICT:
3863 if (load_empty_dict(self) < 0)
3864 break;
3865 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003867 case DICT:
3868 if (load_dict(self) < 0)
3869 break;
3870 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872 case OBJ:
3873 if (load_obj(self) < 0)
3874 break;
3875 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 case INST:
3878 if (load_inst(self) < 0)
3879 break;
3880 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882 case GLOBAL:
3883 if (load_global(self) < 0)
3884 break;
3885 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003887 case APPEND:
3888 if (load_append(self) < 0)
3889 break;
3890 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892 case APPENDS:
3893 if (load_appends(self) < 0)
3894 break;
3895 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 case BUILD:
3898 if (load_build(self) < 0)
3899 break;
3900 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902 case DUP:
3903 if (load_dup(self) < 0)
3904 break;
3905 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907 case BINGET:
3908 if (load_binget(self) < 0)
3909 break;
3910 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912 case LONG_BINGET:
3913 if (load_long_binget(self) < 0)
3914 break;
3915 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917 case GET:
3918 if (load_get(self) < 0)
3919 break;
3920 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 case MARK:
3923 if (load_mark(self) < 0)
3924 break;
3925 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 case BINPUT:
3928 if (load_binput(self) < 0)
3929 break;
3930 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case LONG_BINPUT:
3933 if (load_long_binput(self) < 0)
3934 break;
3935 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case PUT:
3938 if (load_put(self) < 0)
3939 break;
3940 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 case POP:
3943 if (load_pop(self) < 0)
3944 break;
3945 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case POP_MARK:
3948 if (load_pop_mark(self) < 0)
3949 break;
3950 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 case SETITEM:
3953 if (load_setitem(self) < 0)
3954 break;
3955 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 case SETITEMS:
3958 if (load_setitems(self) < 0)
3959 break;
3960 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 case STOP:
3963 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 case PERSID:
3966 if (load_persid(self) < 0)
3967 break;
3968 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970 case BINPERSID:
3971 if (load_binpersid(self) < 0)
3972 break;
3973 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 case REDUCE:
3976 if (load_reduce(self) < 0)
3977 break;
3978 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980 case '\0':
3981 /* end of file */
3982 PyErr_SetNone(PyExc_EOFError);
3983 break;
Neil Schemenauerfa79c652002-03-22 23:02:53 +00003984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985 default:
3986 cPickle_ErrFormat(UnpicklingError,
3987 "invalid load key, '%s'.",
3988 "c", s[0]);
3989 return NULL;
3990 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003992 break;
3993 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 if ((err = PyErr_Occurred())) {
3996 if (err == PyExc_EOFError) {
3997 PyErr_SetNone(PyExc_EOFError);
3998 }
3999 return NULL;
4000 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 PDATA_POP(self->stack, val);
4003 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004004}
Tim Peters84e87f32001-03-17 04:50:51 +00004005
Guido van Rossum60456fd1997-04-09 17:36:32 +00004006
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004007/* No-load functions to support noload, which is used to
4008 find persistent references. */
4009
4010static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004011noload_obj(Unpicklerobject *self)
4012{
4013 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004015 if ((i = marker(self)) < 0) return -1;
4016 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004017}
4018
4019
4020static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021noload_inst(Unpicklerobject *self)
4022{
4023 int i;
4024 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004026 if ((i = marker(self)) < 0) return -1;
4027 Pdata_clear(self->stack, i);
4028 if ((*self->readline_func)(self, &s) < 0) return -1;
4029 if ((*self->readline_func)(self, &s) < 0) return -1;
4030 PDATA_APPEND(self->stack, Py_None,-1);
4031 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004032}
4033
4034static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035noload_global(Unpicklerobject *self)
4036{
4037 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 if ((*self->readline_func)(self, &s) < 0) return -1;
4040 if ((*self->readline_func)(self, &s) < 0) return -1;
4041 PDATA_APPEND(self->stack, Py_None,-1);
4042 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004043}
4044
4045static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046noload_reduce(Unpicklerobject *self)
4047{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 if (self->stack->length < 2) return stackUnderflow();
4050 Pdata_clear(self->stack, self->stack->length-2);
4051 PDATA_APPEND(self->stack, Py_None,-1);
4052 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004053}
4054
4055static int
4056noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004057
Guido van Rossum053b8df1998-11-25 16:18:00 +00004058 if (self->stack->length < 1) return stackUnderflow();
4059 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004060 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004061}
4062
4063
4064static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065noload(Unpicklerobject *self)
4066{
4067 PyObject *err = 0, *val = 0;
4068 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004070 self->num_marks = 0;
4071 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 while (1) {
4074 if ((*self->read_func)(self, &s, 1) < 0)
4075 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004077 switch (s[0]) {
4078 case NONE:
4079 if (load_none(self) < 0)
4080 break;
4081 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004083 case BININT:
4084 if (load_binint(self) < 0)
4085 break;
4086 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 case BININT1:
4089 if (load_binint1(self) < 0)
4090 break;
4091 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 case BININT2:
4094 if (load_binint2(self) < 0)
4095 break;
4096 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004098 case INT:
4099 if (load_int(self) < 0)
4100 break;
4101 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 case LONG:
4104 if (load_long(self) < 0)
4105 break;
4106 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 case FLOAT:
4109 if (load_float(self) < 0)
4110 break;
4111 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113 case BINFLOAT:
4114 if (load_binfloat(self) < 0)
4115 break;
4116 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 case BINSTRING:
4119 if (load_binstring(self) < 0)
4120 break;
4121 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 case SHORT_BINSTRING:
4124 if (load_short_binstring(self) < 0)
4125 break;
4126 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 case STRING:
4129 if (load_string(self) < 0)
4130 break;
4131 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004132
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004133#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 case UNICODE:
4135 if (load_unicode(self) < 0)
4136 break;
4137 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 case BINUNICODE:
4140 if (load_binunicode(self) < 0)
4141 break;
4142 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004143#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 case EMPTY_TUPLE:
4146 if (load_empty_tuple(self) < 0)
4147 break;
4148 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004150 case TUPLE:
4151 if (load_tuple(self) < 0)
4152 break;
4153 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 case EMPTY_LIST:
4156 if (load_empty_list(self) < 0)
4157 break;
4158 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 case LIST:
4161 if (load_list(self) < 0)
4162 break;
4163 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004165 case EMPTY_DICT:
4166 if (load_empty_dict(self) < 0)
4167 break;
4168 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 case DICT:
4171 if (load_dict(self) < 0)
4172 break;
4173 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175 case OBJ:
4176 if (noload_obj(self) < 0)
4177 break;
4178 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 case INST:
4181 if (noload_inst(self) < 0)
4182 break;
4183 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 case GLOBAL:
4186 if (noload_global(self) < 0)
4187 break;
4188 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 case APPEND:
4191 if (load_append(self) < 0)
4192 break;
4193 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 case APPENDS:
4196 if (load_appends(self) < 0)
4197 break;
4198 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 case BUILD:
4201 if (noload_build(self) < 0)
4202 break;
4203 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205 case DUP:
4206 if (load_dup(self) < 0)
4207 break;
4208 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 case BINGET:
4211 if (load_binget(self) < 0)
4212 break;
4213 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 case LONG_BINGET:
4216 if (load_long_binget(self) < 0)
4217 break;
4218 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220 case GET:
4221 if (load_get(self) < 0)
4222 break;
4223 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225 case MARK:
4226 if (load_mark(self) < 0)
4227 break;
4228 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 case BINPUT:
4231 if (load_binput(self) < 0)
4232 break;
4233 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 case LONG_BINPUT:
4236 if (load_long_binput(self) < 0)
4237 break;
4238 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case PUT:
4241 if (load_put(self) < 0)
4242 break;
4243 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case POP:
4246 if (load_pop(self) < 0)
4247 break;
4248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case POP_MARK:
4251 if (load_pop_mark(self) < 0)
4252 break;
4253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 case SETITEM:
4256 if (load_setitem(self) < 0)
4257 break;
4258 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case SETITEMS:
4261 if (load_setitems(self) < 0)
4262 break;
4263 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 case STOP:
4266 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 case PERSID:
4269 if (load_persid(self) < 0)
4270 break;
4271 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273 case BINPERSID:
4274 if (load_binpersid(self) < 0)
4275 break;
4276 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 case REDUCE:
4279 if (noload_reduce(self) < 0)
4280 break;
4281 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 default:
4284 cPickle_ErrFormat(UnpicklingError,
4285 "invalid load key, '%s'.",
4286 "c", s[0]);
4287 return NULL;
4288 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 break;
4291 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 if ((err = PyErr_Occurred())) {
4294 if (err == PyExc_EOFError) {
4295 PyErr_SetNone(PyExc_EOFError);
4296 }
4297 return NULL;
4298 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 PDATA_POP(self->stack, val);
4301 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004302}
Tim Peters84e87f32001-03-17 04:50:51 +00004303
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004304
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306Unpickler_load(Unpicklerobject *self, PyObject *args)
4307{
4308 if (!( PyArg_ParseTuple(args, ":load")))
4309 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312}
4313
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004314static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004315Unpickler_noload(Unpicklerobject *self, PyObject *args)
4316{
4317 if (!( PyArg_ParseTuple(args, ":noload")))
4318 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004321}
4322
Guido van Rossum60456fd1997-04-09 17:36:32 +00004323
4324static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004325 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004326 "load() -- Load a pickle"
4327 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004328 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004329 "noload() -- not load a pickle, but go through most of the motions\n"
4330 "\n"
4331 "This function can be used to read past a pickle without instantiating\n"
4332 "any objects or importing any modules. It can also be used to find all\n"
4333 "persistent references without instantiating any objects or importing\n"
4334 "any modules.\n"
4335 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336 {NULL, NULL} /* sentinel */
4337};
4338
4339
4340static Unpicklerobject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341newUnpicklerobject(PyObject *f)
4342{
4343 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
4346 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348 self->file = NULL;
4349 self->arg = NULL;
4350 self->stack = (Pdata*)Pdata_New();
4351 self->pers_func = NULL;
4352 self->last_string = NULL;
4353 self->marks = NULL;
4354 self->num_marks = 0;
4355 self->marks_size = 0;
4356 self->buf_size = 0;
4357 self->read = NULL;
4358 self->readline = NULL;
4359 self->safe_constructors = NULL;
4360 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 if (!( self->memo = PyDict_New()))
4363 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004365 Py_INCREF(f);
4366 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 /* Set read, readline based on type of f */
4369 if (PyFile_Check(f)) {
4370 self->fp = PyFile_AsFile(f);
4371 if (self->fp == NULL) {
4372 PyErr_SetString(PyExc_ValueError,
4373 "I/O operation on closed file");
4374 goto err;
4375 }
4376 self->read_func = read_file;
4377 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004378 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 else if (PycStringIO_InputCheck(f)) {
4380 self->fp = NULL;
4381 self->read_func = read_cStringIO;
4382 self->readline_func = readline_cStringIO;
4383 }
4384 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 self->fp = NULL;
4387 self->read_func = read_other;
4388 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4391 (self->read = PyObject_GetAttr(f, read_str)))) {
4392 PyErr_Clear();
4393 PyErr_SetString( PyExc_TypeError,
4394 "argument must have 'read' and "
4395 "'readline' attributes" );
4396 goto err;
4397 }
4398 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 if (PyEval_GetRestricted()) {
4401 /* Restricted execution, get private tables */
4402 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404 if (!( m=PyImport_Import(copy_reg_str))) goto err;
4405 self->safe_constructors=PyObject_GetAttr(m,
4406 safe_constructors_str);
4407 Py_DECREF(m);
4408 if (!( self->safe_constructors )) goto err;
4409 }
4410 else {
4411 self->safe_constructors=safe_constructors;
4412 Py_INCREF(safe_constructors);
4413 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 err:
4418 Py_DECREF((PyObject *)self);
4419 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004420}
4421
4422
4423static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424get_Unpickler(PyObject *self, PyObject *args)
4425{
4426 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
4429 return NULL;
4430 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004431}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004432
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004433
Guido van Rossum60456fd1997-04-09 17:36:32 +00004434static void
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435Unpickler_dealloc(Unpicklerobject *self)
4436{
4437 Py_XDECREF(self->readline);
4438 Py_XDECREF(self->read);
4439 Py_XDECREF(self->file);
4440 Py_XDECREF(self->memo);
4441 Py_XDECREF(self->stack);
4442 Py_XDECREF(self->pers_func);
4443 Py_XDECREF(self->arg);
4444 Py_XDECREF(self->last_string);
4445 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 if (self->marks) {
4448 free(self->marks);
4449 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004451 if (self->buf_size) {
4452 free(self->buf);
4453 }
Tim Peters84e87f32001-03-17 04:50:51 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004456}
4457
4458
4459static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460Unpickler_getattr(Unpicklerobject *self, char *name)
4461{
4462 if (!strcmp(name, "persistent_load")) {
4463 if (!self->pers_func) {
4464 PyErr_SetString(PyExc_AttributeError, name);
4465 return NULL;
4466 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468 Py_INCREF(self->pers_func);
4469 return self->pers_func;
4470 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 if (!strcmp(name, "find_global")) {
4473 if (!self->find_class) {
4474 PyErr_SetString(PyExc_AttributeError, name);
4475 return NULL;
4476 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 Py_INCREF(self->find_class);
4479 return self->find_class;
4480 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 if (!strcmp(name, "memo")) {
4483 if (!self->memo) {
4484 PyErr_SetString(PyExc_AttributeError, name);
4485 return NULL;
4486 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488 Py_INCREF(self->memo);
4489 return self->memo;
4490 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 if (!strcmp(name, "UnpicklingError")) {
4493 Py_INCREF(UnpicklingError);
4494 return UnpicklingError;
4495 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004499
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500
4501static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
4503{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 if (!strcmp(name, "persistent_load")) {
4506 Py_XDECREF(self->pers_func);
4507 self->pers_func = value;
4508 Py_XINCREF(value);
4509 return 0;
4510 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 if (!strcmp(name, "find_global")) {
4513 Py_XDECREF(self->find_class);
4514 self->find_class = value;
4515 Py_XINCREF(value);
4516 return 0;
4517 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 if (! value) {
4520 PyErr_SetString(PyExc_TypeError,
4521 "attribute deletion is not supported");
4522 return -1;
4523 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 if (strcmp(name, "memo") == 0) {
4526 if (!PyDict_Check(value)) {
4527 PyErr_SetString(PyExc_TypeError,
4528 "memo must be a dictionary");
4529 return -1;
4530 }
4531 Py_XDECREF(self->memo);
4532 self->memo = value;
4533 Py_INCREF(value);
4534 return 0;
4535 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 PyErr_SetString(PyExc_AttributeError, name);
4538 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004539}
4540
4541
4542static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543cpm_dump(PyObject *self, PyObject *args)
4544{
4545 PyObject *ob, *file, *res = NULL;
4546 Picklerobject *pickler = 0;
4547 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin)))
4550 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 if (!( pickler = newPicklerobject(file, bin)))
4553 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 if (dump(pickler, ob) < 0)
4556 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 Py_INCREF(Py_None);
4559 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 finally:
4562 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565}
4566
4567
4568static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569cpm_dumps(PyObject *self, PyObject *args)
4570{
4571 PyObject *ob, *file = 0, *res = NULL;
4572 Picklerobject *pickler = 0;
4573 int bin = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &bin)))
4576 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 if (!( file = PycStringIO->NewOutput(128)))
4579 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 if (!( pickler = newPicklerobject(file, bin)))
4582 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 if (dump(pickler, ob) < 0)
4585 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589 finally:
4590 Py_XDECREF(pickler);
4591 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004594}
4595
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004596
4597static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598cpm_load(PyObject *self, PyObject *args)
4599{
4600 Unpicklerobject *unpickler = 0;
4601 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
4604 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 if (!( unpickler = newUnpicklerobject(ob)))
4607 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 finally:
4612 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004614 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004615}
4616
4617
4618static PyObject *
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619cpm_loads(PyObject *self, PyObject *args)
4620{
4621 PyObject *ob, *file = 0, *res = NULL;
4622 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
4625 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 if (!( file = PycStringIO->NewInput(ob)))
4628 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630 if (!( unpickler = newUnpicklerobject(file)))
4631 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004635 finally:
4636 Py_XDECREF(file);
4637 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004639 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004640}
4641
4642
Tim Peters84e87f32001-03-17 04:50:51 +00004643static char Unpicklertype__doc__[] =
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004644"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004645
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004646static PyTypeObject Unpicklertype = {
4647 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004648 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004649 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004650 sizeof(Unpicklerobject), /*tp_basicsize*/
4651 0, /*tp_itemsize*/
4652 /* methods */
4653 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4654 (printfunc)0, /*tp_print*/
4655 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4656 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4657 (cmpfunc)0, /*tp_compare*/
4658 (reprfunc)0, /*tp_repr*/
4659 0, /*tp_as_number*/
4660 0, /*tp_as_sequence*/
4661 0, /*tp_as_mapping*/
4662 (hashfunc)0, /*tp_hash*/
4663 (ternaryfunc)0, /*tp_call*/
4664 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004665
Guido van Rossum60456fd1997-04-09 17:36:32 +00004666 /* Space for future expansion */
4667 0L,0L,0L,0L,
4668 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004669};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004670
Guido van Rossum60456fd1997-04-09 17:36:32 +00004671static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004672 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673 "dump(object, file, [binary]) --"
4674 "Write an object in pickle format to the given file\n"
4675 "\n"
4676 "If the optional argument, binary, is provided and is true, then the\n"
4677 "pickle will be written in binary format, which is more space and\n"
4678 "computationally efficient. \n"
4679 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004680 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004681 "dumps(object, [binary]) --"
4682 "Return a string containing an object in pickle format\n"
4683 "\n"
4684 "If the optional argument, binary, is provided and is true, then the\n"
4685 "pickle will be written in binary format, which is more space and\n"
4686 "computationally efficient. \n"
4687 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004688 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004689 "load(file) -- Load a pickle from the given file"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004690 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004691 "loads(string) -- Load a pickle from the given string"},
Neal Norwitzb0493252002-03-31 14:44:22 +00004692 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004693 "Pickler(file, [binary]) -- Create a pickler\n"
4694 "\n"
4695 "If the optional argument, binary, is provided and is true, then\n"
4696 "pickles will be written in binary format, which is more space and\n"
4697 "computationally efficient. \n"
4698 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004699 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004700 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004701 { NULL, NULL }
4702};
4703
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704static int
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705init_stuff(PyObject *module_dict)
4706{
4707 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004708
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004709#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 INIT_STR(__class__);
4712 INIT_STR(__getinitargs__);
4713 INIT_STR(__dict__);
4714 INIT_STR(__getstate__);
4715 INIT_STR(__setstate__);
4716 INIT_STR(__name__);
4717 INIT_STR(__main__);
4718 INIT_STR(__reduce__);
4719 INIT_STR(write);
4720 INIT_STR(__safe_for_unpickling__);
4721 INIT_STR(append);
4722 INIT_STR(read);
4723 INIT_STR(readline);
4724 INIT_STR(copy_reg);
4725 INIT_STR(dispatch_table);
4726 INIT_STR(safe_constructors);
4727 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
4730 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 /* These next few are special because we want to use different
4733 ones in restricted mode. */
4734 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
4735 if (!dispatch_table)
4736 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 if (!( safe_constructors = PyObject_GetAttr(copy_reg,
4739 safe_constructors_str)))
4740 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004744 /* Down to here ********************************** */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if (!( empty_tuple = PyTuple_New(0)))
4747 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 /* Ugh */
4750 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4751 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4752 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 if (!( t=PyDict_New())) return -1;
4755 if (!( r=PyRun_String(
4756 "def __init__(self, *args): self.args=args\n\n"
4757 "def __str__(self):\n"
4758 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4759 Py_file_input,
4760 module_dict, t) )) return -1;
4761 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
4764 if (!PickleError)
4765 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 PicklingError = PyErr_NewException("cPickle.PicklingError",
4770 PickleError, NULL);
4771 if (!PicklingError)
4772 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 if (!( t=PyDict_New())) return -1;
4775 if (!( r=PyRun_String(
4776 "def __init__(self, *args): self.args=args\n\n"
4777 "def __str__(self):\n"
4778 " a=self.args\n"
4779 " a=a and type(a[0]) or '(what)'\n"
4780 " return 'Cannot pickle %s objects' % a\n"
4781 , Py_file_input,
4782 module_dict, t) )) return -1;
4783 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 if (!( UnpickleableError = PyErr_NewException(
4786 "cPickle.UnpickleableError", PicklingError, t)))
4787 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004791 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
4792 PickleError, NULL)))
4793 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 if (PyDict_SetItemString(module_dict, "PickleError",
4796 PickleError) < 0)
4797 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 if (PyDict_SetItemString(module_dict, "PicklingError",
4800 PicklingError) < 0)
4801 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4804 UnpicklingError) < 0)
4805 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4808 UnpickleableError) < 0)
4809 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 if (!( BadPickleGet = PyString_FromString("cPickle.BadPickleGet")))
4812 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4815 BadPickleGet) < 0)
4816 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004820 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004821}
4822
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004823#ifndef DL_EXPORT /* declarations for DLL import/export */
4824#define DL_EXPORT(RTYPE) RTYPE
4825#endif
Guido van Rossum50f385c1998-12-04 18:48:44 +00004826DL_EXPORT(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827initcPickle(void)
4828{
4829 PyObject *m, *d, *di, *v, *k;
4830 int i;
4831 char *rev="1.71";
4832 PyObject *format_version;
4833 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835 Picklertype.ob_type = &PyType_Type;
4836 Picklertype.tp_getattro = PyObject_GenericGetAttr;
4837 Picklertype.tp_setattro = PyObject_GenericSetAttr;
4838 Unpicklertype.ob_type = &PyType_Type;
4839 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004841 /* Initialize some pieces. We need to do this before module creation,
4842 so we're forced to use a temporary dictionary. :(
4843 */
4844 di=PyDict_New();
4845 if (!di) return;
4846 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00004847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004848 /* Create the module and add the functions */
4849 m = Py_InitModule4("cPickle", cPickle_methods,
4850 cPickle_module_documentation,
4851 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004853 /* Add some symbolic constants to the module */
4854 d = PyModule_GetDict(m);
4855 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
4856 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 /* Copy data from di. Waaa. */
4859 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
4860 if (PyObject_SetItem(d, k, v) < 0) {
4861 Py_DECREF(di);
4862 return;
4863 }
4864 }
4865 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 format_version = PyString_FromString("1.3");
4868 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004870 PyDict_SetItemString(d, "format_version", format_version);
4871 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
4872 Py_XDECREF(format_version);
4873 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004874}