blob: a73a7874f5e7f8fc59f49cc3bd08663591c86535 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001/*
Guido van Rossum053b8df1998-11-25 16:18:00 +00002 * cPickle.c,v 1.61 1998/11/10 00:48:51 jim Exp
3 *
4 * Copyright (c) 1996-1998, Digital Creations, Fredericksburg, VA, USA.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * o Redistributions of source code must retain the above copyright
12 * notice, this list of conditions, and the disclaimer that follows.
13 *
14 * 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.
18 *
19 * 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.
22 *
23 *
24 * 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.
36 *
37 #
38 # 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
49static 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 Rossum053b8df1998-11-25 16:18:00 +000052"cPickle.c,v 1.61 1998/11/10 00:48:51 jim Exp\n"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000053;
54
55#include "Python.h"
56#include "cStringIO.h"
Guido van Rossum60456fd1997-04-09 17:36:32 +000057#include "mymath.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +000058
Guido van Rossum142eeb81997-08-13 03:14:41 +000059#ifndef Py_eval_input
60#include <graminit.h>
61#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000062#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000063
Guido van Rossum2f4caa41997-01-06 22:59:08 +000064#include <errno.h>
65
Guido van Rossum2f4caa41997-01-06 22:59:08 +000066#define UNLESS(E) if (!(E))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000067
Guido van Rossum60456fd1997-04-09 17:36:32 +000068#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000069
Guido van Rossum60456fd1997-04-09 17:36:32 +000070#define WRITE_BUF_SIZE 256
71
72
73#define MARK '('
74#define STOP '.'
75#define POP '0'
76#define POP_MARK '1'
77#define DUP '2'
78#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000079#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000080#define INT 'I'
81#define BININT 'J'
82#define BININT1 'K'
83#define LONG 'L'
84#define BININT2 'M'
85#define NONE 'N'
86#define PERSID 'P'
87#define BINPERSID 'Q'
88#define REDUCE 'R'
89#define STRING 'S'
90#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091#define SHORT_BINSTRING 'U'
Guido van Rossum60456fd1997-04-09 17:36:32 +000092#define APPEND 'a'
93#define BUILD 'b'
94#define GLOBAL 'c'
95#define DICT 'd'
96#define EMPTY_DICT '}'
97#define APPENDS 'e'
98#define GET 'g'
99#define BINGET 'h'
100#define INST 'i'
101#define LONG_BINGET 'j'
102#define LIST 'l'
103#define EMPTY_LIST ']'
104#define OBJ 'o'
105#define PUT 'p'
106#define BINPUT 'q'
107#define LONG_BINPUT 'r'
108#define SETITEM 's'
109#define TUPLE 't'
110#define EMPTY_TUPLE ')'
111#define SETITEMS 'u'
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000112
Guido van Rossum60456fd1997-04-09 17:36:32 +0000113static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000114
115/* atol function from string module */
116static PyObject *atol_func;
117
118static PyObject *PicklingError;
119static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000120static PyObject *BadPickleGet;
121
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000122
Guido van Rossum60456fd1997-04-09 17:36:32 +0000123static PyObject *dispatch_table;
124static PyObject *safe_constructors;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000125static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000126
Guido van Rossum60456fd1997-04-09 17:36:32 +0000127static PyObject *__class___str, *__getinitargs___str, *__dict___str,
128 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
129 *write_str, *__safe_for_unpickling___str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000130 *read_str, *readline_str, *__main___str, *__basicnew___str,
Guido van Rossum053b8df1998-11-25 16:18:00 +0000131 *copy_reg_str, *dispatch_table_str, *safe_constructors_str, *empty_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000132
Guido van Rossum60456fd1997-04-09 17:36:32 +0000133static int save();
134static int put2();
135
Guido van Rossum053b8df1998-11-25 16:18:00 +0000136#ifndef PyList_SET_ITEM
137#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))
138#endif
139#ifndef PyList_GET_SIZE
140#define PyList_GET_SIZE(op) (((PyListObject *)(op))->ob_size)
141#endif
142#ifndef PyTuple_SET_ITEM
143#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = (v))
144#endif
145#ifndef PyTuple_GET_SIZE
146#define PyTuple_GET_SIZE(op) (((PyTupleObject *)(op))->ob_size)
147#endif
148#ifndef PyString_GET_SIZE
149#define PyString_GET_SIZE(op) (((PyStringObject *)(op))->ob_size)
150#endif
151
152/*************************************************************************
153 Internal Data type for pickle data. */
154
155typedef struct {
156 PyObject_HEAD
157 int length, size;
158 PyObject **data;
159} Pdata;
160
161static void
162Pdata_dealloc(Pdata *self) {
163 int i;
164 PyObject **p;
165
166 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
167
168 if (self->data) free(self->data);
169
170 PyMem_DEL(self);
171}
172
173static PyTypeObject PdataType = {
174 PyObject_HEAD_INIT(NULL) 0, "Pdata", sizeof(Pdata), 0,
175 (destructor)Pdata_dealloc,
176 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
177};
178
179#define Pdata_Check(O) ((O)->ob_type == &PdataType)
180
181static PyObject *
182Pdata_New() {
183 Pdata *self;
184
185 UNLESS (self = PyObject_NEW(Pdata, &PdataType)) return NULL;
186 self->size=8;
187 self->length=0;
188 self->data=malloc(self->size * sizeof(PyObject*));
189 if (self->data) return (PyObject*)self;
190 Py_DECREF(self);
191 return PyErr_NoMemory();
192}
193
194static int
195stackUnderflow() {
196 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
197 return -1;
198}
199
200static int
201Pdata_clear(Pdata *self, int clearto) {
202 int i;
203 PyObject **p;
204
205 if (clearto < 0) return stackUnderflow();
206 if (clearto >= self->length) return 0;
207
208 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
209 Py_DECREF(*p);
210 self->length=clearto;
211
212 return 0;
213}
214
215
216static int
217Pdata_grow(Pdata *self) {
218 if (! self->size) {
219 PyErr_NoMemory();
220 return -1;
221 }
222 self->size *= 2;
223 self->data = realloc(self->data, self->size*sizeof(PyObject*));
224 if (! self->data) {
225 self->size = 0;
226 PyErr_NoMemory();
227 return -1;
228 }
229 return 0;
230}
231
232#define PDATA_POP(D,V) { \
233 if ((D)->length) V=D->data[--((D)->length)]; \
234 else { \
235 PyErr_SetString(UnpicklingError, "bad pickle data"); \
236 V=NULL; \
237 } \
238}
239
240
241static PyObject *
242Pdata_popTuple(Pdata *self, int start) {
243 PyObject *r;
244 int i, j, l;
245
246 l=self->length-start;
247 UNLESS (r=PyTuple_New(l)) return NULL;
248 for (i=start, j=0 ; j < l; )
249 PyTuple_SET_ITEM(r,j++,self->data[i++]);
250
251 self->length=start;
252 return r;
253}
254
255static PyObject *
256Pdata_popList(Pdata *self, int start) {
257 PyObject *r;
258 int i, j, l;
259
260 l=self->length-start;
261 UNLESS (r=PyList_New(l)) return NULL;
262 for (i=start, j=0 ; j < l; )
263 PyList_SET_ITEM(r,j++,self->data[i++]);
264
265 self->length=start;
266 return r;
267}
268
269#define PDATA_APPEND_(D,O,ER) { \
270 if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
271}
272
273#define PDATA_APPEND(D,O,ER) { \
274 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
275 Pdata_grow((Pdata*)(D)) < 0) \
276 return ER; \
277 Py_INCREF(O); \
278 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
279}
280
281#define PDATA_PUSH(D,O,ER) { \
282 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
283 Pdata_grow((Pdata*)(D)) < 0) { \
284 Py_DECREF(O); \
285 return ER; \
286 } \
287 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
288}
289
290/*************************************************************************/
291
292#define ARG_TUP(self, o) { \
293 if (self->arg || (self->arg=PyTuple_New(1))) { \
294 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
295 PyTuple_SET_ITEM(self->arg,0,o); \
296 } \
297 else { \
298 Py_DECREF(o); \
299 } \
300}
301
302#define FREE_ARG_TUP(self) { \
303 if (self->arg->ob_refcnt > 1) { \
304 Py_DECREF(self->arg); \
305 self->arg=NULL; \
306 } \
307 }
308
Guido van Rossum60456fd1997-04-09 17:36:32 +0000309typedef struct {
310 PyObject_HEAD
311 FILE *fp;
312 PyObject *write;
313 PyObject *file;
314 PyObject *memo;
315 PyObject *arg;
316 PyObject *pers_func;
317 PyObject *inst_pers_func;
318 int bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000319 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000320 int (*write_func)();
321 char *write_buf;
322 int buf_size;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000323 PyObject *dispatch_table;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000324} Picklerobject;
325
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000326staticforward PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000327
Guido van Rossum60456fd1997-04-09 17:36:32 +0000328typedef struct {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000329 PyObject_HEAD
330 FILE *fp;
331 PyObject *file;
332 PyObject *readline;
333 PyObject *read;
334 PyObject *memo;
335 PyObject *arg;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000336 Pdata *stack;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000337 PyObject *mark;
338 PyObject *pers_func;
339 PyObject *last_string;
340 int *marks;
341 int num_marks;
342 int marks_size;
343 int (*read_func)();
344 int (*readline_func)();
345 int buf_size;
346 char *buf;
347 PyObject *safe_constructors;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000348} Unpicklerobject;
349
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000350staticforward PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000351
Guido van Rossum60456fd1997-04-09 17:36:32 +0000352int
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000353cPickle_PyMapping_HasKey(PyObject *o, PyObject *key) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000354 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000355
Guido van Rossum053b8df1998-11-25 16:18:00 +0000356 if ((v = PyObject_GetItem(o,key))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000357 Py_DECREF(v);
358 return 1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000359 }
360
Guido van Rossum60456fd1997-04-09 17:36:32 +0000361 PyErr_Clear();
362 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000363}
364
Guido van Rossumd385d591997-04-09 17:47:47 +0000365static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000366PyObject *
367#ifdef HAVE_STDARG_PROTOTYPES
368/* VARARGS 2 */
Guido van Rossum57d9f2e1998-01-19 23:18:18 +0000369cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000370#else
371/* VARARGS */
Guido van Rossum57d9f2e1998-01-19 23:18:18 +0000372cPickle_ErrFormat(va_alist) va_dcl {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000373#endif
Guido van Rossum60456fd1997-04-09 17:36:32 +0000374 va_list va;
375 PyObject *args=0, *retval=0;
376#ifdef HAVE_STDARG_PROTOTYPES
377 va_start(va, format);
378#else
379 PyObject *ErrType;
380 char *stringformat, *format;
381 va_start(va);
382 ErrType = va_arg(va, PyObject *);
383 stringformat = va_arg(va, char *);
384 format = va_arg(va, char *);
385#endif
386
Guido van Rossum053b8df1998-11-25 16:18:00 +0000387 if (format) args = Py_VaBuildValue(format, va);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000388 va_end(va);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000389 if (format && ! args) return NULL;
390 if (stringformat && !(retval=PyString_FromString(stringformat))) return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000391
Guido van Rossum053b8df1998-11-25 16:18:00 +0000392 if (retval) {
393 if (args) {
394 PyObject *v;
395 v=PyString_Format(retval, args);
396 Py_DECREF(retval);
397 Py_DECREF(args);
398 if (! v) return NULL;
399 retval=v;
400 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000401 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000402 else
Guido van Rossum053b8df1998-11-25 16:18:00 +0000403 if (args) retval=args;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000404 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000405 PyErr_SetObject(ErrType,Py_None);
406 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000407 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000408 PyErr_SetObject(ErrType,retval);
409 Py_DECREF(retval);
410 return NULL;
411}
412
413static int
414write_file(Picklerobject *self, char *s, int n) {
415 if (s == NULL) {
416 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000417 }
418
Guido van Rossum60456fd1997-04-09 17:36:32 +0000419 if ((int)fwrite(s, sizeof(char), n, self->fp) != n) {
420 PyErr_SetFromErrno(PyExc_IOError);
421 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000422 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000423
424 return n;
425}
426
Guido van Rossum60456fd1997-04-09 17:36:32 +0000427static int
428write_cStringIO(Picklerobject *self, char *s, int n) {
429 if (s == NULL) {
430 return 0;
431 }
432
433 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
434 return -1;
435 }
436
437 return n;
438}
439
Guido van Rossum60456fd1997-04-09 17:36:32 +0000440static int
Guido van Rossum142eeb81997-08-13 03:14:41 +0000441write_none(Picklerobject *self, char *s, int n) {
442 if (s == NULL) return 0;
443 return n;
444}
445
Guido van Rossum142eeb81997-08-13 03:14:41 +0000446static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000447write_other(Picklerobject *self, char *s, int n) {
448 PyObject *py_str = 0, *junk = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000449
450 if (s == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000451 UNLESS (self->buf_size) return 0;
452 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000453 PyString_FromStringAndSize(self->write_buf, self->buf_size))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000454 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455 }
456 else {
457 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
458 if (write_other(self, NULL, 0) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000459 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460 }
461
462 if (n > WRITE_BUF_SIZE) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000463 UNLESS (py_str =
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464 PyString_FromStringAndSize(s, n))
Guido van Rossum053b8df1998-11-25 16:18:00 +0000465 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466 }
467 else {
468 memcpy(self->write_buf + self->buf_size, s, n);
469 self->buf_size += n;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000470 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000471 }
472 }
473
Guido van Rossum053b8df1998-11-25 16:18:00 +0000474 if (self->write) {
475 /* object with write method */
476 ARG_TUP(self, py_str);
477 if (self->arg) {
478 junk = PyObject_CallObject(self->write, self->arg);
479 FREE_ARG_TUP(self);
480 }
481 if (junk) Py_DECREF(junk);
482 else return -1;
483 }
484 else
485 PDATA_PUSH(self->file, py_str, -1);
486
487 self->buf_size = 0;
488 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000489}
490
491
492static int
493read_file(Unpicklerobject *self, char **s, int n) {
494
495 if (self->buf_size == 0) {
496 int size;
497
498 size = ((n < 32) ? 32 : n);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000499 UNLESS (self->buf = (char *)malloc(size * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500 PyErr_NoMemory();
501 return -1;
502 }
503
504 self->buf_size = size;
505 }
506 else if (n > self->buf_size) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000507 UNLESS (self->buf = (char *)realloc(self->buf, n * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000508 PyErr_NoMemory();
509 return -1;
510 }
511
512 self->buf_size = n;
513 }
514
515 if ((int)fread(self->buf, sizeof(char), n, self->fp) != n) {
516 if (feof(self->fp)) {
517 PyErr_SetNone(PyExc_EOFError);
518 return -1;
519 }
520
521 PyErr_SetFromErrno(PyExc_IOError);
522 return -1;
523 }
524
525 *s = self->buf;
526
527 return n;
528}
529
530
531static int
532readline_file(Unpicklerobject *self, char **s) {
533 int i;
534
535 if (self->buf_size == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000536 UNLESS (self->buf = (char *)malloc(40 * sizeof(char))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000537 PyErr_NoMemory();
538 return -1;
539 }
540
541 self->buf_size = 40;
542 }
543
544 i = 0;
545 while (1) {
546 for (; i < (self->buf_size - 1); i++) {
547 if (feof(self->fp) || (self->buf[i] = getc(self->fp)) == '\n') {
548 self->buf[i + 1] = '\0';
549 *s = self->buf;
550 return i + 1;
551 }
552 }
553
Guido van Rossum053b8df1998-11-25 16:18:00 +0000554 UNLESS (self->buf = (char *)realloc(self->buf,
Guido van Rossum60456fd1997-04-09 17:36:32 +0000555 (self->buf_size * 2) * sizeof(char))) {
556 PyErr_NoMemory();
557 return -1;
558 }
559
560 self->buf_size *= 2;
561 }
562
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000563}
564
565
566static int
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567read_cStringIO(Unpicklerobject *self, char **s, int n) {
568 char *ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000569
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
571 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000572 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000573 }
574
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575 *s = ptr;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000576
Guido van Rossum60456fd1997-04-09 17:36:32 +0000577 return n;
578}
579
580
581static int
582readline_cStringIO(Unpicklerobject *self, char **s) {
583 int n;
584 char *ptr;
585
586 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
587 return -1;
588 }
589
590 *s = ptr;
591
592 return n;
593}
594
595
596static int
597read_other(Unpicklerobject *self, char **s, int n) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000598 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000599 int res = -1;
600
Guido van Rossum053b8df1998-11-25 16:18:00 +0000601 UNLESS (bytes = PyInt_FromLong(n)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000602
Guido van Rossum053b8df1998-11-25 16:18:00 +0000603 ARG_TUP(self, bytes);
604 if (self->arg) {
605 str = PyObject_CallObject(self->read, self->arg);
606 FREE_ARG_TUP(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000607 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000608 if (! str) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
610 Py_XDECREF(self->last_string);
611 self->last_string = str;
612
Guido van Rossum053b8df1998-11-25 16:18:00 +0000613 if (! (*s = PyString_AsString(str))) return -1;
614 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615}
616
617
618static int
619readline_other(Unpicklerobject *self, char **s) {
620 PyObject *str;
621 int str_size;
622
Guido van Rossum053b8df1998-11-25 16:18:00 +0000623 UNLESS (str = PyObject_CallObject(self->readline, empty_tuple)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000624 return -1;
625 }
626
Guido van Rossum053b8df1998-11-25 16:18:00 +0000627 if ((str_size = PyString_Size(str)) < 0)
628 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629
630 Py_XDECREF(self->last_string);
631 self->last_string = str;
632
Guido van Rossum053b8df1998-11-25 16:18:00 +0000633 if (! (*s = PyString_AsString(str)))
634 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
636 return str_size;
637}
638
639
640static char *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000641pystrndup(char *s, int l) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642 char *r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000643 UNLESS (r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory();
Guido van Rossum60456fd1997-04-09 17:36:32 +0000644 memcpy(r,s,l);
645 r[l]=0;
646 return r;
647}
648
649
650static int
651get(Picklerobject *self, PyObject *id) {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000652 PyObject *value, *mv;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653 long c_value;
654 char s[30];
655 int len;
656
Guido van Rossum053b8df1998-11-25 16:18:00 +0000657 UNLESS (mv = PyDict_GetItem(self->memo, id)) {
658 PyErr_SetObject(PyExc_KeyError, id);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000660 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000661
Guido van Rossum053b8df1998-11-25 16:18:00 +0000662 UNLESS (value = PyTuple_GetItem(mv, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000663 return -1;
664
Guido van Rossum053b8df1998-11-25 16:18:00 +0000665 UNLESS (PyInt_Check(value)) {
666 PyErr_SetString(PicklingError, "no int where int expected in memo");
667 return -1;
668 }
669 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000670
671 if (!self->bin) {
672 s[0] = GET;
673 sprintf(s + 1, "%ld\n", c_value);
674 len = strlen(s);
675 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000676 else if (Pdata_Check(self->file)) {
677 if (write_other(self, NULL, 0) < 0) return -1;
678 PDATA_APPEND(self->file, mv, -1);
679 return 0;
680 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000681 else {
682 if (c_value < 256) {
683 s[0] = BINGET;
684 s[1] = (int)(c_value & 0xff);
685 len = 2;
686 }
687 else {
688 s[0] = LONG_BINGET;
689 s[1] = (int)(c_value & 0xff);
690 s[2] = (int)((c_value >> 8) & 0xff);
691 s[3] = (int)((c_value >> 16) & 0xff);
692 s[4] = (int)((c_value >> 24) & 0xff);
693 len = 5;
694 }
695 }
696
697 if ((*self->write_func)(self, s, len) < 0)
698 return -1;
699
700 return 0;
701}
702
703
704static int
705put(Picklerobject *self, PyObject *ob) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000706 if (ob->ob_refcnt < 2 || self->fast)
Guido van Rossum60456fd1997-04-09 17:36:32 +0000707 return 0;
708
709 return put2(self, ob);
710}
711
712
713static int
714put2(Picklerobject *self, PyObject *ob) {
715 char c_str[30];
716 int p, len, res = -1;
717 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000718
719 if (self->fast) return 0;
720
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721 if ((p = PyDict_Size(self->memo)) < 0)
722 goto finally;
723
Guido van Rossum053b8df1998-11-25 16:18:00 +0000724 p++; /* Make sure memo keys are positive! */
725
726 UNLESS (py_ob_id = PyInt_FromLong((long)ob))
727 goto finally;
728
729 UNLESS (memo_len = PyInt_FromLong(p))
730 goto finally;
731
732 UNLESS (t = PyTuple_New(2))
733 goto finally;
734
735 PyTuple_SET_ITEM(t, 0, memo_len);
736 Py_INCREF(memo_len);
737 PyTuple_SET_ITEM(t, 1, ob);
738 Py_INCREF(ob);
739
740 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
741 goto finally;
742
Guido van Rossum60456fd1997-04-09 17:36:32 +0000743 if (!self->bin) {
744 c_str[0] = PUT;
745 sprintf(c_str + 1, "%d\n", p);
746 len = strlen(c_str);
747 }
Guido van Rossum053b8df1998-11-25 16:18:00 +0000748 else if (Pdata_Check(self->file)) {
749 if (write_other(self, NULL, 0) < 0) return -1;
750 PDATA_APPEND(self->file, memo_len, -1);
751 res=0; /* Job well done ;) */
752 goto finally;
753 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000754 else {
755 if (p >= 256) {
756 c_str[0] = LONG_BINPUT;
757 c_str[1] = (int)(p & 0xff);
758 c_str[2] = (int)((p >> 8) & 0xff);
759 c_str[3] = (int)((p >> 16) & 0xff);
760 c_str[4] = (int)((p >> 24) & 0xff);
761 len = 5;
762 }
763 else {
764 c_str[0] = BINPUT;
765 c_str[1] = p;
766 len = 2;
767 }
768 }
769
770 if ((*self->write_func)(self, c_str, len) < 0)
771 goto finally;
772
Guido van Rossum60456fd1997-04-09 17:36:32 +0000773 res = 0;
774
775finally:
776 Py_XDECREF(py_ob_id);
777 Py_XDECREF(memo_len);
778 Py_XDECREF(t);
779
780 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000781}
782
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000783#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000784
785static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000786PyImport_Import(PyObject *module_name) {
787 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
788 static PyObject *standard_builtins=0;
789 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
790
Guido van Rossum053b8df1998-11-25 16:18:00 +0000791 UNLESS (silly_list) {
792 UNLESS (__import___str=PyString_FromString("__import__"))
793 return NULL;
794 UNLESS (__builtins___str=PyString_FromString("__builtins__"))
795 return NULL;
796 UNLESS (silly_list=Py_BuildValue("[s]","__doc__"))
797 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000798 }
799
Guido van Rossum053b8df1998-11-25 16:18:00 +0000800 if ((globals=PyEval_GetGlobals())) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000801 Py_INCREF(globals);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000802 UNLESS (__builtins__=PyObject_GetItem(globals,__builtins___str))
803 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000804 }
805 else {
806 PyErr_Clear();
807
Guido van Rossum053b8df1998-11-25 16:18:00 +0000808 UNLESS (standard_builtins ||
809 (standard_builtins=PyImport_ImportModule("__builtin__")))
810 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000811
812 __builtins__=standard_builtins;
813 Py_INCREF(__builtins__);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000814 UNLESS (globals = Py_BuildValue("{sO}", "__builtins__", __builtins__))
815 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000816 }
817
Guido van Rossum053b8df1998-11-25 16:18:00 +0000818 if (PyDict_Check(__builtins__)) {
819 UNLESS (__import__=PyObject_GetItem(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000820 }
821 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +0000822 UNLESS (__import__=PyObject_GetAttr(__builtins__,__import___str)) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000823 }
824
Guido van Rossum053b8df1998-11-25 16:18:00 +0000825 UNLESS (r=PyObject_CallFunction(__import__,"OOOO",
826 module_name, globals, globals, silly_list))
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000827 goto err;
828
829 Py_DECREF(globals);
830 Py_DECREF(__builtins__);
831 Py_DECREF(__import__);
832
833 return r;
834err:
835 Py_XDECREF(globals);
836 Py_XDECREF(__builtins__);
837 Py_XDECREF(__import__);
838 return NULL;
839}
840
841static PyObject *
Guido van Rossume2d81cd1998-08-08 19:40:10 +0000842whichmodule(PyObject *global, PyObject *global_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000843 int i, j;
844 PyObject *module = 0, *modules_dict = 0,
845 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Guido van Rossum45188231997-09-28 05:38:51 +0000847 module = PyObject_GetAttrString(global, "__module__");
848 if (module) return module;
849 PyErr_Clear();
850
Guido van Rossum053b8df1998-11-25 16:18:00 +0000851 UNLESS (modules_dict = PySys_GetObject("modules"))
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000852 return NULL;
853
Guido van Rossum60456fd1997-04-09 17:36:32 +0000854 i = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000855 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
856
Guido van Rossum053b8df1998-11-25 16:18:00 +0000857 if (PyObject_Compare(name, __main___str)==0) continue;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000858
Guido van Rossum053b8df1998-11-25 16:18:00 +0000859 UNLESS (global_name_attr = PyObject_GetAttr(module, global_name)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +0000860 PyErr_Clear();
861 continue;
862 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000863
Guido van Rossum60456fd1997-04-09 17:36:32 +0000864 if (global_name_attr != global) {
865 Py_DECREF(global_name_attr);
866 continue;
867 }
868
869 Py_DECREF(global_name_attr);
870
871 break;
872 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000873
874 /* The following implements the rule in pickle.py added in 1.5
875 that used __main__ if no module is found. I don't actually
876 like this rule. jlf
877 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000878 if (!j) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000879 j=1;
880 name=__main___str;
881 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000882
883 Py_INCREF(name);
884 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000885}
886
887
Guido van Rossum60456fd1997-04-09 17:36:32 +0000888static int
889save_none(Picklerobject *self, PyObject *args) {
890 static char none = NONE;
891 if ((*self->write_func)(self, &none, 1) < 0)
892 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000893
Guido van Rossum60456fd1997-04-09 17:36:32 +0000894 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000895}
896
897
Guido van Rossum60456fd1997-04-09 17:36:32 +0000898static int
899save_int(Picklerobject *self, PyObject *args) {
900 char c_str[32];
901 long l = PyInt_AS_LONG((PyIntObject *)args);
902 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000903
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000904 if (!self->bin
905#if SIZEOF_LONG > 4
Guido van Rossum053b8df1998-11-25 16:18:00 +0000906 || (l >> 32)
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000907#endif
Guido van Rossum053b8df1998-11-25 16:18:00 +0000908 ) {
909 /* Save extra-long ints in non-binary mode, so that
910 we can use python long parsing code to restore,
911 if necessary. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000912 c_str[0] = INT;
913 sprintf(c_str + 1, "%ld\n", l);
914 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
915 return -1;
916 }
917 else {
918 c_str[1] = (int)( l & 0xff);
919 c_str[2] = (int)((l >> 8) & 0xff);
920 c_str[3] = (int)((l >> 16) & 0xff);
921 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000922
Guido van Rossum60456fd1997-04-09 17:36:32 +0000923 if ((c_str[4] == 0) && (c_str[3] == 0)) {
924 if (c_str[2] == 0) {
925 c_str[0] = BININT1;
926 len = 2;
927 }
928 else {
929 c_str[0] = BININT2;
930 len = 3;
931 }
932 }
933 else {
934 c_str[0] = BININT;
935 len = 5;
936 }
937
938 if ((*self->write_func)(self, c_str, len) < 0)
939 return -1;
940 }
941
942 return 0;
943}
944
945
946static int
947save_long(Picklerobject *self, PyObject *args) {
948 int size, res = -1;
949 PyObject *repr = 0;
950
951 static char l = LONG;
952
Guido van Rossum053b8df1998-11-25 16:18:00 +0000953 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +0000954 goto finally;
955
956 if ((size = PyString_Size(repr)) < 0)
957 goto finally;
958
959 if ((*self->write_func)(self, &l, 1) < 0)
960 goto finally;
961
962 if ((*self->write_func)(self,
963 PyString_AS_STRING((PyStringObject *)repr), size) < 0)
964 goto finally;
965
966 if ((*self->write_func)(self, "\n", 1) < 0)
967 goto finally;
968
969 res = 0;
970
971finally:
972 Py_XDECREF(repr);
973
974 return res;
975}
976
977
978static int
979save_float(Picklerobject *self, PyObject *args) {
980 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
981
Guido van Rossum60456fd1997-04-09 17:36:32 +0000982 if (self->bin) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000983 int s, e;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000984 double f;
985 long fhi, flo;
986 char str[9], *p = str;
987
988 *p = BINFLOAT;
989 p++;
990
991 if (x < 0) {
992 s = 1;
993 x = -x;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000994 }
995 else
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996 s = 0;
997
998 f = frexp(x, &e);
999
1000 /* Normalize f to be in the range [1.0, 2.0) */
1001 if (0.5 <= f && f < 1.0) {
1002 f *= 2.0;
1003 e--;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001004 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001005 else if (f == 0.0) {
1006 e = 0;
1007 }
1008 else {
1009 PyErr_SetString(PyExc_SystemError,
1010 "frexp() result out of range");
1011 return -1;
1012 }
1013
1014 if (e >= 1024) {
1015 /* XXX 1024 itself is reserved for Inf/NaN */
1016 PyErr_SetString(PyExc_OverflowError,
1017 "float too large to pack with d format");
1018 return -1;
1019 }
1020 else if (e < -1022) {
1021 /* Gradual underflow */
1022 f = ldexp(f, 1022 + e);
1023 e = 0;
1024 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001025 else if (!(e == 0 && f == 0.0)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001026 e += 1023;
1027 f -= 1.0; /* Get rid of leading 1 */
1028 }
1029
1030 /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
1031 f *= 268435456.0; /* 2**28 */
1032 fhi = (long) floor(f); /* Truncate */
1033 f -= (double)fhi;
1034 f *= 16777216.0; /* 2**24 */
1035 flo = (long) floor(f + 0.5); /* Round */
1036
1037 /* First byte */
1038 *p = (s<<7) | (e>>4);
1039 p++;
1040
1041 /* Second byte */
Guido van Rossume94e3fb1998-12-08 17:37:19 +00001042 *p = (char) (((e&0xF)<<4) | (fhi>>24));
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043 p++;
1044
1045 /* Third byte */
1046 *p = (fhi>>16) & 0xFF;
1047 p++;
1048
1049 /* Fourth byte */
1050 *p = (fhi>>8) & 0xFF;
1051 p++;
1052
1053 /* Fifth byte */
1054 *p = fhi & 0xFF;
1055 p++;
1056
1057 /* Sixth byte */
1058 *p = (flo>>16) & 0xFF;
1059 p++;
1060
1061 /* Seventh byte */
1062 *p = (flo>>8) & 0xFF;
1063 p++;
1064
1065 /* Eighth byte */
1066 *p = flo & 0xFF;
1067
1068 if ((*self->write_func)(self, str, 9) < 0)
1069 return -1;
1070 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001071 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072 char c_str[250];
1073 c_str[0] = FLOAT;
Guido van Rossum104be4a1998-04-03 21:13:02 +00001074 sprintf(c_str + 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001075
1076 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1077 return -1;
1078 }
1079
1080 return 0;
1081}
1082
1083
1084static int
Guido van Rossum142eeb81997-08-13 03:14:41 +00001085save_string(Picklerobject *self, PyObject *args, int doput) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001086 int size, len;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001087 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001088
Guido van Rossum053b8df1998-11-25 16:18:00 +00001089 if ((size = PyString_Size(args)) < 0)
1090 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001091
1092 if (!self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001093 char *repr_str;
1094
1095 static char string = STRING;
1096
Guido van Rossum053b8df1998-11-25 16:18:00 +00001097 UNLESS (repr = PyObject_Repr(args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001098 return -1;
1099
Guido van Rossum053b8df1998-11-25 16:18:00 +00001100 if ((len = PyString_Size(repr)) < 0)
1101 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001103
1104 if ((*self->write_func)(self, &string, 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001105 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106
1107 if ((*self->write_func)(self, repr_str, len) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001108 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001109
1110 if ((*self->write_func)(self, "\n", 1) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001111 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001112
1113 Py_XDECREF(repr);
1114 }
1115 else {
1116 int i;
1117 char c_str[5];
1118
Guido van Rossum053b8df1998-11-25 16:18:00 +00001119 if ((size = PyString_Size(args)) < 0)
1120 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001121
1122 if (size < 256) {
1123 c_str[0] = SHORT_BINSTRING;
1124 c_str[1] = size;
1125 len = 2;
1126 }
1127 else {
1128 c_str[0] = BINSTRING;
1129 for (i = 1; i < 5; i++)
1130 c_str[i] = (int)(size >> ((i - 1) * 8));
1131 len = 5;
1132 }
1133
1134 if ((*self->write_func)(self, c_str, len) < 0)
1135 return -1;
1136
Guido van Rossum053b8df1998-11-25 16:18:00 +00001137 if (size > 128 && Pdata_Check(self->file)) {
1138 if (write_other(self, NULL, 0) < 0) return -1;
1139 PDATA_APPEND(self->file, args, -1);
1140 }
1141 else {
1142 if ((*self->write_func)(self,
1143 PyString_AS_STRING((PyStringObject *)args), size) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001145 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146 }
1147
Guido van Rossum142eeb81997-08-13 03:14:41 +00001148 if (doput)
1149 if (put(self, args) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001150 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
1152 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001153
1154err:
1155 Py_XDECREF(repr);
1156 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157}
1158
1159
1160static int
1161save_tuple(Picklerobject *self, PyObject *args) {
1162 PyObject *element = 0, *py_tuple_id = 0;
1163 int len, i, has_key, res = -1;
1164
1165 static char tuple = TUPLE;
1166
1167 if ((*self->write_func)(self, &MARKv, 1) < 0)
1168 goto finally;
1169
1170 if ((len = PyTuple_Size(args)) < 0)
1171 goto finally;
1172
1173 for (i = 0; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001174 UNLESS (element = PyTuple_GET_ITEM((PyTupleObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175 goto finally;
1176
1177 if (save(self, element, 0) < 0)
1178 goto finally;
1179 }
1180
Guido van Rossum053b8df1998-11-25 16:18:00 +00001181 UNLESS (py_tuple_id = PyInt_FromLong((long)args))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001182 goto finally;
1183
1184 if (len) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001185 if ((has_key = cPickle_PyMapping_HasKey(self->memo, py_tuple_id)) < 0)
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186 goto finally;
1187
1188 if (has_key) {
1189 if (self->bin) {
1190 static char pop_mark = POP_MARK;
1191
1192 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1193 goto finally;
1194 }
1195 else {
1196 static char pop = POP;
1197
1198 for (i = 0; i <= len; i++) {
1199 if ((*self->write_func)(self, &pop, 1) < 0)
1200 goto finally;
1201 }
1202 }
1203
1204 if (get(self, py_tuple_id) < 0)
1205 goto finally;
1206
1207 res = 0;
1208 goto finally;
1209 }
1210 }
1211
1212 if ((*self->write_func)(self, &tuple, 1) < 0) {
1213 goto finally;
1214 }
1215
1216 if (put(self, args) < 0)
1217 goto finally;
1218
1219 res = 0;
1220
1221finally:
1222 Py_XDECREF(py_tuple_id);
1223
1224 return res;
1225}
1226
1227static int
1228save_empty_tuple(Picklerobject *self, PyObject *args) {
1229 static char tuple = EMPTY_TUPLE;
1230
1231 return (*self->write_func)(self, &tuple, 1);
1232}
1233
1234
1235static int
1236save_list(Picklerobject *self, PyObject *args) {
1237 PyObject *element = 0;
1238 int s_len, len, i, using_appends, res = -1;
1239 char s[3];
1240
1241 static char append = APPEND, appends = APPENDS;
1242
Guido van Rossum053b8df1998-11-25 16:18:00 +00001243 if (self->bin) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001244 s[0] = EMPTY_LIST;
1245 s_len = 1;
1246 }
1247 else {
1248 s[0] = MARK;
1249 s[1] = LIST;
1250 s_len = 2;
1251 }
1252
1253 if ((len = PyList_Size(args)) < 0)
1254 goto finally;
1255
1256 if ((*self->write_func)(self, s, s_len) < 0)
1257 goto finally;
1258
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001259 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260 if (put(self, args) < 0)
1261 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001262 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001263 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001264 if (put2(self, args) < 0)
1265 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001266 }
1267
Guido van Rossum142eeb81997-08-13 03:14:41 +00001268 if ((using_appends = (self->bin && (len > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001269 if ((*self->write_func)(self, &MARKv, 1) < 0)
1270 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001271
Guido van Rossum60456fd1997-04-09 17:36:32 +00001272 for (i = 0; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001273 UNLESS (element = PyList_GET_ITEM((PyListObject *)args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001274 goto finally;
1275
1276 if (save(self, element, 0) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00001277 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001278
1279 if (!using_appends) {
1280 if ((*self->write_func)(self, &append, 1) < 0)
1281 goto finally;
1282 }
1283 }
1284
1285 if (using_appends) {
1286 if ((*self->write_func)(self, &appends, 1) < 0)
1287 goto finally;
1288 }
1289
1290 res = 0;
1291
1292finally:
1293
1294 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001295}
1296
1297
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298static int
1299save_dict(Picklerobject *self, PyObject *args) {
1300 PyObject *key = 0, *value = 0;
1301 int i, len, res = -1, using_setitems;
1302 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001303
Guido van Rossum60456fd1997-04-09 17:36:32 +00001304 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001305
Guido van Rossum60456fd1997-04-09 17:36:32 +00001306 if (self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001307 s[0] = EMPTY_DICT;
1308 len = 1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001309 }
1310 else {
1311 s[0] = MARK;
1312 s[1] = DICT;
1313 len = 2;
1314 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001315
Guido van Rossum60456fd1997-04-09 17:36:32 +00001316 if ((*self->write_func)(self, s, len) < 0)
1317 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001318
Guido van Rossum60456fd1997-04-09 17:36:32 +00001319 if ((len = PyDict_Size(args)) < 0)
1320 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001321
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001322 if (len == 0) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001323 if (put(self, args) < 0)
1324 goto finally;
1325 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001326 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001327 if (put2(self, args) < 0)
1328 goto finally;
1329 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001330
Guido van Rossum142eeb81997-08-13 03:14:41 +00001331 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001332 if ((*self->write_func)(self, &MARKv, 1) < 0)
1333 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001334
Guido van Rossum60456fd1997-04-09 17:36:32 +00001335 i = 0;
1336 while (PyDict_Next(args, &i, &key, &value)) {
1337 if (save(self, key, 0) < 0)
1338 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001339
Guido van Rossum60456fd1997-04-09 17:36:32 +00001340 if (save(self, value, 0) < 0)
1341 goto finally;
1342
1343 if (!using_setitems) {
1344 if ((*self->write_func)(self, &setitem, 1) < 0)
1345 goto finally;
1346 }
1347 }
1348
1349 if (using_setitems) {
1350 if ((*self->write_func)(self, &setitems, 1) < 0)
1351 goto finally;
1352 }
1353
1354 res = 0;
1355
1356finally:
1357
1358 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001359}
1360
1361
Guido van Rossum60456fd1997-04-09 17:36:32 +00001362static int
1363save_inst(Picklerobject *self, PyObject *args) {
1364 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1365 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1366 char *module_str, *name_str;
1367 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001368
Guido van Rossum60456fd1997-04-09 17:36:32 +00001369 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001370
Guido van Rossum60456fd1997-04-09 17:36:32 +00001371 if ((*self->write_func)(self, &MARKv, 1) < 0)
1372 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001373
Guido van Rossum053b8df1998-11-25 16:18:00 +00001374 UNLESS (class = PyObject_GetAttr(args, __class___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001375 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001376
Guido van Rossum60456fd1997-04-09 17:36:32 +00001377 if (self->bin) {
1378 if (save(self, class, 0) < 0)
1379 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001380 }
1381
Guido van Rossum142eeb81997-08-13 03:14:41 +00001382 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001383 PyObject *element = 0;
1384 int i, len;
1385
Guido van Rossum053b8df1998-11-25 16:18:00 +00001386 UNLESS (class_args =
Guido van Rossum60456fd1997-04-09 17:36:32 +00001387 PyObject_CallObject(getinitargs_func, empty_tuple))
1388 goto finally;
1389
1390 if ((len = PyObject_Length(class_args)) < 0)
1391 goto finally;
1392
1393 for (i = 0; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001394 UNLESS (element = PySequence_GetItem(class_args, i))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001395 goto finally;
1396
1397 if (save(self, element, 0) < 0) {
1398 Py_DECREF(element);
1399 goto finally;
1400 }
1401
1402 Py_DECREF(element);
1403 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001404 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405 else {
1406 PyErr_Clear();
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001407 }
1408
Guido van Rossum60456fd1997-04-09 17:36:32 +00001409 if (!self->bin) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001410 UNLESS (name = ((PyClassObject *)class)->cl_name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411 PyErr_SetString(PicklingError, "class has no name");
1412 goto finally;
1413 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001414
Guido van Rossum053b8df1998-11-25 16:18:00 +00001415 UNLESS (module = whichmodule(class, name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001416 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001417
1418
1419 if ((module_size = PyString_Size(module)) < 0 ||
1420 (name_size = PyString_Size(name)) < 0)
1421 goto finally;
1422
Guido van Rossum60456fd1997-04-09 17:36:32 +00001423 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001424 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001425
Guido van Rossum60456fd1997-04-09 17:36:32 +00001426 if ((*self->write_func)(self, &inst, 1) < 0)
1427 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001428
Guido van Rossum60456fd1997-04-09 17:36:32 +00001429 if ((*self->write_func)(self, module_str, module_size) < 0)
1430 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001431
Guido van Rossum60456fd1997-04-09 17:36:32 +00001432 if ((*self->write_func)(self, "\n", 1) < 0)
1433 goto finally;
1434
1435 if ((*self->write_func)(self, name_str, name_size) < 0)
1436 goto finally;
1437
1438 if ((*self->write_func)(self, "\n", 1) < 0)
1439 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001441 else if ((*self->write_func)(self, &obj, 1) < 0) {
1442 goto finally;
1443 }
1444
Guido van Rossum142eeb81997-08-13 03:14:41 +00001445 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001446 UNLESS (state = PyObject_CallObject(getstate_func, empty_tuple))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001447 goto finally;
1448 }
1449 else {
1450 PyErr_Clear();
1451
Guido van Rossum053b8df1998-11-25 16:18:00 +00001452 UNLESS (state = PyObject_GetAttr(args, __dict___str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001453 PyErr_Clear();
1454 res = 0;
1455 goto finally;
1456 }
1457 }
1458
1459 if (!PyDict_Check(state)) {
1460 if (put2(self, args) < 0)
1461 goto finally;
1462 }
1463 else {
1464 if (put(self, args) < 0)
1465 goto finally;
1466 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001467
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468 if (save(self, state, 0) < 0)
1469 goto finally;
1470
1471 if ((*self->write_func)(self, &build, 1) < 0)
1472 goto finally;
1473
1474 res = 0;
1475
1476finally:
1477 Py_XDECREF(module);
1478 Py_XDECREF(class);
1479 Py_XDECREF(state);
1480 Py_XDECREF(getinitargs_func);
1481 Py_XDECREF(getstate_func);
1482 Py_XDECREF(class_args);
1483
1484 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001485}
1486
1487
Guido van Rossum60456fd1997-04-09 17:36:32 +00001488static int
1489save_global(Picklerobject *self, PyObject *args, PyObject *name) {
1490 PyObject *global_name = 0, *module = 0;
1491 char *name_str, *module_str;
1492 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001493
Guido van Rossum60456fd1997-04-09 17:36:32 +00001494 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001495
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001496 if (name) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497 global_name = name;
1498 Py_INCREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001499 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001500 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001501 UNLESS (global_name = PyObject_GetAttr(args, __name___str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001502 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001503 }
1504
Guido van Rossum053b8df1998-11-25 16:18:00 +00001505 UNLESS (module = whichmodule(args, global_name))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001506 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001507
Guido van Rossum053b8df1998-11-25 16:18:00 +00001508 if ((module_size = PyString_Size(module)) < 0 ||
1509 (name_size = PyString_Size(global_name)) < 0)
1510 goto finally;
1511
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001512 module_str = PyString_AS_STRING((PyStringObject *)module);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001513 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001514
Guido van Rossum60456fd1997-04-09 17:36:32 +00001515 if ((*self->write_func)(self, &global, 1) < 0)
1516 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001517
Guido van Rossum60456fd1997-04-09 17:36:32 +00001518 if ((*self->write_func)(self, module_str, module_size) < 0)
1519 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Guido van Rossum60456fd1997-04-09 17:36:32 +00001521 if ((*self->write_func)(self, "\n", 1) < 0)
1522 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001523
Guido van Rossum60456fd1997-04-09 17:36:32 +00001524 if ((*self->write_func)(self, name_str, name_size) < 0)
1525 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001526
Guido van Rossum60456fd1997-04-09 17:36:32 +00001527 if ((*self->write_func)(self, "\n", 1) < 0)
1528 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001529
Guido van Rossum60456fd1997-04-09 17:36:32 +00001530 if (put(self, args) < 0)
1531 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001532
Guido van Rossum60456fd1997-04-09 17:36:32 +00001533 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001534
Guido van Rossum60456fd1997-04-09 17:36:32 +00001535finally:
1536 Py_XDECREF(module);
1537 Py_XDECREF(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001538
Guido van Rossum60456fd1997-04-09 17:36:32 +00001539 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001540}
1541
Guido van Rossum60456fd1997-04-09 17:36:32 +00001542static int
1543save_pers(Picklerobject *self, PyObject *args, PyObject *f) {
1544 PyObject *pid = 0;
1545 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001546
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001548
Guido van Rossum053b8df1998-11-25 16:18:00 +00001549 Py_INCREF(args);
1550 ARG_TUP(self, args);
1551 if (self->arg) {
1552 pid = PyObject_CallObject(f, self->arg);
1553 FREE_ARG_TUP(self);
1554 }
1555 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001556
Guido van Rossum60456fd1997-04-09 17:36:32 +00001557 if (pid != Py_None) {
1558 if (!self->bin) {
1559 if (!PyString_Check(pid)) {
1560 PyErr_SetString(PicklingError,
1561 "persistent id must be string");
1562 goto finally;
1563 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001564
Guido van Rossum60456fd1997-04-09 17:36:32 +00001565 if ((*self->write_func)(self, &persid, 1) < 0)
1566 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001567
Guido van Rossum60456fd1997-04-09 17:36:32 +00001568 if ((size = PyString_Size(pid)) < 0)
1569 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001570
Guido van Rossum60456fd1997-04-09 17:36:32 +00001571 if ((*self->write_func)(self,
1572 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1573 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001574
Guido van Rossum60456fd1997-04-09 17:36:32 +00001575 if ((*self->write_func)(self, "\n", 1) < 0)
1576 goto finally;
1577
1578 res = 1;
1579 goto finally;
1580 }
1581 else if (save(self, pid, 1) >= 0) {
1582 if ((*self->write_func)(self, &binpersid, 1) < 0)
1583 res = -1;
1584 else
1585 res = 1;
1586 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001587
Guido van Rossum60456fd1997-04-09 17:36:32 +00001588 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001589 }
1590
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001592
Guido van Rossum60456fd1997-04-09 17:36:32 +00001593finally:
1594 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001595
Guido van Rossum60456fd1997-04-09 17:36:32 +00001596 return res;
1597}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001598
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001599
Guido van Rossum60456fd1997-04-09 17:36:32 +00001600static int
1601save_reduce(Picklerobject *self, PyObject *callable,
1602 PyObject *tup, PyObject *state, PyObject *ob) {
1603 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001604
Guido van Rossum60456fd1997-04-09 17:36:32 +00001605 if (save(self, callable, 0) < 0)
1606 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001607
Guido van Rossum60456fd1997-04-09 17:36:32 +00001608 if (save(self, tup, 0) < 0)
1609 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001610
Guido van Rossum60456fd1997-04-09 17:36:32 +00001611 if ((*self->write_func)(self, &reduce, 1) < 0)
1612 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001614 if (ob != NULL) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615 if (state && !PyDict_Check(state)) {
1616 if (put2(self, ob) < 0)
1617 return -1;
1618 }
1619 else {
1620 if (put(self, ob) < 0)
1621 return -1;
1622 }
1623 }
1624
Guido van Rossumfdde96c1997-12-04 01:13:01 +00001625 if (state) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001626 if (save(self, state, 0) < 0)
1627 return -1;
1628
1629 if ((*self->write_func)(self, &build, 1) < 0)
1630 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001631 }
1632
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633 return 0;
1634}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001635
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636static int
1637save(Picklerobject *self, PyObject *args, int pers_save) {
1638 PyTypeObject *type;
1639 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
Guido van Rossum142eeb81997-08-13 03:14:41 +00001640 *callable = 0, *state = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001641 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001642
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643 if (!pers_save && self->pers_func) {
1644 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1645 res = tmp;
1646 goto finally;
1647 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001648 }
1649
Guido van Rossum60456fd1997-04-09 17:36:32 +00001650 if (args == Py_None) {
1651 res = save_none(self, args);
1652 goto finally;
1653 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001654
Guido van Rossum60456fd1997-04-09 17:36:32 +00001655 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001656
Guido van Rossum60456fd1997-04-09 17:36:32 +00001657 switch (type->tp_name[0]) {
1658 case 'i':
1659 if (type == &PyInt_Type) {
1660 res = save_int(self, args);
1661 goto finally;
1662 }
1663 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001664
Guido van Rossum60456fd1997-04-09 17:36:32 +00001665 case 'l':
1666 if (type == &PyLong_Type) {
1667 res = save_long(self, args);
1668 goto finally;
1669 }
1670 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001671
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672 case 'f':
1673 if (type == &PyFloat_Type) {
1674 res = save_float(self, args);
1675 goto finally;
1676 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001677 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001678
Guido van Rossum60456fd1997-04-09 17:36:32 +00001679 case 't':
1680 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001681 if (self->bin) res = save_empty_tuple(self, args);
1682 else res = save_tuple(self, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001683 goto finally;
1684 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001685 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001686
Guido van Rossum60456fd1997-04-09 17:36:32 +00001687 case 's':
Guido van Rossum053b8df1998-11-25 16:18:00 +00001688 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001689 res = save_string(self, args, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001690 goto finally;
1691 }
1692 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001693
Guido van Rossum60456fd1997-04-09 17:36:32 +00001694 if (args->ob_refcnt > 1) {
1695 long ob_id;
1696 int has_key;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697
Guido van Rossum60456fd1997-04-09 17:36:32 +00001698 ob_id = (long)args;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001699
Guido van Rossum053b8df1998-11-25 16:18:00 +00001700 UNLESS (py_ob_id = PyInt_FromLong(ob_id))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001701 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001702
Guido van Rossum60456fd1997-04-09 17:36:32 +00001703 if ((has_key = cPickle_PyMapping_HasKey(self->memo, py_ob_id)) < 0)
1704 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Guido van Rossum60456fd1997-04-09 17:36:32 +00001706 if (has_key) {
1707 if (get(self, py_ob_id) < 0)
1708 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Guido van Rossum60456fd1997-04-09 17:36:32 +00001710 res = 0;
1711 goto finally;
1712 }
1713 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001714
Guido van Rossum60456fd1997-04-09 17:36:32 +00001715 switch (type->tp_name[0]) {
1716 case 's':
1717 if (type == &PyString_Type) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00001718 res = save_string(self, args, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001719 goto finally;
1720 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001721 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001722
Guido van Rossum60456fd1997-04-09 17:36:32 +00001723 case 't':
1724 if (type == &PyTuple_Type) {
1725 res = save_tuple(self, args);
1726 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001727 }
1728 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001729
Guido van Rossum60456fd1997-04-09 17:36:32 +00001730 case 'l':
1731 if (type == &PyList_Type) {
1732 res = save_list(self, args);
1733 goto finally;
1734 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001735 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001736
1737 case 'd':
1738 if (type == &PyDict_Type) {
1739 res = save_dict(self, args);
1740 goto finally;
1741 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001742 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001743
1744 case 'i':
1745 if (type == &PyInstance_Type) {
1746 res = save_inst(self, args);
1747 goto finally;
1748 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001749 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001750
1751 case 'c':
1752 if (type == &PyClass_Type) {
1753 res = save_global(self, args, NULL);
1754 goto finally;
1755 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001756 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001757
1758 case 'f':
1759 if (type == &PyFunction_Type) {
1760 res = save_global(self, args, NULL);
1761 goto finally;
1762 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00001763 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001764
1765 case 'b':
1766 if (type == &PyCFunction_Type) {
1767 res = save_global(self, args, NULL);
1768 goto finally;
1769 }
1770 }
1771
1772 if (!pers_save && self->inst_pers_func) {
1773 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
1774 res = tmp;
1775 goto finally;
1776 }
1777 }
1778
Guido van Rossum142eeb81997-08-13 03:14:41 +00001779 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00001780 Py_INCREF(__reduce__);
1781
Guido van Rossum60456fd1997-04-09 17:36:32 +00001782 Py_INCREF(args);
Guido van Rossum053b8df1998-11-25 16:18:00 +00001783 ARG_TUP(self, args);
1784 if (self->arg) {
1785 t = PyObject_CallObject(__reduce__, self->arg);
1786 FREE_ARG_TUP(self);
1787 }
1788 if (! t) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001789 }
1790 else {
1791 PyErr_Clear();
1792
Guido van Rossum142eeb81997-08-13 03:14:41 +00001793 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00001794 UNLESS (t = PyObject_CallObject(__reduce__, empty_tuple))
Guido van Rossum60456fd1997-04-09 17:36:32 +00001795 goto finally;
1796 }
1797 else {
1798 PyErr_Clear();
1799 }
1800 }
1801
1802 if (t) {
1803 if (PyString_Check(t)) {
1804 res = save_global(self, args, t);
1805 goto finally;
1806 }
1807
1808 if (!PyTuple_Check(t)) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00001809 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00001810 "be a tuple", "O", __reduce__);
1811 goto finally;
1812 }
1813
1814 size = PyTuple_Size(t);
1815
1816 if ((size != 3) && (size != 2)) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00001817 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
Guido van Rossum60456fd1997-04-09 17:36:32 +00001818 "contain only two or three elements", "O", __reduce__);
1819 goto finally;
1820 }
1821
1822 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00001823
Guido van Rossum60456fd1997-04-09 17:36:32 +00001824 arg_tup = PyTuple_GET_ITEM(t, 1);
1825
1826 if (size > 2) {
1827 state = PyTuple_GET_ITEM(t, 2);
1828 }
1829
Guido van Rossum053b8df1998-11-25 16:18:00 +00001830 UNLESS (PyTuple_Check(arg_tup) || arg_tup==Py_None) {
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00001831 cPickle_ErrFormat(PicklingError, "Second element of tuple "
Guido van Rossum60456fd1997-04-09 17:36:32 +00001832 "returned by %s must be a tuple", "O", __reduce__);
1833 goto finally;
1834 }
1835
1836 res = save_reduce(self, callable, arg_tup, state, args);
1837 goto finally;
1838 }
1839
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00001840 cPickle_ErrFormat(PicklingError, "Cannot pickle %s objects.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00001841 "O", (PyObject *)type);
1842
1843finally:
1844 Py_XDECREF(py_ob_id);
1845 Py_XDECREF(__reduce__);
1846 Py_XDECREF(t);
1847
1848 return res;
1849}
1850
1851
1852static int
1853dump(Picklerobject *self, PyObject *args) {
1854 static char stop = STOP;
1855
1856 if (save(self, args, 0) < 0)
1857 return -1;
1858
1859 if ((*self->write_func)(self, &stop, 1) < 0)
1860 return -1;
1861
1862 if ((*self->write_func)(self, NULL, 0) < 0)
1863 return -1;
1864
1865 return 0;
1866}
1867
1868static PyObject *
Guido van Rossum053b8df1998-11-25 16:18:00 +00001869Pickle_clear_memo(Picklerobject *self, PyObject *args) {
1870 if (args && ! PyArg_ParseTuple(args,"")) return NULL;
1871 if (self->memo) PyDict_Clear(self->memo);
1872 Py_INCREF(Py_None);
1873 return Py_None;
1874}
1875
1876static PyObject *
1877Pickle_getvalue(Picklerobject *self, PyObject *args) {
1878 int l, i, rsize, ssize, clear=1, lm;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00001879 long ik;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001880 PyObject *k, *r;
1881 char *s, *p, *have_get;
1882 Pdata *data;
1883
1884 if (args && ! PyArg_ParseTuple(args,"|i",&clear)) return NULL;
1885
1886 /* Check to make sure we are based on a list */
1887 if (! Pdata_Check(self->file)) {
1888 PyErr_SetString(PicklingError,
1889 "Attempt to getvalue a non-list-based pickler");
1890 return NULL;
1891 }
1892
1893 /* flush write buffer */
1894 if (write_other(self, NULL, 0) < 0) return NULL;
1895
1896 data=(Pdata*)self->file;
1897 l=data->length;
1898
1899 /* set up an array to hold get/put status */
1900 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
1901 lm++;
1902 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
1903 memset(have_get,0,lm);
1904
1905 /* Scan for gets. */
1906 for (rsize=0, i=l; --i >= 0; ) {
1907 k=data->data[i];
1908
1909 if (PyString_Check(k)) {
1910 rsize += PyString_GET_SIZE(k);
1911 }
1912
1913 else if (PyInt_Check(k)) { /* put */
1914 ik=PyInt_AS_LONG((PyIntObject*)k);
1915 if (ik >= lm || ik==0) {
1916 PyErr_SetString(PicklingError,
1917 "Invalid get data");
1918 return NULL;
1919 }
1920 if (have_get[ik]) { /* with matching get */
1921 if (ik < 256) rsize += 2;
1922 else rsize+=5;
1923 }
1924 }
1925
1926 else if (! (PyTuple_Check(k) &&
1927 PyTuple_GET_SIZE(k) == 2 &&
1928 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
1929 ) {
1930 PyErr_SetString(PicklingError,
1931 "Unexpected data in internal list");
1932 return NULL;
1933 }
1934
1935 else { /* put */
1936 ik=PyInt_AS_LONG((PyIntObject*)k);
1937 if (ik >= lm || ik==0) {
1938 PyErr_SetString(PicklingError,
1939 "Invalid get data");
1940 return NULL;
1941 }
1942 have_get[ik]=1;
1943 if (ik < 256) rsize += 2;
1944 else rsize+=5;
1945 }
1946
1947 }
1948
1949 /* Now generate the result */
1950 UNLESS (r=PyString_FromStringAndSize(NULL,rsize)) goto err;
1951 s=PyString_AS_STRING((PyStringObject*)r);
1952
1953 for (i=0; i<l; i++) {
1954 k=data->data[i];
1955
1956 if (PyString_Check(k)) {
1957 ssize=PyString_GET_SIZE(k);
1958 if (ssize) {
1959 p=PyString_AS_STRING((PyStringObject*)k);
1960 while (--ssize >= 0) *s++=*p++;
1961 }
1962 }
1963
1964 else if (PyTuple_Check(k)) { /* get */
1965 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
1966 if (ik < 256) {
1967 *s++ = BINGET;
1968 *s++ = (int)(ik & 0xff);
1969 }
1970 else {
1971 *s++ = LONG_BINGET;
1972 *s++ = (int)(ik & 0xff);
1973 *s++ = (int)((ik >> 8) & 0xff);
1974 *s++ = (int)((ik >> 16) & 0xff);
1975 *s++ = (int)((ik >> 24) & 0xff);
1976 }
1977 }
1978
1979 else { /* put */
1980 ik=PyInt_AS_LONG((PyIntObject*)k);
1981
1982 if (have_get[ik]) { /* with matching get */
1983 if (ik < 256) {
1984 *s++ = BINPUT;
1985 *s++ = (int)(ik & 0xff);
1986 }
1987 else {
1988 *s++ = LONG_BINPUT;
1989 *s++ = (int)(ik & 0xff);
1990 *s++ = (int)((ik >> 8) & 0xff);
1991 *s++ = (int)((ik >> 16) & 0xff);
1992 *s++ = (int)((ik >> 24) & 0xff);
1993 }
1994 }
1995 }
1996
1997 }
1998
1999 if (clear) {
2000 PyDict_Clear(self->memo);
2001 Pdata_clear(data,0);
2002 }
2003
2004 free(have_get);
2005 return r;
2006err:
2007 free(have_get);
2008 return NULL;
2009}
2010
2011static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002012Pickler_dump(Picklerobject *self, PyObject *args) {
2013 PyObject *ob;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002014 int get=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015
Guido van Rossum053b8df1998-11-25 16:18:00 +00002016 UNLESS (PyArg_ParseTuple(args, "O|i", &ob, &get))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002017 return NULL;
2018
2019 if (dump(self, ob) < 0)
2020 return NULL;
2021
Guido van Rossum053b8df1998-11-25 16:18:00 +00002022 if (get) return Pickle_getvalue(self, NULL);
2023
2024 Py_INCREF(self);
2025 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002026}
2027
2028
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002029static struct PyMethodDef Pickler_methods[] = {
Guido van Rossum142eeb81997-08-13 03:14:41 +00002030 {"dump", (PyCFunction)Pickler_dump, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002031 "dump(object) --"
2032 "Write an object in pickle format to the object's pickle stream\n"
2033 },
Guido van Rossum142eeb81997-08-13 03:14:41 +00002034 {"clear_memo", (PyCFunction)Pickle_clear_memo, 1,
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002035 "clear_memo() -- Clear the picklers memo"},
Guido van Rossum053b8df1998-11-25 16:18:00 +00002036 {"getvalue", (PyCFunction)Pickle_getvalue, 1,
2037 "getvalue() -- Finish picking a list-based pickle"},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002039};
2040
2041
2042static Picklerobject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043newPicklerobject(PyObject *file, int bin) {
2044 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002045
Guido van Rossum053b8df1998-11-25 16:18:00 +00002046 UNLESS (self = PyObject_NEW(Picklerobject, &Picklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002047 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002048
2049 self->fp = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002050 self->write = NULL;
2051 self->memo = NULL;
2052 self->arg = NULL;
2053 self->pers_func = NULL;
2054 self->inst_pers_func = NULL;
2055 self->write_buf = NULL;
2056 self->bin = bin;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002057 self->fast = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002058 self->buf_size = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002059 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002060
Guido van Rossum053b8df1998-11-25 16:18:00 +00002061 if (file)
2062 Py_INCREF(file);
2063 else
Guido van Rossum50f385c1998-12-04 18:48:44 +00002064 file=Pdata_New();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002065
Guido van Rossum60456fd1997-04-09 17:36:32 +00002066 self->file = file;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002067
Guido van Rossum053b8df1998-11-25 16:18:00 +00002068 UNLESS (self->memo = PyDict_New()) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002069 Py_XDECREF((PyObject *)self);
2070 return NULL;
2071 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002072
Guido van Rossum60456fd1997-04-09 17:36:32 +00002073 if (PyFile_Check(file)) {
2074 self->fp = PyFile_AsFile(file);
2075 self->write_func = write_file;
2076 }
2077 else if (PycStringIO_OutputCheck(file)) {
2078 self->write_func = write_cStringIO;
2079 }
Guido van Rossum142eeb81997-08-13 03:14:41 +00002080 else if (file == Py_None) {
2081 self->write_func = write_none;
2082 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083 else {
2084 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Guido van Rossum053b8df1998-11-25 16:18:00 +00002086 if (! Pdata_Check(file)) {
2087 UNLESS (self->write = PyObject_GetAttr(file, write_str)) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002088 PyErr_Clear();
2089 PyErr_SetString(PyExc_TypeError, "argument must have 'write' "
Guido van Rossum053b8df1998-11-25 16:18:00 +00002090 "attribute");
2091 goto err;
2092 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002093 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002094
Guido van Rossum053b8df1998-11-25 16:18:00 +00002095 UNLESS (self->write_buf =
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096 (char *)malloc(WRITE_BUF_SIZE * sizeof(char))) {
2097 PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +00002098 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002099 }
2100 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002101
Guido van Rossum053b8df1998-11-25 16:18:00 +00002102 if (PyEval_GetRestricted()) {
2103 /* Restricted execution, get private tables */
2104 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002105
Guido van Rossum053b8df1998-11-25 16:18:00 +00002106 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
2107 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2108 Py_DECREF(m);
2109 UNLESS (self->dispatch_table) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002110 }
2111 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002112 self->dispatch_table=dispatch_table;
2113 Py_INCREF(dispatch_table);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002114 }
2115
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002117
2118err:
2119 Py_DECREF((PyObject *)self);
2120 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002121}
2122
2123
2124static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002125get_Pickler(PyObject *self, PyObject *args) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002126 PyObject *file=NULL;
2127 int bin;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Guido van Rossum053b8df1998-11-25 16:18:00 +00002129 bin=1;
2130 if (! PyArg_ParseTuple(args, "|i", &bin)) {
2131 PyErr_Clear();
2132 bin=0;
2133 if (! PyArg_ParseTuple(args, "O|i", &file, &bin))
2134 return NULL;
2135 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002136 return (PyObject *)newPicklerobject(file, bin);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002137}
2138
2139
2140static void
Guido van Rossum60456fd1997-04-09 17:36:32 +00002141Pickler_dealloc(Picklerobject *self) {
2142 Py_XDECREF(self->write);
2143 Py_XDECREF(self->memo);
2144 Py_XDECREF(self->arg);
2145 Py_XDECREF(self->file);
2146 Py_XDECREF(self->pers_func);
2147 Py_XDECREF(self->inst_pers_func);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002148 Py_XDECREF(self->dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002149
2150 if (self->write_buf) {
2151 free(self->write_buf);
2152 }
2153
2154 PyMem_DEL(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002155}
2156
2157
2158static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00002159Pickler_getattr(Picklerobject *self, char *name) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002160
2161 switch (*name) {
2162 case 'p':
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163 if (strcmp(name, "persistent_id") == 0) {
2164 if (!self->pers_func) {
2165 PyErr_SetString(PyExc_AttributeError, name);
2166 return NULL;
2167 }
2168
2169 Py_INCREF(self->pers_func);
2170 return self->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002171 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002172 break;
2173 case 'm':
Guido van Rossum60456fd1997-04-09 17:36:32 +00002174 if (strcmp(name, "memo") == 0) {
2175 if (!self->memo) {
2176 PyErr_SetString(PyExc_AttributeError, name);
2177 return NULL;
2178 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002179
Guido van Rossum60456fd1997-04-09 17:36:32 +00002180 Py_INCREF(self->memo);
2181 return self->memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002182 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002183 break;
2184 case 'P':
Guido van Rossum60456fd1997-04-09 17:36:32 +00002185 if (strcmp(name, "PicklingError") == 0) {
2186 Py_INCREF(PicklingError);
2187 return PicklingError;
2188 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002189 break;
2190 case 'b':
2191 if (strcmp(name, "binary")==0)
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002192 return PyInt_FromLong(self->bin);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002193 break;
2194 case 'f':
2195 if (strcmp(name, "fast")==0)
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002196 return PyInt_FromLong(self->fast);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002197 break;
2198 case 'g':
2199 if (strcmp(name, "getvalue")==0 && ! Pdata_Check(self->file)) {
2200 PyErr_SetString(PyExc_AttributeError, name);
2201 return NULL;
2202 }
2203 break;
2204 }
2205 return Py_FindMethod(Pickler_methods, (PyObject *)self, name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002206}
2207
2208
2209int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002210Pickler_setattr(Picklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002211
Guido van Rossum053b8df1998-11-25 16:18:00 +00002212 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002213 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002214 "attribute deletion is not supported");
2215 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002216 }
2217
Guido van Rossum60456fd1997-04-09 17:36:32 +00002218 if (strcmp(name, "persistent_id") == 0) {
2219 Py_XDECREF(self->pers_func);
2220 self->pers_func = value;
2221 Py_INCREF(value);
2222 return 0;
2223 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002224
Guido van Rossum60456fd1997-04-09 17:36:32 +00002225 if (strcmp(name, "inst_persistent_id") == 0) {
2226 Py_XDECREF(self->inst_pers_func);
2227 self->inst_pers_func = value;
2228 Py_INCREF(value);
2229 return 0;
2230 }
2231
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002232 if (strcmp(name, "memo") == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002233 if (! PyDict_Check(value)) {
2234 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2235 return -1;
2236 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002237 Py_XDECREF(self->memo);
2238 self->memo = value;
2239 Py_INCREF(value);
2240 return 0;
2241 }
2242
Guido van Rossum053b8df1998-11-25 16:18:00 +00002243 if (strcmp(name, "binary")==0) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002244 self->bin=PyObject_IsTrue(value);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002245 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002246 }
2247
Guido van Rossum053b8df1998-11-25 16:18:00 +00002248 if (strcmp(name, "fast")==0) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002249 self->fast=PyObject_IsTrue(value);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002250 return 0;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00002251 }
2252
Guido van Rossum60456fd1997-04-09 17:36:32 +00002253 PyErr_SetString(PyExc_AttributeError, name);
2254 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002255}
2256
2257
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002258static char Picklertype__doc__[] =
2259"Objects that know how to pickle objects\n"
2260;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002261
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002262static PyTypeObject Picklertype = {
2263 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002264 0, /*ob_size*/
2265 "Pickler", /*tp_name*/
2266 sizeof(Picklerobject), /*tp_basicsize*/
2267 0, /*tp_itemsize*/
2268 /* methods */
2269 (destructor)Pickler_dealloc, /*tp_dealloc*/
2270 (printfunc)0, /*tp_print*/
2271 (getattrfunc)Pickler_getattr, /*tp_getattr*/
2272 (setattrfunc)Pickler_setattr, /*tp_setattr*/
2273 (cmpfunc)0, /*tp_compare*/
2274 (reprfunc)0, /*tp_repr*/
2275 0, /*tp_as_number*/
2276 0, /*tp_as_sequence*/
2277 0, /*tp_as_mapping*/
2278 (hashfunc)0, /*tp_hash*/
2279 (ternaryfunc)0, /*tp_call*/
2280 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002281
Guido van Rossum60456fd1997-04-09 17:36:32 +00002282 /* Space for future expansion */
2283 0L,0L,0L,0L,
2284 Picklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002285};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002286
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002287static PyObject *
Guido van Rossume2d81cd1998-08-08 19:40:10 +00002288find_class(PyObject *py_module_name, PyObject *py_global_name) {
2289 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002290
Jeremy Hyltond1055231998-08-11 19:52:51 +00002291 module = PySys_GetObject("modules");
2292 if (module == NULL)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002293 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002294
2295 module = PyDict_GetItem(module, py_module_name);
2296 if (module == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002297 module = PyImport_Import(py_module_name);
2298 if (!module)
2299 return NULL;
2300 global = PyObject_GetAttr(module, py_global_name);
2301 Py_DECREF(module);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002302 }
Jeremy Hyltond1055231998-08-11 19:52:51 +00002303 else
Guido van Rossum053b8df1998-11-25 16:18:00 +00002304 global = PyObject_GetAttr(module, py_global_name);
Jeremy Hyltond1055231998-08-11 19:52:51 +00002305 if (global == NULL) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002306 char buf[256 + 37];
2307 sprintf(buf, "Failed to import class %.128s from module %.128s",
2308 PyString_AS_STRING((PyStringObject*)py_global_name),
2309 PyString_AS_STRING((PyStringObject*)py_module_name));
2310 PyErr_SetString(PyExc_SystemError, buf);
2311 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002312 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002313 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002314}
2315
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002316static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002317marker(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002318 if (self->num_marks < 1) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002319 PyErr_SetString(UnpicklingError, "could not find MARK");
2320 return -1;
2321 }
2322
2323 return self->marks[--self->num_marks];
2324}
2325
2326
2327static int
2328load_none(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002329 PDATA_APPEND(self->stack, Py_None, -1);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002330 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002331}
2332
2333
2334static int
2335load_int(Unpicklerobject *self) {
2336 PyObject *py_int = 0;
2337 char *endptr, *s;
2338 int len, res = -1;
2339 long l;
2340
2341 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002342 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002343
2344 errno = 0;
2345 l = strtol(s, &endptr, 0);
2346
2347 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2348 /* Hm, maybe we've got something long. Let's try reading
Guido van Rossum053b8df1998-11-25 16:18:00 +00002349 it as a Python long object. */
Guido van Rossum60456fd1997-04-09 17:36:32 +00002350 errno=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002351 UNLESS (py_int=PyLong_FromString(s,&endptr,0)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002352
Guido van Rossum053b8df1998-11-25 16:18:00 +00002353 if ((*endptr != '\n') || (endptr[1] != '\0')) {
2354 PyErr_SetString(PyExc_ValueError,
2355 "could not convert string to int");
2356 goto finally;
2357 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002358 }
2359 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002360 UNLESS (py_int = PyInt_FromLong(l)) goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002361 }
2362
Guido van Rossum053b8df1998-11-25 16:18:00 +00002363 free(s);
2364 PDATA_PUSH(self->stack, py_int, -1);
2365 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002366
2367finally:
2368 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002369
2370 return res;
2371}
2372
2373
2374static long
2375calc_binint(char *s, int x) {
2376 unsigned char c;
2377 int i;
2378 long l;
2379
2380 for (i = 0, l = 0L; i < x; i++) {
2381 c = (unsigned char)s[i];
2382 l |= (long)c << (i * 8);
2383 }
2384
2385 return l;
2386}
2387
2388
2389static int
2390load_binintx(Unpicklerobject *self, char *s, int x) {
2391 PyObject *py_int = 0;
2392 long l;
2393
2394 l = calc_binint(s, x);
2395
Guido van Rossum053b8df1998-11-25 16:18:00 +00002396 UNLESS (py_int = PyInt_FromLong(l))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002397 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002398
Guido van Rossum053b8df1998-11-25 16:18:00 +00002399 PDATA_PUSH(self->stack, py_int, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002400 return 0;
2401}
2402
2403
2404static int
2405load_binint(Unpicklerobject *self) {
2406 char *s;
2407
2408 if ((*self->read_func)(self, &s, 4) < 0)
2409 return -1;
2410
2411 return load_binintx(self, s, 4);
2412}
2413
2414
2415static int
2416load_binint1(Unpicklerobject *self) {
2417 char *s;
2418
2419 if ((*self->read_func)(self, &s, 1) < 0)
2420 return -1;
2421
2422 return load_binintx(self, s, 1);
2423}
2424
2425
2426static int
2427load_binint2(Unpicklerobject *self) {
2428 char *s;
2429
2430 if ((*self->read_func)(self, &s, 2) < 0)
2431 return -1;
2432
2433 return load_binintx(self, s, 2);
2434}
2435
2436static int
2437load_long(Unpicklerobject *self) {
2438 PyObject *l = 0;
2439 char *end, *s;
2440 int len, res = -1;
2441
Guido van Rossum60456fd1997-04-09 17:36:32 +00002442 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002443 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002444
Guido van Rossum053b8df1998-11-25 16:18:00 +00002445 UNLESS (l = PyLong_FromString(s, &end, 0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002446 goto finally;
2447
Guido van Rossum053b8df1998-11-25 16:18:00 +00002448 free(s);
2449 PDATA_PUSH(self->stack, l, -1);
2450 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002451
2452finally:
2453 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002454
2455 return res;
2456}
2457
2458
2459static int
2460load_float(Unpicklerobject *self) {
2461 PyObject *py_float = 0;
2462 char *endptr, *s;
2463 int len, res = -1;
2464 double d;
2465
2466 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002467 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002468
2469 errno = 0;
2470 d = strtod(s, &endptr);
2471
2472 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2473 PyErr_SetString(PyExc_ValueError,
2474 "could not convert string to float");
2475 goto finally;
2476 }
2477
Guido van Rossum053b8df1998-11-25 16:18:00 +00002478 UNLESS (py_float = PyFloat_FromDouble(d))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002479 goto finally;
2480
Guido van Rossum053b8df1998-11-25 16:18:00 +00002481 free(s);
2482 PDATA_PUSH(self->stack, py_float, -1);
2483 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002484
2485finally:
2486 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002487
2488 return res;
2489}
2490
Guido van Rossum60456fd1997-04-09 17:36:32 +00002491static int
2492load_binfloat(Unpicklerobject *self) {
2493 PyObject *py_float = 0;
2494 int s, e, res = -1;
2495 long fhi, flo;
2496 double x;
2497 char *p;
2498
2499 if ((*self->read_func)(self, &p, 8) < 0)
2500 return -1;
2501
2502 /* First byte */
2503 s = (*p>>7) & 1;
2504 e = (*p & 0x7F) << 4;
2505 p++;
2506
2507 /* Second byte */
2508 e |= (*p>>4) & 0xF;
2509 fhi = (*p & 0xF) << 24;
2510 p++;
2511
2512 /* Third byte */
2513 fhi |= (*p & 0xFF) << 16;
2514 p++;
2515
2516 /* Fourth byte */
2517 fhi |= (*p & 0xFF) << 8;
2518 p++;
2519
2520 /* Fifth byte */
2521 fhi |= *p & 0xFF;
2522 p++;
2523
2524 /* Sixth byte */
2525 flo = (*p & 0xFF) << 16;
2526 p++;
2527
2528 /* Seventh byte */
2529 flo |= (*p & 0xFF) << 8;
2530 p++;
2531
2532 /* Eighth byte */
2533 flo |= *p & 0xFF;
2534
2535 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
2536 x /= 268435456.0; /* 2**28 */
2537
2538 /* XXX This sadly ignores Inf/NaN */
2539 if (e == 0)
2540 e = -1022;
2541 else {
2542 x += 1.0;
2543 e -= 1023;
2544 }
2545 x = ldexp(x, e);
2546
2547 if (s)
2548 x = -x;
2549
Guido van Rossum053b8df1998-11-25 16:18:00 +00002550 UNLESS (py_float = PyFloat_FromDouble(x)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002551
Guido van Rossum053b8df1998-11-25 16:18:00 +00002552 PDATA_PUSH(self->stack, py_float, -1);
2553 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002554}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002555
2556static int
2557load_string(Unpicklerobject *self) {
2558 PyObject *str = 0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002559 int len, res = -1, nslash;
2560 char *s, q, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002561
2562 static PyObject *eval_dict = 0;
2563
2564 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002565 UNLESS (s=pystrndup(s,len)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002566
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002567 /* Check for unquoted quotes (evil strings) */
2568 q=*s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002569 if (q != '"' && q != '\'') goto insecure;
2570 for (p=s+1, nslash=0; *p; p++) {
2571 if (*p==q && nslash%2==0) break;
2572 if (*p=='\\') nslash++;
2573 else nslash=0;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002574 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002575 if (*p==q)
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002576 {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002577 for (p++; *p; p++) if (*p > ' ') goto insecure;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002578 }
2579 else goto insecure;
2580 /********************************************/
2581
Guido van Rossum053b8df1998-11-25 16:18:00 +00002582 UNLESS (eval_dict)
2583 UNLESS (eval_dict = Py_BuildValue("{s{}}", "__builtins__"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002584 goto finally;
2585
Guido van Rossum053b8df1998-11-25 16:18:00 +00002586 UNLESS (str = PyRun_String(s, Py_eval_input, eval_dict, eval_dict))
Guido van Rossum60456fd1997-04-09 17:36:32 +00002587 goto finally;
2588
Guido van Rossum053b8df1998-11-25 16:18:00 +00002589 free(s);
2590 PDATA_PUSH(self->stack, str, -1);
2591 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002592
2593finally:
2594 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002595
2596 return res;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002597
2598insecure:
2599 free(s);
2600 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
2601 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002602}
2603
2604
2605static int
2606load_binstring(Unpicklerobject *self) {
2607 PyObject *py_string = 0;
2608 long l;
2609 int res = -1;
2610 char *s;
2611
Guido van Rossum053b8df1998-11-25 16:18:00 +00002612 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002613
2614 l = calc_binint(s, 4);
2615
2616 if ((*self->read_func)(self, &s, l) < 0)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002617 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002618
Guido van Rossum053b8df1998-11-25 16:18:00 +00002619 UNLESS (py_string = PyString_FromStringAndSize(s, l))
2620 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002621
Guido van Rossum053b8df1998-11-25 16:18:00 +00002622 PDATA_PUSH(self->stack, py_string, -1);
2623 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002624}
2625
2626
2627static int
2628load_short_binstring(Unpicklerobject *self) {
2629 PyObject *py_string = 0;
2630 unsigned char l;
2631 int res = -1;
2632 char *s;
2633
2634 if ((*self->read_func)(self, &s, 1) < 0)
2635 return -1;
2636
2637 l = (unsigned char)s[0];
2638
Guido van Rossum053b8df1998-11-25 16:18:00 +00002639 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002640
Guido van Rossum053b8df1998-11-25 16:18:00 +00002641 UNLESS (py_string = PyString_FromStringAndSize(s, l)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002642
Guido van Rossum053b8df1998-11-25 16:18:00 +00002643 PDATA_PUSH(self->stack, py_string, -1);
2644 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002645}
2646
2647
2648static int
2649load_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002650 PyObject *tup;
2651 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
Guido van Rossum053b8df1998-11-25 16:18:00 +00002653 if ((i = marker(self)) < 0) return -1;
2654 UNLESS (tup=Pdata_popTuple(self->stack, i)) return -1;
2655 PDATA_PUSH(self->stack, tup, -1);
2656 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002657}
2658
2659static int
2660load_empty_tuple(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002661 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002662
Guido van Rossum053b8df1998-11-25 16:18:00 +00002663 UNLESS (tup=PyTuple_New(0)) return -1;
2664 PDATA_PUSH(self->stack, tup, -1);
2665 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002666}
2667
2668static int
2669load_empty_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002670 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002671
Guido van Rossum053b8df1998-11-25 16:18:00 +00002672 UNLESS (list=PyList_New(0)) return -1;
2673 PDATA_PUSH(self->stack, list, -1);
2674 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675}
2676
2677static int
2678load_empty_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002679 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002680
Guido van Rossum053b8df1998-11-25 16:18:00 +00002681 UNLESS (dict=PyDict_New()) return -1;
2682 PDATA_PUSH(self->stack, dict, -1);
2683 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002684}
2685
2686
2687static int
2688load_list(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002689 PyObject *list = 0;
2690 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002691
Guido van Rossum053b8df1998-11-25 16:18:00 +00002692 if ((i = marker(self)) < 0) return -1;
2693 UNLESS (list=Pdata_popList(self->stack, i)) return -1;
2694 PDATA_PUSH(self->stack, list, -1);
2695 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002696}
2697
2698static int
2699load_dict(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002700 PyObject *dict, *key, *value;
2701 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002702
Guido van Rossum053b8df1998-11-25 16:18:00 +00002703 if ((i = marker(self)) < 0) return -1;
2704 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002705
Guido van Rossum053b8df1998-11-25 16:18:00 +00002706 UNLESS (dict = PyDict_New()) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002707
Guido van Rossum053b8df1998-11-25 16:18:00 +00002708 for (k = i+1; k < j; k += 2) {
2709 key =self->stack->data[k-1];
2710 value=self->stack->data[k ];
2711 if (PyDict_SetItem(dict, key, value) < 0) {
2712 Py_DECREF(dict);
2713 return -1;
2714 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002715 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00002716 Pdata_clear(self->stack, i);
2717 PDATA_PUSH(self->stack, dict, -1);
2718 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002719}
2720
2721static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002722Instance_New(PyObject *cls, PyObject *args) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002723 int has_key;
2724 PyObject *safe=0, *r=0;
2725
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002726 if (PyClass_Check(cls)) {
2727 int l;
2728
Guido van Rossum053b8df1998-11-25 16:18:00 +00002729 if ((l=PyObject_Length(args)) < 0) goto err;
2730 UNLESS (l) {
2731 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002732
Guido van Rossum053b8df1998-11-25 16:18:00 +00002733 UNLESS (__getinitargs__=PyObject_GetAttr(cls, __getinitargs___str)) {
2734 /* We have a class with no __getinitargs__, so bypass usual
2735 construction */
2736 PyInstanceObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002737
Guido van Rossum053b8df1998-11-25 16:18:00 +00002738 PyErr_Clear();
2739 UNLESS (inst=PyObject_NEW(PyInstanceObject, &PyInstance_Type))
2740 goto err;
2741 inst->in_class=(PyClassObject*)cls;
2742 Py_INCREF(cls);
2743 UNLESS (inst->in_dict=PyDict_New()) {
2744 Py_DECREF(inst);
2745 goto err;
2746 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002747
Guido van Rossum053b8df1998-11-25 16:18:00 +00002748 return (PyObject *)inst;
2749 }
2750 Py_DECREF(__getinitargs__);
2751 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002752
Guido van Rossum053b8df1998-11-25 16:18:00 +00002753 if ((r=PyInstance_New(cls, args, NULL))) return r;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002754 else goto err;
2755 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002756
2757
2758 if ((has_key = cPickle_PyMapping_HasKey(safe_constructors, cls)) < 0)
2759 goto err;
2760
2761 if (!has_key)
Guido van Rossum053b8df1998-11-25 16:18:00 +00002762 if (!(safe = PyObject_GetAttr(cls, __safe_for_unpickling___str)) ||
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763 !PyObject_IsTrue(safe)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002764 cPickle_ErrFormat(UnpicklingError,
2765 "%s is not safe for unpickling", "O", cls);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002766 Py_XDECREF(safe);
2767 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002768 }
2769
Guido van Rossum053b8df1998-11-25 16:18:00 +00002770 if (args==Py_None) {
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002771 /* Special case, call cls.__basicnew__() */
2772 PyObject *basicnew;
2773
Guido van Rossum053b8df1998-11-25 16:18:00 +00002774 UNLESS (basicnew=PyObject_GetAttr(cls, __basicnew___str)) return NULL;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002775 r=PyObject_CallObject(basicnew, NULL);
2776 Py_DECREF(basicnew);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002777 if (r) return r;
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002778 }
2779
Guido van Rossum053b8df1998-11-25 16:18:00 +00002780 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00002781
Guido van Rossum60456fd1997-04-09 17:36:32 +00002782err:
2783 {
2784 PyObject *tp, *v, *tb;
2785
2786 PyErr_Fetch(&tp, &v, &tb);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002787 if ((r=Py_BuildValue("OOO",v,cls,args))) {
2788 Py_XDECREF(v);
2789 v=r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790 }
2791 PyErr_Restore(tp,v,tb);
2792 }
2793 return NULL;
2794}
2795
2796
2797static int
2798load_obj(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002799 PyObject *class, *tup, *obj=0;
2800 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002801
Guido van Rossum053b8df1998-11-25 16:18:00 +00002802 if ((i = marker(self)) < 0) return -1;
2803 UNLESS (tup=Pdata_popTuple(self->stack, i+1)) return -1;
2804 PDATA_POP(self->stack, class);
2805 if (class) {
2806 obj = Instance_New(class, tup);
2807 Py_DECREF(class);
2808 }
2809 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002810
Guido van Rossum053b8df1998-11-25 16:18:00 +00002811 if (! obj) return -1;
2812 PDATA_PUSH(self->stack, obj, -1);
2813 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002814}
2815
2816
2817static int
2818load_inst(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002819 PyObject *tup, *class, *obj, *module_name, *class_name;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002820 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821 char *s;
2822
Guido van Rossum053b8df1998-11-25 16:18:00 +00002823 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002824
Guido van Rossum053b8df1998-11-25 16:18:00 +00002825 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2826 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002827
Guido van Rossum053b8df1998-11-25 16:18:00 +00002828 if ((len = (*self->readline_func)(self, &s)) >= 0) {
2829 if (class_name = PyString_FromStringAndSize(s, len - 1)) {
2830 class = find_class(module_name, class_name);
2831 Py_DECREF(class_name);
2832 }
2833 }
2834 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002835
Guido van Rossum053b8df1998-11-25 16:18:00 +00002836 if (! class) return -1;
2837
2838 if (tup=Pdata_popTuple(self->stack, i)) {
2839 obj = Instance_New(class, tup);
2840 Py_DECREF(tup);
2841 }
2842 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002843
Guido van Rossum053b8df1998-11-25 16:18:00 +00002844 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002845
Guido van Rossum053b8df1998-11-25 16:18:00 +00002846 PDATA_PUSH(self->stack, obj, -1);
2847 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848}
2849
2850
2851static int
2852load_global(Unpicklerobject *self) {
2853 PyObject *class = 0, *module_name = 0, *class_name = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002854 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855 char *s;
2856
Guido van Rossum053b8df1998-11-25 16:18:00 +00002857 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2858 UNLESS (module_name = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002859
Guido van Rossum053b8df1998-11-25 16:18:00 +00002860 if ((len = (*self->readline_func)(self, &s)) >= 0) {
2861 if (class_name = PyString_FromStringAndSize(s, len - 1)) {
2862 class = find_class(module_name, class_name);
2863 Py_DECREF(class_name);
2864 }
2865 }
2866 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Guido van Rossum053b8df1998-11-25 16:18:00 +00002868 if (! class) return -1;
2869 PDATA_PUSH(self->stack, class, -1);
2870 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871}
2872
2873
2874static int
2875load_persid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002876 PyObject *pid = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002877 int len, res = -1;
2878 char *s;
2879
2880 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002881 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002882
Guido van Rossum053b8df1998-11-25 16:18:00 +00002883 UNLESS (pid = PyString_FromStringAndSize(s, len - 1)) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002884
Guido van Rossum053b8df1998-11-25 16:18:00 +00002885 if (PyList_Check(self->pers_func)) {
2886 if (PyList_Append(self->pers_func, pid) < 0) {
2887 Py_DECREF(pid);
2888 return -1;
2889 }
2890 }
2891 else {
2892 ARG_TUP(self, pid);
2893 if (self->arg) {
2894 pid = PyObject_CallObject(self->pers_func, self->arg);
2895 FREE_ARG_TUP(self);
2896 }
2897 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002898
Guido van Rossum053b8df1998-11-25 16:18:00 +00002899 if (! pid) return -1;
2900
2901 PDATA_PUSH(self->stack, pid, -1);
2902 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002903 }
2904 else {
2905 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002906 "A load persistent id instruction was encountered,\n"
2907 "but no persistent_load function was specified.");
2908 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002909 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002910}
2911
Guido van Rossum60456fd1997-04-09 17:36:32 +00002912static int
2913load_binpersid(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002914 PyObject *pid = 0;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002915 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916
2917 if (self->pers_func) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00002918 PDATA_POP(self->stack, pid);
2919 if (! pid) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002920
Guido van Rossum053b8df1998-11-25 16:18:00 +00002921 if (PyList_Check(self->pers_func)) {
2922 if (PyList_Append(self->pers_func, pid) < 0) {
2923 Py_DECREF(pid);
2924 return -1;
2925 }
2926 }
2927 else {
2928 ARG_TUP(self, pid);
2929 if (self->arg) {
2930 pid = PyObject_CallObject(self->pers_func, self->arg);
2931 FREE_ARG_TUP(self);
2932 }
2933 if (! pid) return -1;
2934 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Guido van Rossum053b8df1998-11-25 16:18:00 +00002936 PDATA_PUSH(self->stack, pid, -1);
2937 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002938 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002939 else {
2940 PyErr_SetString(UnpicklingError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00002941 "A load persistent id instruction was encountered,\n"
2942 "but no persistent_load function was specified.");
2943 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002944 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002945}
2946
2947
2948static int
2949load_pop(Unpicklerobject *self) {
2950 int len;
2951
Guido van Rossum053b8df1998-11-25 16:18:00 +00002952 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953
2954 if ((self->num_marks > 0) &&
2955 (self->marks[self->num_marks - 1] == len))
2956 self->num_marks--;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002957 else
2958 Py_DECREF(self->stack->data[--(self->stack->length)]);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959
2960 return 0;
2961}
2962
2963
2964static int
2965load_pop_mark(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00002966 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
2968 if ((i = marker(self)) < 0)
2969 return -1;
2970
Guido van Rossum053b8df1998-11-25 16:18:00 +00002971 Pdata_clear(self->stack, i);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002972
2973 return 0;
2974}
2975
2976
2977static int
2978load_dup(Unpicklerobject *self) {
2979 PyObject *last;
2980 int len;
2981
Guido van Rossum053b8df1998-11-25 16:18:00 +00002982 if ((len = self->stack->length) <= 0) return stackUnderflow();
2983 last=self->stack->data[len-1];
2984 Py_INCREF(last);
2985 PDATA_PUSH(self->stack, last, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002986 return 0;
2987}
2988
2989
2990static int
2991load_get(Unpicklerobject *self) {
2992 PyObject *py_str = 0, *value = 0;
2993 int len, res = -1;
2994 char *s;
2995
Guido van Rossum053b8df1998-11-25 16:18:00 +00002996 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002997
Guido van Rossum053b8df1998-11-25 16:18:00 +00002998 UNLESS (py_str = PyString_FromStringAndSize(s, len - 1)) return -1;
2999
3000 value = PyDict_GetItem(self->memo, py_str);
3001 Py_DECREF(py_str);
3002 if (! value) {
3003 PyErr_SetObject(BadPickleGet, py_str);
3004 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00003005 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006
Guido van Rossum053b8df1998-11-25 16:18:00 +00003007 PDATA_APPEND(self->stack, value, -1);
3008 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009}
3010
3011
3012static int
3013load_binget(Unpicklerobject *self) {
3014 PyObject *py_key = 0, *value = 0;
3015 unsigned char key;
3016 int res = -1;
3017 char *s;
3018
Guido van Rossum053b8df1998-11-25 16:18:00 +00003019 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003020
3021 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003022 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3023
3024 value = PyDict_GetItem(self->memo, py_key);
3025 Py_DECREF(py_key);
3026 if (! value) {
3027 PyErr_SetObject(BadPickleGet, py_key);
3028 return -1;
3029 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003030
Guido van Rossum053b8df1998-11-25 16:18:00 +00003031 PDATA_APPEND(self->stack, value, -1);
3032 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033}
3034
3035
3036static int
3037load_long_binget(Unpicklerobject *self) {
3038 PyObject *py_key = 0, *value = 0;
3039 unsigned char c, *s;
3040 long key;
3041 int res = -1;
3042
Guido van Rossum053b8df1998-11-25 16:18:00 +00003043 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
3045 c = (unsigned char)s[0];
3046 key = (long)c;
3047 c = (unsigned char)s[1];
3048 key |= (long)c << 8;
3049 c = (unsigned char)s[2];
3050 key |= (long)c << 16;
3051 c = (unsigned char)s[3];
3052 key |= (long)c << 24;
3053
Guido van Rossum053b8df1998-11-25 16:18:00 +00003054 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3055
3056 value = PyDict_GetItem(self->memo, py_key);
3057 Py_DECREF(py_key);
3058 if (! value) {
3059 PyErr_SetObject(BadPickleGet, py_key);
3060 return -1;
3061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Guido van Rossum053b8df1998-11-25 16:18:00 +00003063 PDATA_APPEND(self->stack, value, -1);
3064 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065}
3066
3067
3068static int
3069load_put(Unpicklerobject *self) {
3070 PyObject *py_str = 0, *value = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003071 int len, l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072 char *s;
3073
Guido van Rossum053b8df1998-11-25 16:18:00 +00003074 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3075 UNLESS (len=self->stack->length) return stackUnderflow();
3076 UNLESS (py_str = PyString_FromStringAndSize(s, l - 1)) return -1;
3077 value=self->stack->data[len-1];
3078 l=PyDict_SetItem(self->memo, py_str, value);
3079 Py_DECREF(py_str);
3080 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081}
3082
3083
3084static int
3085load_binput(Unpicklerobject *self) {
3086 PyObject *py_key = 0, *value = 0;
3087 unsigned char key, *s;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003088 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003089
Guido van Rossum053b8df1998-11-25 16:18:00 +00003090 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3091 UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092
3093 key = (unsigned char)s[0];
3094
Guido van Rossum053b8df1998-11-25 16:18:00 +00003095 UNLESS (py_key = PyInt_FromLong((long)key)) return -1;
3096 value=self->stack->data[len-1];
3097 len=PyDict_SetItem(self->memo, py_key, value);
3098 Py_DECREF(py_key);
3099 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100}
3101
3102
3103static int
3104load_long_binput(Unpicklerobject *self) {
3105 PyObject *py_key = 0, *value = 0;
3106 long key;
3107 unsigned char c, *s;
3108 int len, res = -1;
3109
Guido van Rossum053b8df1998-11-25 16:18:00 +00003110 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3111 UNLESS (len=self->stack->length) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
3113 c = (unsigned char)s[0];
3114 key = (long)c;
3115 c = (unsigned char)s[1];
3116 key |= (long)c << 8;
3117 c = (unsigned char)s[2];
3118 key |= (long)c << 16;
3119 c = (unsigned char)s[3];
3120 key |= (long)c << 24;
3121
Guido van Rossum053b8df1998-11-25 16:18:00 +00003122 UNLESS (py_key = PyInt_FromLong(key)) return -1;
3123 value=self->stack->data[len-1];
3124 len=PyDict_SetItem(self->memo, py_key, value);
3125 Py_DECREF(py_key);
3126 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127}
3128
3129
3130static int
3131do_append(Unpicklerobject *self, int x) {
3132 PyObject *value = 0, *list = 0, *append_method = 0;
3133 int len, i;
3134
Guido van Rossum053b8df1998-11-25 16:18:00 +00003135 UNLESS ((len=self->stack->length) >= x && x > 0) return stackUnderflow();
3136 if (len==x) return 0; /* nothing to do */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Guido van Rossum053b8df1998-11-25 16:18:00 +00003138 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139
3140 if (PyList_Check(list)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003141 PyObject *slice;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142 int list_len;
3143
Guido van Rossum053b8df1998-11-25 16:18:00 +00003144 slice=Pdata_popList(self->stack, x);
3145 list_len = PyList_GET_SIZE(list);
3146 i=PyList_SetSlice(list, list_len, list_len, slice);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147 Py_DECREF(slice);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003148 return i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149 }
3150 else {
3151
Guido van Rossum053b8df1998-11-25 16:18:00 +00003152 UNLESS (append_method = PyObject_GetAttr(list, append_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153 return -1;
3154
3155 for (i = x; i < len; i++) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003156 PyObject *junk;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003157
Guido van Rossum053b8df1998-11-25 16:18:00 +00003158 value=self->stack->data[i];
3159 junk=0;
3160 ARG_TUP(self, value);
3161 if (self->arg) {
3162 junk = PyObject_CallObject(append_method, self->arg);
3163 FREE_ARG_TUP(self);
3164 }
3165 if (! junk) {
3166 Pdata_clear(self->stack, i+1);
3167 self->stack->length=x;
3168 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003170 }
3171 Py_DECREF(junk);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003173 self->stack->length=x;
3174 Py_DECREF(append_method);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003175 }
3176
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178}
3179
3180
3181static int
3182load_append(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003183 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184}
3185
3186
3187static int
3188load_appends(Unpicklerobject *self) {
3189 return do_append(self, marker(self));
3190}
3191
3192
3193static int
3194do_setitems(Unpicklerobject *self, int x) {
3195 PyObject *value = 0, *key = 0, *dict = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003196 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197
Guido van Rossum053b8df1998-11-25 16:18:00 +00003198 UNLESS ((len=self->stack->length) >= x
3199 && x > 0) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200
Guido van Rossum053b8df1998-11-25 16:18:00 +00003201 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202
Guido van Rossum053b8df1998-11-25 16:18:00 +00003203 for (i = x+1; i < len; i += 2) {
3204 key =self->stack->data[i-1];
3205 value=self->stack->data[i ];
3206 if (PyObject_SetItem(dict, key, value) < 0) {
3207 r=-1;
3208 break;
3209 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210 }
3211
Guido van Rossum053b8df1998-11-25 16:18:00 +00003212 Pdata_clear(self->stack, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003213
Guido van Rossum053b8df1998-11-25 16:18:00 +00003214 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215}
3216
3217
3218static int
3219load_setitem(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003220 return do_setitems(self, self->stack->length - 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221}
3222
Guido van Rossum60456fd1997-04-09 17:36:32 +00003223static int
3224load_setitems(Unpicklerobject *self) {
3225 return do_setitems(self, marker(self));
3226}
3227
3228
3229static int
3230load_build(Unpicklerobject *self) {
3231 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3232 *junk = 0, *__setstate__ = 0;
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003233 int i, r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Guido van Rossum053b8df1998-11-25 16:18:00 +00003235 if (self->stack->length < 2) return stackUnderflow();
3236 PDATA_POP(self->stack, value);
3237 if (! value) return -1;
3238 inst=self->stack->data[self->stack->length-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239
Guido van Rossum053b8df1998-11-25 16:18:00 +00003240 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3241 ARG_TUP(self, value);
3242 if (self->arg) {
3243 junk = PyObject_CallObject(__setstate__, self->arg);
3244 FREE_ARG_TUP(self);
3245 }
3246 Py_DECREF(__setstate__);
3247 if (! junk) return -1;
3248 Py_DECREF(junk);
3249 return 0;
3250 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003251
Guido van Rossum053b8df1998-11-25 16:18:00 +00003252 PyErr_Clear();
3253 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254 i = 0;
3255 while (PyDict_Next(value, &i, &d_key, &d_value)) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003256 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3257 r=-1;
3258 break;
3259 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003260 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003261 Py_DECREF(instdict);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003263 else r=-1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003264
Guido van Rossum053b8df1998-11-25 16:18:00 +00003265 Py_XDECREF(value);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266
Guido van Rossum053b8df1998-11-25 16:18:00 +00003267 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003268}
3269
3270
3271static int
3272load_mark(Unpicklerobject *self) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003273 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003274
Guido van Rossum053b8df1998-11-25 16:18:00 +00003275 if ((self->num_marks + 1) >= self->marks_size) {
3276 s=self->marks_size+20;
3277 if (s <= self->num_marks) s=self->num_marks + 1;
3278 self->marks =(int *)realloc(self->marks, s * sizeof(int));
3279 if (! self->marks) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003280 PyErr_NoMemory();
3281 return -1;
3282 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003283 self->marks_size = s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003284 }
3285
Guido van Rossum053b8df1998-11-25 16:18:00 +00003286 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
3288 return 0;
3289}
3290
3291static int
3292load_reduce(Unpicklerobject *self) {
3293 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003294
Guido van Rossum053b8df1998-11-25 16:18:00 +00003295 PDATA_POP(self->stack, arg_tup);
3296 if (! arg_tup) return -1;
3297 PDATA_POP(self->stack, callable);
3298 if (callable) {
3299 ob = Instance_New(callable, arg_tup);
3300 Py_DECREF(callable);
3301 }
3302 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003303
Guido van Rossum053b8df1998-11-25 16:18:00 +00003304 if (! ob) return -1;
3305
3306 PDATA_PUSH(self->stack, ob, -1);
3307 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308}
3309
3310static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003311load(Unpicklerobject *self) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00003312 PyObject *stack = 0, *err = 0, *val = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313 char *s;
3314
Guido van Rossum60456fd1997-04-09 17:36:32 +00003315 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003316 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317
3318 while (1) {
3319 if ((*self->read_func)(self, &s, 1) < 0)
3320 break;
3321
3322 switch (s[0]) {
3323 case NONE:
3324 if (load_none(self) < 0)
3325 break;
3326 continue;
3327
3328 case BININT:
3329 if (load_binint(self) < 0)
3330 break;
3331 continue;
3332
3333 case BININT1:
3334 if (load_binint1(self) < 0)
3335 break;
3336 continue;
3337
3338 case BININT2:
3339 if (load_binint2(self) < 0)
3340 break;
3341 continue;
3342
3343 case INT:
3344 if (load_int(self) < 0)
3345 break;
3346 continue;
3347
3348 case LONG:
3349 if (load_long(self) < 0)
3350 break;
3351 continue;
3352
3353 case FLOAT:
3354 if (load_float(self) < 0)
3355 break;
3356 continue;
3357
Guido van Rossum60456fd1997-04-09 17:36:32 +00003358 case BINFLOAT:
3359 if (load_binfloat(self) < 0)
3360 break;
3361 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362
3363 case BINSTRING:
3364 if (load_binstring(self) < 0)
3365 break;
3366 continue;
3367
3368 case SHORT_BINSTRING:
3369 if (load_short_binstring(self) < 0)
3370 break;
3371 continue;
3372
3373 case STRING:
3374 if (load_string(self) < 0)
3375 break;
3376 continue;
3377
3378 case EMPTY_TUPLE:
3379 if (load_empty_tuple(self) < 0)
3380 break;
3381 continue;
3382
3383 case TUPLE:
3384 if (load_tuple(self) < 0)
3385 break;
3386 continue;
3387
3388 case EMPTY_LIST:
3389 if (load_empty_list(self) < 0)
3390 break;
3391 continue;
3392
3393 case LIST:
3394 if (load_list(self) < 0)
3395 break;
3396 continue;
3397
3398 case EMPTY_DICT:
3399 if (load_empty_dict(self) < 0)
3400 break;
3401 continue;
3402
3403 case DICT:
3404 if (load_dict(self) < 0)
3405 break;
3406 continue;
3407
3408 case OBJ:
3409 if (load_obj(self) < 0)
3410 break;
3411 continue;
3412
3413 case INST:
3414 if (load_inst(self) < 0)
3415 break;
3416 continue;
3417
3418 case GLOBAL:
3419 if (load_global(self) < 0)
3420 break;
3421 continue;
3422
3423 case APPEND:
3424 if (load_append(self) < 0)
3425 break;
3426 continue;
3427
3428 case APPENDS:
3429 if (load_appends(self) < 0)
3430 break;
3431 continue;
3432
3433 case BUILD:
3434 if (load_build(self) < 0)
3435 break;
3436 continue;
3437
3438 case DUP:
3439 if (load_dup(self) < 0)
3440 break;
3441 continue;
3442
3443 case BINGET:
3444 if (load_binget(self) < 0)
3445 break;
3446 continue;
3447
3448 case LONG_BINGET:
3449 if (load_long_binget(self) < 0)
3450 break;
3451 continue;
3452
3453 case GET:
3454 if (load_get(self) < 0)
3455 break;
3456 continue;
3457
3458 case MARK:
3459 if (load_mark(self) < 0)
3460 break;
3461 continue;
3462
3463 case BINPUT:
3464 if (load_binput(self) < 0)
3465 break;
3466 continue;
3467
3468 case LONG_BINPUT:
3469 if (load_long_binput(self) < 0)
3470 break;
3471 continue;
3472
3473 case PUT:
3474 if (load_put(self) < 0)
3475 break;
3476 continue;
3477
3478 case POP:
3479 if (load_pop(self) < 0)
3480 break;
3481 continue;
3482
3483 case POP_MARK:
3484 if (load_pop_mark(self) < 0)
3485 break;
3486 continue;
3487
3488 case SETITEM:
3489 if (load_setitem(self) < 0)
3490 break;
3491 continue;
3492
3493 case SETITEMS:
3494 if (load_setitems(self) < 0)
3495 break;
3496 continue;
3497
3498 case STOP:
3499 break;
3500
3501 case PERSID:
3502 if (load_persid(self) < 0)
3503 break;
3504 continue;
3505
3506 case BINPERSID:
3507 if (load_binpersid(self) < 0)
3508 break;
3509 continue;
3510
3511 case REDUCE:
3512 if (load_reduce(self) < 0)
3513 break;
3514 continue;
3515
3516 default:
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00003517 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003518 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003519 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520 }
3521
3522 break;
3523 }
3524
Guido van Rossum053b8df1998-11-25 16:18:00 +00003525 if ((err = PyErr_Occurred())) {
3526 if (err == PyExc_EOFError) {
3527 PyErr_SetNone(PyExc_EOFError);
3528 }
3529 return NULL;
3530 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003531
Guido van Rossum053b8df1998-11-25 16:18:00 +00003532 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003533 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534}
3535
3536
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003537/* No-load functions to support noload, which is used to
3538 find persistent references. */
3539
3540static int
3541noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003542 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003543
3544 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003545 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003546}
3547
3548
3549static int
3550noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003551 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003552 char *s;
3553
3554 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003555 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003556 if ((*self->readline_func)(self, &s) < 0) return -1;
3557 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003558 PDATA_APPEND(self->stack, Py_None,-1);
3559 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003560}
3561
3562static int
3563noload_global(Unpicklerobject *self) {
3564 char *s;
3565
3566 if ((*self->readline_func)(self, &s) < 0) return -1;
3567 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003568 PDATA_APPEND(self->stack, Py_None,-1);
3569 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003570}
3571
3572static int
3573noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003574
Guido van Rossum053b8df1998-11-25 16:18:00 +00003575 if (self->stack->length < 2) return stackUnderflow();
3576 Pdata_clear(self->stack, self->stack->length-2);
3577 PDATA_APPEND(self->stack, Py_None,-1);
3578 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003579}
3580
3581static int
3582noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003583
Guido van Rossum053b8df1998-11-25 16:18:00 +00003584 if (self->stack->length < 1) return stackUnderflow();
3585 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003586 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003587}
3588
3589
3590static PyObject *
3591noload(Unpicklerobject *self) {
3592 PyObject *stack = 0, *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003593 char *s;
3594
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003595 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003596 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003597
3598 while (1) {
3599 if ((*self->read_func)(self, &s, 1) < 0)
3600 break;
3601
3602 switch (s[0]) {
3603 case NONE:
3604 if (load_none(self) < 0)
3605 break;
3606 continue;
3607
3608 case BININT:
3609 if (load_binint(self) < 0)
3610 break;
3611 continue;
3612
3613 case BININT1:
3614 if (load_binint1(self) < 0)
3615 break;
3616 continue;
3617
3618 case BININT2:
3619 if (load_binint2(self) < 0)
3620 break;
3621 continue;
3622
3623 case INT:
3624 if (load_int(self) < 0)
3625 break;
3626 continue;
3627
3628 case LONG:
3629 if (load_long(self) < 0)
3630 break;
3631 continue;
3632
3633 case FLOAT:
3634 if (load_float(self) < 0)
3635 break;
3636 continue;
3637
3638 case BINFLOAT:
3639 if (load_binfloat(self) < 0)
3640 break;
3641 continue;
3642
3643 case BINSTRING:
3644 if (load_binstring(self) < 0)
3645 break;
3646 continue;
3647
3648 case SHORT_BINSTRING:
3649 if (load_short_binstring(self) < 0)
3650 break;
3651 continue;
3652
3653 case STRING:
3654 if (load_string(self) < 0)
3655 break;
3656 continue;
3657
3658 case EMPTY_TUPLE:
3659 if (load_empty_tuple(self) < 0)
3660 break;
3661 continue;
3662
3663 case TUPLE:
3664 if (load_tuple(self) < 0)
3665 break;
3666 continue;
3667
3668 case EMPTY_LIST:
3669 if (load_empty_list(self) < 0)
3670 break;
3671 continue;
3672
3673 case LIST:
3674 if (load_list(self) < 0)
3675 break;
3676 continue;
3677
3678 case EMPTY_DICT:
3679 if (load_empty_dict(self) < 0)
3680 break;
3681 continue;
3682
3683 case DICT:
3684 if (load_dict(self) < 0)
3685 break;
3686 continue;
3687
3688 case OBJ:
3689 if (noload_obj(self) < 0)
3690 break;
3691 continue;
3692
3693 case INST:
3694 if (noload_inst(self) < 0)
3695 break;
3696 continue;
3697
3698 case GLOBAL:
3699 if (noload_global(self) < 0)
3700 break;
3701 continue;
3702
3703 case APPEND:
3704 if (load_append(self) < 0)
3705 break;
3706 continue;
3707
3708 case APPENDS:
3709 if (load_appends(self) < 0)
3710 break;
3711 continue;
3712
3713 case BUILD:
3714 if (noload_build(self) < 0)
3715 break;
3716 continue;
3717
3718 case DUP:
3719 if (load_dup(self) < 0)
3720 break;
3721 continue;
3722
3723 case BINGET:
3724 if (load_binget(self) < 0)
3725 break;
3726 continue;
3727
3728 case LONG_BINGET:
3729 if (load_long_binget(self) < 0)
3730 break;
3731 continue;
3732
3733 case GET:
3734 if (load_get(self) < 0)
3735 break;
3736 continue;
3737
3738 case MARK:
3739 if (load_mark(self) < 0)
3740 break;
3741 continue;
3742
3743 case BINPUT:
3744 if (load_binput(self) < 0)
3745 break;
3746 continue;
3747
3748 case LONG_BINPUT:
3749 if (load_long_binput(self) < 0)
3750 break;
3751 continue;
3752
3753 case PUT:
3754 if (load_put(self) < 0)
3755 break;
3756 continue;
3757
3758 case POP:
3759 if (load_pop(self) < 0)
3760 break;
3761 continue;
3762
3763 case POP_MARK:
3764 if (load_pop_mark(self) < 0)
3765 break;
3766 continue;
3767
3768 case SETITEM:
3769 if (load_setitem(self) < 0)
3770 break;
3771 continue;
3772
3773 case SETITEMS:
3774 if (load_setitems(self) < 0)
3775 break;
3776 continue;
3777
3778 case STOP:
3779 break;
3780
3781 case PERSID:
3782 if (load_persid(self) < 0)
3783 break;
3784 continue;
3785
3786 case BINPERSID:
3787 if (load_binpersid(self) < 0)
3788 break;
3789 continue;
3790
3791 case REDUCE:
3792 if (noload_reduce(self) < 0)
3793 break;
3794 continue;
3795
3796 default:
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00003797 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003798 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003799 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003800 }
3801
3802 break;
3803 }
3804
Guido van Rossum053b8df1998-11-25 16:18:00 +00003805 if ((err = PyErr_Occurred())) {
3806 if (err == PyExc_EOFError) {
3807 PyErr_SetNone(PyExc_EOFError);
3808 }
3809 return NULL;
3810 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003811
Guido van Rossum053b8df1998-11-25 16:18:00 +00003812 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003813 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003814}
3815
3816
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817static PyObject *
3818Unpickler_load(Unpicklerobject *self, PyObject *args) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003819 UNLESS (PyArg_ParseTuple(args, ""))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820 return NULL;
3821
3822 return load(self);
3823}
3824
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003825static PyObject *
3826Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003827 UNLESS (PyArg_ParseTuple(args, ""))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003828 return NULL;
3829
3830 return noload(self);
3831}
3832
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
3834static struct PyMethodDef Unpickler_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003835 {"load", (PyCFunction)Unpickler_load, 1,
3836 "load() -- Load a pickle"
3837 },
3838 {"noload", (PyCFunction)Unpickler_noload, 1,
3839 "noload() -- not load a pickle, but go through most of the motions\n"
3840 "\n"
3841 "This function can be used to read past a pickle without instantiating\n"
3842 "any objects or importing any modules. It can also be used to find all\n"
3843 "persistent references without instantiating any objects or importing\n"
3844 "any modules.\n"
3845 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00003846 {NULL, NULL} /* sentinel */
3847};
3848
3849
3850static Unpicklerobject *
3851newUnpicklerobject(PyObject *f) {
3852 Unpicklerobject *self;
3853
Guido van Rossum053b8df1998-11-25 16:18:00 +00003854 UNLESS (self = PyObject_NEW(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855 return NULL;
3856
3857 self->file = NULL;
3858 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003859 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003860 self->pers_func = NULL;
3861 self->last_string = NULL;
3862 self->marks = NULL;
3863 self->num_marks = 0;
3864 self->marks_size = 0;
3865 self->buf_size = 0;
3866 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00003867 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00003868 self->safe_constructors = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003869
Guido van Rossum053b8df1998-11-25 16:18:00 +00003870 UNLESS (self->memo = PyDict_New()) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003871 Py_XDECREF((PyObject *)self);
3872 return NULL;
3873 }
3874
3875 Py_INCREF(f);
3876 self->file = f;
3877
3878 /* Set read, readline based on type of f */
3879 if (PyFile_Check(f)) {
3880 self->fp = PyFile_AsFile(f);
3881 self->read_func = read_file;
3882 self->readline_func = readline_file;
3883 }
3884 else if (PycStringIO_InputCheck(f)) {
3885 self->fp = NULL;
3886 self->read_func = read_cStringIO;
3887 self->readline_func = readline_cStringIO;
3888 }
3889 else {
3890
3891 self->fp = NULL;
3892 self->read_func = read_other;
3893 self->readline_func = readline_other;
3894
Guido van Rossum053b8df1998-11-25 16:18:00 +00003895 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003896 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003897 PyErr_Clear();
3898 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
3899 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00003900 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003901 }
3902 }
3903
Guido van Rossum053b8df1998-11-25 16:18:00 +00003904 if (PyEval_GetRestricted()) {
3905 /* Restricted execution, get private tables */
3906 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003907
Guido van Rossum053b8df1998-11-25 16:18:00 +00003908 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
3909 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
3910 Py_DECREF(m);
3911 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003912 }
3913 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003914 self->safe_constructors=safe_constructors;
3915 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003916 }
3917
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003919
3920err:
3921 Py_DECREF((PyObject *)self);
3922 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003923}
3924
3925
3926static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00003927get_Unpickler(PyObject *self, PyObject *args) {
3928 PyObject *file;
3929
Guido van Rossum053b8df1998-11-25 16:18:00 +00003930 UNLESS (PyArg_ParseTuple(args, "O", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931 return NULL;
3932 return (PyObject *)newUnpicklerobject(file);
3933}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003934
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003935
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936static void
3937Unpickler_dealloc(Unpicklerobject *self) {
3938 Py_XDECREF(self->readline);
3939 Py_XDECREF(self->read);
3940 Py_XDECREF(self->file);
3941 Py_XDECREF(self->memo);
3942 Py_XDECREF(self->stack);
3943 Py_XDECREF(self->pers_func);
3944 Py_XDECREF(self->arg);
3945 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003946 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003947
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948 if (self->marks) {
3949 free(self->marks);
3950 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003951
Guido van Rossum60456fd1997-04-09 17:36:32 +00003952 if (self->buf_size) {
3953 free(self->buf);
3954 }
3955
3956 PyMem_DEL(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003957}
3958
3959
3960static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961Unpickler_getattr(Unpicklerobject *self, char *name) {
3962 if (!strcmp(name, "persistent_load")) {
3963 if (!self->pers_func) {
3964 PyErr_SetString(PyExc_AttributeError, name);
3965 return NULL;
3966 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003967
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968 Py_INCREF(self->pers_func);
3969 return self->pers_func;
3970 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003971
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972 if (!strcmp(name, "memo")) {
3973 if (!self->memo) {
3974 PyErr_SetString(PyExc_AttributeError, name);
3975 return NULL;
3976 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003977
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978 Py_INCREF(self->memo);
3979 return self->memo;
3980 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003981
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982 if (!strcmp(name, "UnpicklingError")) {
3983 Py_INCREF(UnpicklingError);
3984 return UnpicklingError;
3985 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003986
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
3988}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003989
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990
3991static int
3992Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00003993
Guido van Rossum053b8df1998-11-25 16:18:00 +00003994 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00003995 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003996 "attribute deletion is not supported");
3997 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00003998 }
3999
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000 if (!strcmp(name, "persistent_load")) {
4001 Py_XDECREF(self->pers_func);
4002 self->pers_func = value;
4003 Py_INCREF(value);
4004 return 0;
4005 }
4006
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004007 if (strcmp(name, "memo") == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004008 if (! PyDict_Check(value)) {
4009 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4010 return -1;
4011 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004012 Py_XDECREF(self->memo);
4013 self->memo = value;
4014 Py_INCREF(value);
4015 return 0;
4016 }
4017
Guido van Rossum60456fd1997-04-09 17:36:32 +00004018 PyErr_SetString(PyExc_AttributeError, name);
4019 return -1;
4020}
4021
4022
4023static PyObject *
4024cpm_dump(PyObject *self, PyObject *args) {
4025 PyObject *ob, *file, *res = NULL;
4026 Picklerobject *pickler = 0;
4027 int bin = 0;
4028
Guido van Rossum053b8df1998-11-25 16:18:00 +00004029 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004030 goto finally;
4031
Guido van Rossum053b8df1998-11-25 16:18:00 +00004032 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033 goto finally;
4034
4035 if (dump(pickler, ob) < 0)
4036 goto finally;
4037
4038 Py_INCREF(Py_None);
4039 res = Py_None;
4040
4041finally:
4042 Py_XDECREF(pickler);
4043
4044 return res;
4045}
4046
4047
4048static PyObject *
4049cpm_dumps(PyObject *self, PyObject *args) {
4050 PyObject *ob, *file = 0, *res = NULL;
4051 Picklerobject *pickler = 0;
4052 int bin = 0;
4053
Guido van Rossum053b8df1998-11-25 16:18:00 +00004054 UNLESS (PyArg_ParseTuple(args, "O|i", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004055 goto finally;
4056
Guido van Rossum053b8df1998-11-25 16:18:00 +00004057 UNLESS (file = PycStringIO->NewOutput(128))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058 goto finally;
4059
Guido van Rossum053b8df1998-11-25 16:18:00 +00004060 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004061 goto finally;
4062
4063 if (dump(pickler, ob) < 0)
4064 goto finally;
4065
4066 res = PycStringIO->cgetvalue(file);
4067
4068finally:
4069 Py_XDECREF(pickler);
4070 Py_XDECREF(file);
4071
4072 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004073}
4074
4075
4076static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004077cpm_load(PyObject *self, PyObject *args) {
4078 Unpicklerobject *unpickler = 0;
4079 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004080
Guido van Rossum053b8df1998-11-25 16:18:00 +00004081 UNLESS (PyArg_ParseTuple(args, "O", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004082 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004083
Guido van Rossum053b8df1998-11-25 16:18:00 +00004084 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004085 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004086
Guido van Rossum60456fd1997-04-09 17:36:32 +00004087 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004088
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089finally:
4090 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004091
Guido van Rossum60456fd1997-04-09 17:36:32 +00004092 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004093}
4094
4095
4096static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004097cpm_loads(PyObject *self, PyObject *args) {
4098 PyObject *ob, *file = 0, *res = NULL;
4099 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004100
Guido van Rossum053b8df1998-11-25 16:18:00 +00004101 UNLESS (PyArg_ParseTuple(args, "S", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004102 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004103
Guido van Rossum053b8df1998-11-25 16:18:00 +00004104 UNLESS (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004105 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004106
Guido van Rossum053b8df1998-11-25 16:18:00 +00004107 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004108 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004109
Guido van Rossum60456fd1997-04-09 17:36:32 +00004110 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004111
Guido van Rossum60456fd1997-04-09 17:36:32 +00004112finally:
4113 Py_XDECREF(file);
4114 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004115
Guido van Rossum60456fd1997-04-09 17:36:32 +00004116 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004117}
4118
4119
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004120static char Unpicklertype__doc__[] =
4121"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004122
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004123static PyTypeObject Unpicklertype = {
4124 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004125 0, /*ob_size*/
4126 "Unpickler", /*tp_name*/
4127 sizeof(Unpicklerobject), /*tp_basicsize*/
4128 0, /*tp_itemsize*/
4129 /* methods */
4130 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4131 (printfunc)0, /*tp_print*/
4132 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4133 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4134 (cmpfunc)0, /*tp_compare*/
4135 (reprfunc)0, /*tp_repr*/
4136 0, /*tp_as_number*/
4137 0, /*tp_as_sequence*/
4138 0, /*tp_as_mapping*/
4139 (hashfunc)0, /*tp_hash*/
4140 (ternaryfunc)0, /*tp_call*/
4141 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004142
Guido van Rossum60456fd1997-04-09 17:36:32 +00004143 /* Space for future expansion */
4144 0L,0L,0L,0L,
4145 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004146};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004147
Guido van Rossum60456fd1997-04-09 17:36:32 +00004148static struct PyMethodDef cPickle_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004149 {"dump", (PyCFunction)cpm_dump, 1,
4150 "dump(object, file, [binary]) --"
4151 "Write an object in pickle format to the given file\n"
4152 "\n"
4153 "If the optional argument, binary, is provided and is true, then the\n"
4154 "pickle will be written in binary format, which is more space and\n"
4155 "computationally efficient. \n"
4156 },
4157 {"dumps", (PyCFunction)cpm_dumps, 1,
4158 "dumps(object, [binary]) --"
4159 "Return a string containing an object in pickle format\n"
4160 "\n"
4161 "If the optional argument, binary, is provided and is true, then the\n"
4162 "pickle will be written in binary format, which is more space and\n"
4163 "computationally efficient. \n"
4164 },
4165 {"load", (PyCFunction)cpm_load, 1,
4166 "load(file) -- Load a pickle from the given file"},
4167 {"loads", (PyCFunction)cpm_loads, 1,
4168 "loads(string) -- Load a pickle from the given string"},
4169 {"Pickler", (PyCFunction)get_Pickler, 1,
4170 "Pickler(file, [binary]) -- Create a pickler\n"
4171 "\n"
4172 "If the optional argument, binary, is provided and is true, then\n"
4173 "pickles will be written in binary format, which is more space and\n"
4174 "computationally efficient. \n"
4175 },
4176 {"Unpickler", (PyCFunction)get_Unpickler, 1,
4177 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004178 { NULL, NULL }
4179};
4180
4181
Guido van Rossum60456fd1997-04-09 17:36:32 +00004182#define CHECK_FOR_ERRORS(MESS) \
Guido van Rossum053b8df1998-11-25 16:18:00 +00004183if (PyErr_Occurred()) { \
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184 PyObject *__sys_exc_type, *__sys_exc_value, *__sys_exc_traceback; \
4185 PyErr_Fetch( &__sys_exc_type, &__sys_exc_value, &__sys_exc_traceback); \
4186 fprintf(stderr, # MESS ":\n\t"); \
4187 PyObject_Print(__sys_exc_type, stderr,0); \
4188 fprintf(stderr,", "); \
4189 PyObject_Print(__sys_exc_value, stderr,0); \
4190 fprintf(stderr,"\n"); \
4191 fflush(stderr); \
4192 Py_FatalError(# MESS); \
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004193}
4194
4195
Guido van Rossum60456fd1997-04-09 17:36:32 +00004196static int
4197init_stuff(PyObject *module, PyObject *module_dict) {
4198 PyObject *string, *copy_reg;
4199
4200#define INIT_STR(S) UNLESS(S ## _str=PyString_FromString(#S)) return -1;
4201
4202 INIT_STR(__class__);
4203 INIT_STR(__getinitargs__);
4204 INIT_STR(__dict__);
4205 INIT_STR(__getstate__);
4206 INIT_STR(__setstate__);
4207 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004208 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004209 INIT_STR(__reduce__);
4210 INIT_STR(write);
4211 INIT_STR(__safe_for_unpickling__);
4212 INIT_STR(append);
4213 INIT_STR(read);
4214 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004215 INIT_STR(copy_reg);
4216 INIT_STR(dispatch_table);
4217 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004218 INIT_STR(__basicnew__);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004219 UNLESS (empty_str=PyString_FromString("")) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220
Guido van Rossum053b8df1998-11-25 16:18:00 +00004221 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004222 return -1;
4223
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004224 /* These next few are special because we want to use different
4225 ones in restricted mode. */
4226
Guido van Rossum053b8df1998-11-25 16:18:00 +00004227 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004228 return -1;
4229
Guido van Rossum053b8df1998-11-25 16:18:00 +00004230 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
4231 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004232 return -1;
4233
4234 Py_DECREF(copy_reg);
4235
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236 /* Down to here ********************************** */
4237
Guido van Rossum053b8df1998-11-25 16:18:00 +00004238 UNLESS (string = PyImport_ImportModule("string"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239 return -1;
4240
Guido van Rossum053b8df1998-11-25 16:18:00 +00004241 UNLESS (atol_func = PyObject_GetAttrString(string, "atol"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004242 return -1;
4243
4244 Py_DECREF(string);
4245
Guido van Rossum053b8df1998-11-25 16:18:00 +00004246 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247 return -1;
4248
Guido van Rossum053b8df1998-11-25 16:18:00 +00004249 UNLESS (PicklingError = PyString_FromString("cPickle.PicklingError"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004250 return -1;
4251
4252 if (PyDict_SetItemString(module_dict, "PicklingError",
4253 PicklingError) < 0)
4254 return -1;
4255
Guido van Rossum053b8df1998-11-25 16:18:00 +00004256 UNLESS (UnpicklingError = PyString_FromString("cPickle.UnpicklingError"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004257 return -1;
4258
4259 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4260 UnpicklingError) < 0)
4261 return -1;
4262
Guido van Rossum053b8df1998-11-25 16:18:00 +00004263 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4264 return -1;
4265
4266 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4267 BadPickleGet) < 0)
4268 return -1;
4269
Guido van Rossum60456fd1997-04-09 17:36:32 +00004270 PycString_IMPORT;
4271
4272 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004273}
4274
Guido van Rossum50f385c1998-12-04 18:48:44 +00004275DL_EXPORT(void)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276initcPickle() {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004277 PyObject *m, *d, *v;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004278 char *rev="1.61";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279 PyObject *format_version;
4280 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004281
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004282 Picklertype.ob_type = &PyType_Type;
4283 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004284 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004285
Guido van Rossum60456fd1997-04-09 17:36:32 +00004286 /* Create the module and add the functions */
4287 m = Py_InitModule4("cPickle", cPickle_methods,
4288 cPickle_module_documentation,
4289 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004290
Guido van Rossum60456fd1997-04-09 17:36:32 +00004291 /* Add some symbolic constants to the module */
4292 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004293 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004294 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004295
Guido van Rossum60456fd1997-04-09 17:36:32 +00004296 format_version = PyString_FromString("1.3");
4297 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004298
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299 PyDict_SetItemString(d, "format_version", format_version);
4300 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004301 Py_XDECREF(format_version);
4302 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004303
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304 init_stuff(m, d);
4305 CHECK_FOR_ERRORS("can't initialize module cPickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004306}