blob: d259471bc84f2681ce49850ddfd11a1e5743d6a0 [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;
Guido van Rossumaa8d1671999-01-25 21:43:51 +00003278 if (self->marks)
3279 self->marks=(int *)malloc(s * sizeof(int));
3280 else
3281 self->marks=(int *)realloc(self->marks, s * sizeof(int));
Guido van Rossum053b8df1998-11-25 16:18:00 +00003282 if (! self->marks) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283 PyErr_NoMemory();
3284 return -1;
3285 }
Guido van Rossum053b8df1998-11-25 16:18:00 +00003286 self->marks_size = s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287 }
3288
Guido van Rossum053b8df1998-11-25 16:18:00 +00003289 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003290
3291 return 0;
3292}
3293
3294static int
3295load_reduce(Unpicklerobject *self) {
3296 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003297
Guido van Rossum053b8df1998-11-25 16:18:00 +00003298 PDATA_POP(self->stack, arg_tup);
3299 if (! arg_tup) return -1;
3300 PDATA_POP(self->stack, callable);
3301 if (callable) {
3302 ob = Instance_New(callable, arg_tup);
3303 Py_DECREF(callable);
3304 }
3305 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003306
Guido van Rossum053b8df1998-11-25 16:18:00 +00003307 if (! ob) return -1;
3308
3309 PDATA_PUSH(self->stack, ob, -1);
3310 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311}
3312
3313static PyObject *
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003314load(Unpicklerobject *self) {
Guido van Rossum142eeb81997-08-13 03:14:41 +00003315 PyObject *stack = 0, *err = 0, *val = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003316 char *s;
3317
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003319 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003320
3321 while (1) {
3322 if ((*self->read_func)(self, &s, 1) < 0)
3323 break;
3324
3325 switch (s[0]) {
3326 case NONE:
3327 if (load_none(self) < 0)
3328 break;
3329 continue;
3330
3331 case BININT:
3332 if (load_binint(self) < 0)
3333 break;
3334 continue;
3335
3336 case BININT1:
3337 if (load_binint1(self) < 0)
3338 break;
3339 continue;
3340
3341 case BININT2:
3342 if (load_binint2(self) < 0)
3343 break;
3344 continue;
3345
3346 case INT:
3347 if (load_int(self) < 0)
3348 break;
3349 continue;
3350
3351 case LONG:
3352 if (load_long(self) < 0)
3353 break;
3354 continue;
3355
3356 case FLOAT:
3357 if (load_float(self) < 0)
3358 break;
3359 continue;
3360
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361 case BINFLOAT:
3362 if (load_binfloat(self) < 0)
3363 break;
3364 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365
3366 case BINSTRING:
3367 if (load_binstring(self) < 0)
3368 break;
3369 continue;
3370
3371 case SHORT_BINSTRING:
3372 if (load_short_binstring(self) < 0)
3373 break;
3374 continue;
3375
3376 case STRING:
3377 if (load_string(self) < 0)
3378 break;
3379 continue;
3380
3381 case EMPTY_TUPLE:
3382 if (load_empty_tuple(self) < 0)
3383 break;
3384 continue;
3385
3386 case TUPLE:
3387 if (load_tuple(self) < 0)
3388 break;
3389 continue;
3390
3391 case EMPTY_LIST:
3392 if (load_empty_list(self) < 0)
3393 break;
3394 continue;
3395
3396 case LIST:
3397 if (load_list(self) < 0)
3398 break;
3399 continue;
3400
3401 case EMPTY_DICT:
3402 if (load_empty_dict(self) < 0)
3403 break;
3404 continue;
3405
3406 case DICT:
3407 if (load_dict(self) < 0)
3408 break;
3409 continue;
3410
3411 case OBJ:
3412 if (load_obj(self) < 0)
3413 break;
3414 continue;
3415
3416 case INST:
3417 if (load_inst(self) < 0)
3418 break;
3419 continue;
3420
3421 case GLOBAL:
3422 if (load_global(self) < 0)
3423 break;
3424 continue;
3425
3426 case APPEND:
3427 if (load_append(self) < 0)
3428 break;
3429 continue;
3430
3431 case APPENDS:
3432 if (load_appends(self) < 0)
3433 break;
3434 continue;
3435
3436 case BUILD:
3437 if (load_build(self) < 0)
3438 break;
3439 continue;
3440
3441 case DUP:
3442 if (load_dup(self) < 0)
3443 break;
3444 continue;
3445
3446 case BINGET:
3447 if (load_binget(self) < 0)
3448 break;
3449 continue;
3450
3451 case LONG_BINGET:
3452 if (load_long_binget(self) < 0)
3453 break;
3454 continue;
3455
3456 case GET:
3457 if (load_get(self) < 0)
3458 break;
3459 continue;
3460
3461 case MARK:
3462 if (load_mark(self) < 0)
3463 break;
3464 continue;
3465
3466 case BINPUT:
3467 if (load_binput(self) < 0)
3468 break;
3469 continue;
3470
3471 case LONG_BINPUT:
3472 if (load_long_binput(self) < 0)
3473 break;
3474 continue;
3475
3476 case PUT:
3477 if (load_put(self) < 0)
3478 break;
3479 continue;
3480
3481 case POP:
3482 if (load_pop(self) < 0)
3483 break;
3484 continue;
3485
3486 case POP_MARK:
3487 if (load_pop_mark(self) < 0)
3488 break;
3489 continue;
3490
3491 case SETITEM:
3492 if (load_setitem(self) < 0)
3493 break;
3494 continue;
3495
3496 case SETITEMS:
3497 if (load_setitems(self) < 0)
3498 break;
3499 continue;
3500
3501 case STOP:
3502 break;
3503
3504 case PERSID:
3505 if (load_persid(self) < 0)
3506 break;
3507 continue;
3508
3509 case BINPERSID:
3510 if (load_binpersid(self) < 0)
3511 break;
3512 continue;
3513
3514 case REDUCE:
3515 if (load_reduce(self) < 0)
3516 break;
3517 continue;
3518
3519 default:
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00003520 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossum60456fd1997-04-09 17:36:32 +00003521 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003522 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003523 }
3524
3525 break;
3526 }
3527
Guido van Rossum053b8df1998-11-25 16:18:00 +00003528 if ((err = PyErr_Occurred())) {
3529 if (err == PyExc_EOFError) {
3530 PyErr_SetNone(PyExc_EOFError);
3531 }
3532 return NULL;
3533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Guido van Rossum053b8df1998-11-25 16:18:00 +00003535 PDATA_POP(self->stack, val);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003536 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537}
3538
3539
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003540/* No-load functions to support noload, which is used to
3541 find persistent references. */
3542
3543static int
3544noload_obj(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003545 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003546
3547 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003548 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003549}
3550
3551
3552static int
3553noload_inst(Unpicklerobject *self) {
Guido van Rossume94e3fb1998-12-08 17:37:19 +00003554 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003555 char *s;
3556
3557 if ((i = marker(self)) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003558 Pdata_clear(self->stack, i);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003559 if ((*self->readline_func)(self, &s) < 0) return -1;
3560 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003561 PDATA_APPEND(self->stack, Py_None,-1);
3562 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003563}
3564
3565static int
3566noload_global(Unpicklerobject *self) {
3567 char *s;
3568
3569 if ((*self->readline_func)(self, &s) < 0) return -1;
3570 if ((*self->readline_func)(self, &s) < 0) return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003571 PDATA_APPEND(self->stack, Py_None,-1);
3572 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003573}
3574
3575static int
3576noload_reduce(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003577
Guido van Rossum053b8df1998-11-25 16:18:00 +00003578 if (self->stack->length < 2) return stackUnderflow();
3579 Pdata_clear(self->stack, self->stack->length-2);
3580 PDATA_APPEND(self->stack, Py_None,-1);
3581 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003582}
3583
3584static int
3585noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003586
Guido van Rossum053b8df1998-11-25 16:18:00 +00003587 if (self->stack->length < 1) return stackUnderflow();
3588 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00003589 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003590}
3591
3592
3593static PyObject *
3594noload(Unpicklerobject *self) {
3595 PyObject *stack = 0, *err = 0, *val = 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003596 char *s;
3597
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003598 self->num_marks = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003599 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003600
3601 while (1) {
3602 if ((*self->read_func)(self, &s, 1) < 0)
3603 break;
3604
3605 switch (s[0]) {
3606 case NONE:
3607 if (load_none(self) < 0)
3608 break;
3609 continue;
3610
3611 case BININT:
3612 if (load_binint(self) < 0)
3613 break;
3614 continue;
3615
3616 case BININT1:
3617 if (load_binint1(self) < 0)
3618 break;
3619 continue;
3620
3621 case BININT2:
3622 if (load_binint2(self) < 0)
3623 break;
3624 continue;
3625
3626 case INT:
3627 if (load_int(self) < 0)
3628 break;
3629 continue;
3630
3631 case LONG:
3632 if (load_long(self) < 0)
3633 break;
3634 continue;
3635
3636 case FLOAT:
3637 if (load_float(self) < 0)
3638 break;
3639 continue;
3640
3641 case BINFLOAT:
3642 if (load_binfloat(self) < 0)
3643 break;
3644 continue;
3645
3646 case BINSTRING:
3647 if (load_binstring(self) < 0)
3648 break;
3649 continue;
3650
3651 case SHORT_BINSTRING:
3652 if (load_short_binstring(self) < 0)
3653 break;
3654 continue;
3655
3656 case STRING:
3657 if (load_string(self) < 0)
3658 break;
3659 continue;
3660
3661 case EMPTY_TUPLE:
3662 if (load_empty_tuple(self) < 0)
3663 break;
3664 continue;
3665
3666 case TUPLE:
3667 if (load_tuple(self) < 0)
3668 break;
3669 continue;
3670
3671 case EMPTY_LIST:
3672 if (load_empty_list(self) < 0)
3673 break;
3674 continue;
3675
3676 case LIST:
3677 if (load_list(self) < 0)
3678 break;
3679 continue;
3680
3681 case EMPTY_DICT:
3682 if (load_empty_dict(self) < 0)
3683 break;
3684 continue;
3685
3686 case DICT:
3687 if (load_dict(self) < 0)
3688 break;
3689 continue;
3690
3691 case OBJ:
3692 if (noload_obj(self) < 0)
3693 break;
3694 continue;
3695
3696 case INST:
3697 if (noload_inst(self) < 0)
3698 break;
3699 continue;
3700
3701 case GLOBAL:
3702 if (noload_global(self) < 0)
3703 break;
3704 continue;
3705
3706 case APPEND:
3707 if (load_append(self) < 0)
3708 break;
3709 continue;
3710
3711 case APPENDS:
3712 if (load_appends(self) < 0)
3713 break;
3714 continue;
3715
3716 case BUILD:
3717 if (noload_build(self) < 0)
3718 break;
3719 continue;
3720
3721 case DUP:
3722 if (load_dup(self) < 0)
3723 break;
3724 continue;
3725
3726 case BINGET:
3727 if (load_binget(self) < 0)
3728 break;
3729 continue;
3730
3731 case LONG_BINGET:
3732 if (load_long_binget(self) < 0)
3733 break;
3734 continue;
3735
3736 case GET:
3737 if (load_get(self) < 0)
3738 break;
3739 continue;
3740
3741 case MARK:
3742 if (load_mark(self) < 0)
3743 break;
3744 continue;
3745
3746 case BINPUT:
3747 if (load_binput(self) < 0)
3748 break;
3749 continue;
3750
3751 case LONG_BINPUT:
3752 if (load_long_binput(self) < 0)
3753 break;
3754 continue;
3755
3756 case PUT:
3757 if (load_put(self) < 0)
3758 break;
3759 continue;
3760
3761 case POP:
3762 if (load_pop(self) < 0)
3763 break;
3764 continue;
3765
3766 case POP_MARK:
3767 if (load_pop_mark(self) < 0)
3768 break;
3769 continue;
3770
3771 case SETITEM:
3772 if (load_setitem(self) < 0)
3773 break;
3774 continue;
3775
3776 case SETITEMS:
3777 if (load_setitems(self) < 0)
3778 break;
3779 continue;
3780
3781 case STOP:
3782 break;
3783
3784 case PERSID:
3785 if (load_persid(self) < 0)
3786 break;
3787 continue;
3788
3789 case BINPERSID:
3790 if (load_binpersid(self) < 0)
3791 break;
3792 continue;
3793
3794 case REDUCE:
3795 if (noload_reduce(self) < 0)
3796 break;
3797 continue;
3798
3799 default:
Guido van Rossum57d9f2e1998-01-19 23:18:18 +00003800 cPickle_ErrFormat(UnpicklingError, "invalid load key, '%s'.",
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003801 "c", s[0]);
Guido van Rossum053b8df1998-11-25 16:18:00 +00003802 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003803 }
3804
3805 break;
3806 }
3807
Guido van Rossum053b8df1998-11-25 16:18:00 +00003808 if ((err = PyErr_Occurred())) {
3809 if (err == PyExc_EOFError) {
3810 PyErr_SetNone(PyExc_EOFError);
3811 }
3812 return NULL;
3813 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003814
Guido van Rossum053b8df1998-11-25 16:18:00 +00003815 PDATA_POP(self->stack, val);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003816 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003817}
3818
3819
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820static PyObject *
3821Unpickler_load(Unpicklerobject *self, PyObject *args) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003822 UNLESS (PyArg_ParseTuple(args, ""))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823 return NULL;
3824
3825 return load(self);
3826}
3827
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003828static PyObject *
3829Unpickler_noload(Unpicklerobject *self, PyObject *args) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003830 UNLESS (PyArg_ParseTuple(args, ""))
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003831 return NULL;
3832
3833 return noload(self);
3834}
3835
Guido van Rossum60456fd1997-04-09 17:36:32 +00003836
3837static struct PyMethodDef Unpickler_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003838 {"load", (PyCFunction)Unpickler_load, 1,
3839 "load() -- Load a pickle"
3840 },
3841 {"noload", (PyCFunction)Unpickler_noload, 1,
3842 "noload() -- not load a pickle, but go through most of the motions\n"
3843 "\n"
3844 "This function can be used to read past a pickle without instantiating\n"
3845 "any objects or importing any modules. It can also be used to find all\n"
3846 "persistent references without instantiating any objects or importing\n"
3847 "any modules.\n"
3848 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00003849 {NULL, NULL} /* sentinel */
3850};
3851
3852
3853static Unpicklerobject *
3854newUnpicklerobject(PyObject *f) {
3855 Unpicklerobject *self;
3856
Guido van Rossum053b8df1998-11-25 16:18:00 +00003857 UNLESS (self = PyObject_NEW(Unpicklerobject, &Unpicklertype))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858 return NULL;
3859
3860 self->file = NULL;
3861 self->arg = NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003862 self->stack = (Pdata*)Pdata_New();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863 self->pers_func = NULL;
3864 self->last_string = NULL;
3865 self->marks = NULL;
3866 self->num_marks = 0;
3867 self->marks_size = 0;
3868 self->buf_size = 0;
3869 self->read = NULL;
Guido van Rossum8a6dba31998-03-06 01:39:39 +00003870 self->readline = NULL;
Guido van Rossum21ef0881998-12-11 03:20:00 +00003871 self->safe_constructors = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003872
Guido van Rossum053b8df1998-11-25 16:18:00 +00003873 UNLESS (self->memo = PyDict_New()) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874 Py_XDECREF((PyObject *)self);
3875 return NULL;
3876 }
3877
3878 Py_INCREF(f);
3879 self->file = f;
3880
3881 /* Set read, readline based on type of f */
3882 if (PyFile_Check(f)) {
3883 self->fp = PyFile_AsFile(f);
3884 self->read_func = read_file;
3885 self->readline_func = readline_file;
3886 }
3887 else if (PycStringIO_InputCheck(f)) {
3888 self->fp = NULL;
3889 self->read_func = read_cStringIO;
3890 self->readline_func = readline_cStringIO;
3891 }
3892 else {
3893
3894 self->fp = NULL;
3895 self->read_func = read_other;
3896 self->readline_func = readline_other;
3897
Guido van Rossum053b8df1998-11-25 16:18:00 +00003898 UNLESS ((self->readline = PyObject_GetAttr(f, readline_str)) &&
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003899 (self->read = PyObject_GetAttr(f, read_str))) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900 PyErr_Clear();
3901 PyErr_SetString( PyExc_TypeError, "argument must have 'read' and "
3902 "'readline' attributes" );
Guido van Rossum053b8df1998-11-25 16:18:00 +00003903 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003904 }
3905 }
3906
Guido van Rossum053b8df1998-11-25 16:18:00 +00003907 if (PyEval_GetRestricted()) {
3908 /* Restricted execution, get private tables */
3909 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003910
Guido van Rossum053b8df1998-11-25 16:18:00 +00003911 UNLESS (m=PyImport_Import(copy_reg_str)) goto err;
3912 self->safe_constructors=PyObject_GetAttr(m, safe_constructors_str);
3913 Py_DECREF(m);
3914 UNLESS (self->safe_constructors) goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003915 }
3916 else {
Guido van Rossum053b8df1998-11-25 16:18:00 +00003917 self->safe_constructors=safe_constructors;
3918 Py_INCREF(safe_constructors);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003919 }
3920
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003922
3923err:
3924 Py_DECREF((PyObject *)self);
3925 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003926}
3927
3928
3929static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930get_Unpickler(PyObject *self, PyObject *args) {
3931 PyObject *file;
3932
Guido van Rossum053b8df1998-11-25 16:18:00 +00003933 UNLESS (PyArg_ParseTuple(args, "O", &file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934 return NULL;
3935 return (PyObject *)newUnpicklerobject(file);
3936}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003937
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003938
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939static void
3940Unpickler_dealloc(Unpicklerobject *self) {
3941 Py_XDECREF(self->readline);
3942 Py_XDECREF(self->read);
3943 Py_XDECREF(self->file);
3944 Py_XDECREF(self->memo);
3945 Py_XDECREF(self->stack);
3946 Py_XDECREF(self->pers_func);
3947 Py_XDECREF(self->arg);
3948 Py_XDECREF(self->last_string);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003949 Py_XDECREF(self->safe_constructors);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003950
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951 if (self->marks) {
3952 free(self->marks);
3953 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003954
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955 if (self->buf_size) {
3956 free(self->buf);
3957 }
3958
3959 PyMem_DEL(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003960}
3961
3962
3963static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00003964Unpickler_getattr(Unpicklerobject *self, char *name) {
3965 if (!strcmp(name, "persistent_load")) {
3966 if (!self->pers_func) {
3967 PyErr_SetString(PyExc_AttributeError, name);
3968 return NULL;
3969 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003970
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971 Py_INCREF(self->pers_func);
3972 return self->pers_func;
3973 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003974
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975 if (!strcmp(name, "memo")) {
3976 if (!self->memo) {
3977 PyErr_SetString(PyExc_AttributeError, name);
3978 return NULL;
3979 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003980
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981 Py_INCREF(self->memo);
3982 return self->memo;
3983 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003984
Guido van Rossum60456fd1997-04-09 17:36:32 +00003985 if (!strcmp(name, "UnpicklingError")) {
3986 Py_INCREF(UnpicklingError);
3987 return UnpicklingError;
3988 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003989
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
3991}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003992
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
3994static int
3995Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00003996
Guido van Rossum053b8df1998-11-25 16:18:00 +00003997 if (! value) {
Jeremy Hyltonce616e41998-08-13 23:13:52 +00003998 PyErr_SetString(PyExc_TypeError,
Guido van Rossum053b8df1998-11-25 16:18:00 +00003999 "attribute deletion is not supported");
4000 return -1;
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004001 }
4002
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003 if (!strcmp(name, "persistent_load")) {
4004 Py_XDECREF(self->pers_func);
4005 self->pers_func = value;
4006 Py_INCREF(value);
4007 return 0;
4008 }
4009
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004010 if (strcmp(name, "memo") == 0) {
Guido van Rossum053b8df1998-11-25 16:18:00 +00004011 if (! PyDict_Check(value)) {
4012 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
4013 return -1;
4014 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004015 Py_XDECREF(self->memo);
4016 self->memo = value;
4017 Py_INCREF(value);
4018 return 0;
4019 }
4020
Guido van Rossum60456fd1997-04-09 17:36:32 +00004021 PyErr_SetString(PyExc_AttributeError, name);
4022 return -1;
4023}
4024
4025
4026static PyObject *
4027cpm_dump(PyObject *self, PyObject *args) {
4028 PyObject *ob, *file, *res = NULL;
4029 Picklerobject *pickler = 0;
4030 int bin = 0;
4031
Guido van Rossum053b8df1998-11-25 16:18:00 +00004032 UNLESS (PyArg_ParseTuple(args, "OO|i", &ob, &file, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033 goto finally;
4034
Guido van Rossum053b8df1998-11-25 16:18:00 +00004035 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004036 goto finally;
4037
4038 if (dump(pickler, ob) < 0)
4039 goto finally;
4040
4041 Py_INCREF(Py_None);
4042 res = Py_None;
4043
4044finally:
4045 Py_XDECREF(pickler);
4046
4047 return res;
4048}
4049
4050
4051static PyObject *
4052cpm_dumps(PyObject *self, PyObject *args) {
4053 PyObject *ob, *file = 0, *res = NULL;
4054 Picklerobject *pickler = 0;
4055 int bin = 0;
4056
Guido van Rossum053b8df1998-11-25 16:18:00 +00004057 UNLESS (PyArg_ParseTuple(args, "O|i", &ob, &bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058 goto finally;
4059
Guido van Rossum053b8df1998-11-25 16:18:00 +00004060 UNLESS (file = PycStringIO->NewOutput(128))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004061 goto finally;
4062
Guido van Rossum053b8df1998-11-25 16:18:00 +00004063 UNLESS (pickler = newPicklerobject(file, bin))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004064 goto finally;
4065
4066 if (dump(pickler, ob) < 0)
4067 goto finally;
4068
4069 res = PycStringIO->cgetvalue(file);
4070
4071finally:
4072 Py_XDECREF(pickler);
4073 Py_XDECREF(file);
4074
4075 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004076}
4077
4078
4079static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004080cpm_load(PyObject *self, PyObject *args) {
4081 Unpicklerobject *unpickler = 0;
4082 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004083
Guido van Rossum053b8df1998-11-25 16:18:00 +00004084 UNLESS (PyArg_ParseTuple(args, "O", &ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004085 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004086
Guido van Rossum053b8df1998-11-25 16:18:00 +00004087 UNLESS (unpickler = newUnpicklerobject(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004088 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004089
Guido van Rossum60456fd1997-04-09 17:36:32 +00004090 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004091
Guido van Rossum60456fd1997-04-09 17:36:32 +00004092finally:
4093 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004094
Guido van Rossum60456fd1997-04-09 17:36:32 +00004095 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004096}
4097
4098
4099static PyObject *
Guido van Rossum60456fd1997-04-09 17:36:32 +00004100cpm_loads(PyObject *self, PyObject *args) {
4101 PyObject *ob, *file = 0, *res = NULL;
4102 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004103
Guido van Rossum053b8df1998-11-25 16:18:00 +00004104 UNLESS (PyArg_ParseTuple(args, "S", &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 (file = PycStringIO->NewInput(ob))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004108 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004109
Guido van Rossum053b8df1998-11-25 16:18:00 +00004110 UNLESS (unpickler = newUnpicklerobject(file))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004111 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004112
Guido van Rossum60456fd1997-04-09 17:36:32 +00004113 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004114
Guido van Rossum60456fd1997-04-09 17:36:32 +00004115finally:
4116 Py_XDECREF(file);
4117 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004118
Guido van Rossum60456fd1997-04-09 17:36:32 +00004119 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004120}
4121
4122
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004123static char Unpicklertype__doc__[] =
4124"Objects that know how to unpickle";
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004125
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004126static PyTypeObject Unpicklertype = {
4127 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004128 0, /*ob_size*/
4129 "Unpickler", /*tp_name*/
4130 sizeof(Unpicklerobject), /*tp_basicsize*/
4131 0, /*tp_itemsize*/
4132 /* methods */
4133 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4134 (printfunc)0, /*tp_print*/
4135 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4136 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4137 (cmpfunc)0, /*tp_compare*/
4138 (reprfunc)0, /*tp_repr*/
4139 0, /*tp_as_number*/
4140 0, /*tp_as_sequence*/
4141 0, /*tp_as_mapping*/
4142 (hashfunc)0, /*tp_hash*/
4143 (ternaryfunc)0, /*tp_call*/
4144 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004145
Guido van Rossum60456fd1997-04-09 17:36:32 +00004146 /* Space for future expansion */
4147 0L,0L,0L,0L,
4148 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004149};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004150
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151static struct PyMethodDef cPickle_methods[] = {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004152 {"dump", (PyCFunction)cpm_dump, 1,
4153 "dump(object, file, [binary]) --"
4154 "Write an object in pickle format to the given file\n"
4155 "\n"
4156 "If the optional argument, binary, is provided and is true, then the\n"
4157 "pickle will be written in binary format, which is more space and\n"
4158 "computationally efficient. \n"
4159 },
4160 {"dumps", (PyCFunction)cpm_dumps, 1,
4161 "dumps(object, [binary]) --"
4162 "Return a string containing an object in pickle format\n"
4163 "\n"
4164 "If the optional argument, binary, is provided and is true, then the\n"
4165 "pickle will be written in binary format, which is more space and\n"
4166 "computationally efficient. \n"
4167 },
4168 {"load", (PyCFunction)cpm_load, 1,
4169 "load(file) -- Load a pickle from the given file"},
4170 {"loads", (PyCFunction)cpm_loads, 1,
4171 "loads(string) -- Load a pickle from the given string"},
4172 {"Pickler", (PyCFunction)get_Pickler, 1,
4173 "Pickler(file, [binary]) -- Create a pickler\n"
4174 "\n"
4175 "If the optional argument, binary, is provided and is true, then\n"
4176 "pickles will be written in binary format, which is more space and\n"
4177 "computationally efficient. \n"
4178 },
4179 {"Unpickler", (PyCFunction)get_Unpickler, 1,
4180 "Unpickler(file) -- Create an unpickler"},
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004181 { NULL, NULL }
4182};
4183
4184
Guido van Rossum60456fd1997-04-09 17:36:32 +00004185#define CHECK_FOR_ERRORS(MESS) \
Guido van Rossum053b8df1998-11-25 16:18:00 +00004186if (PyErr_Occurred()) { \
Guido van Rossum60456fd1997-04-09 17:36:32 +00004187 PyObject *__sys_exc_type, *__sys_exc_value, *__sys_exc_traceback; \
4188 PyErr_Fetch( &__sys_exc_type, &__sys_exc_value, &__sys_exc_traceback); \
4189 fprintf(stderr, # MESS ":\n\t"); \
4190 PyObject_Print(__sys_exc_type, stderr,0); \
4191 fprintf(stderr,", "); \
4192 PyObject_Print(__sys_exc_value, stderr,0); \
4193 fprintf(stderr,"\n"); \
4194 fflush(stderr); \
4195 Py_FatalError(# MESS); \
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004196}
4197
4198
Guido van Rossum60456fd1997-04-09 17:36:32 +00004199static int
4200init_stuff(PyObject *module, PyObject *module_dict) {
4201 PyObject *string, *copy_reg;
4202
4203#define INIT_STR(S) UNLESS(S ## _str=PyString_FromString(#S)) return -1;
4204
4205 INIT_STR(__class__);
4206 INIT_STR(__getinitargs__);
4207 INIT_STR(__dict__);
4208 INIT_STR(__getstate__);
4209 INIT_STR(__setstate__);
4210 INIT_STR(__name__);
Guido van Rossum142eeb81997-08-13 03:14:41 +00004211 INIT_STR(__main__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004212 INIT_STR(__reduce__);
4213 INIT_STR(write);
4214 INIT_STR(__safe_for_unpickling__);
4215 INIT_STR(append);
4216 INIT_STR(read);
4217 INIT_STR(readline);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218 INIT_STR(copy_reg);
4219 INIT_STR(dispatch_table);
4220 INIT_STR(safe_constructors);
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004221 INIT_STR(__basicnew__);
Guido van Rossum053b8df1998-11-25 16:18:00 +00004222 UNLESS (empty_str=PyString_FromString("")) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004223
Guido van Rossum053b8df1998-11-25 16:18:00 +00004224 UNLESS (copy_reg = PyImport_ImportModule("copy_reg"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225 return -1;
4226
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004227 /* These next few are special because we want to use different
4228 ones in restricted mode. */
4229
Guido van Rossum053b8df1998-11-25 16:18:00 +00004230 UNLESS (dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004231 return -1;
4232
Guido van Rossum053b8df1998-11-25 16:18:00 +00004233 UNLESS (safe_constructors = PyObject_GetAttr(copy_reg,
4234 safe_constructors_str))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235 return -1;
4236
4237 Py_DECREF(copy_reg);
4238
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004239 /* Down to here ********************************** */
4240
Guido van Rossum053b8df1998-11-25 16:18:00 +00004241 UNLESS (string = PyImport_ImportModule("string"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004242 return -1;
4243
Guido van Rossum053b8df1998-11-25 16:18:00 +00004244 UNLESS (atol_func = PyObject_GetAttrString(string, "atol"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004245 return -1;
4246
4247 Py_DECREF(string);
4248
Guido van Rossum053b8df1998-11-25 16:18:00 +00004249 UNLESS (empty_tuple = PyTuple_New(0))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004250 return -1;
4251
Guido van Rossum053b8df1998-11-25 16:18:00 +00004252 UNLESS (PicklingError = PyString_FromString("cPickle.PicklingError"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004253 return -1;
4254
4255 if (PyDict_SetItemString(module_dict, "PicklingError",
4256 PicklingError) < 0)
4257 return -1;
4258
Guido van Rossum053b8df1998-11-25 16:18:00 +00004259 UNLESS (UnpicklingError = PyString_FromString("cPickle.UnpicklingError"))
Guido van Rossum60456fd1997-04-09 17:36:32 +00004260 return -1;
4261
4262 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4263 UnpicklingError) < 0)
4264 return -1;
4265
Guido van Rossum053b8df1998-11-25 16:18:00 +00004266 UNLESS (BadPickleGet = PyString_FromString("cPickle.BadPickleGet"))
4267 return -1;
4268
4269 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4270 BadPickleGet) < 0)
4271 return -1;
4272
Guido van Rossum60456fd1997-04-09 17:36:32 +00004273 PycString_IMPORT;
4274
4275 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004276}
4277
Guido van Rossum50f385c1998-12-04 18:48:44 +00004278DL_EXPORT(void)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279initcPickle() {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004280 PyObject *m, *d, *v;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004281 char *rev="1.61";
Guido van Rossum60456fd1997-04-09 17:36:32 +00004282 PyObject *format_version;
4283 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004284
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004285 Picklertype.ob_type = &PyType_Type;
4286 Unpicklertype.ob_type = &PyType_Type;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004287 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004288
Guido van Rossum60456fd1997-04-09 17:36:32 +00004289 /* Create the module and add the functions */
4290 m = Py_InitModule4("cPickle", cPickle_methods,
4291 cPickle_module_documentation,
4292 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004293
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294 /* Add some symbolic constants to the module */
4295 d = PyModule_GetDict(m);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004296 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004297 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00004298
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299 format_version = PyString_FromString("1.3");
4300 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004301
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302 PyDict_SetItemString(d, "format_version", format_version);
4303 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +00004304 Py_XDECREF(format_version);
4305 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004306
Guido van Rossum60456fd1997-04-09 17:36:32 +00004307 init_stuff(m, d);
4308 CHECK_FOR_ERRORS("can't initialize module cPickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004309}