blob: 5452713c933d4431f5b41df37855238eafe3557f [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18#define CURRENT_PROTOCOL_NUMBER 2
19
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Guido van Rossum60456fd1997-04-09 17:36:32 +000090static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossumc03158b1999-06-09 15:23:31 +000092static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000094static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000096static PyObject *BadPickleGet;
97
Tim Peters5b7da392003-02-04 00:21:07 +000098/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100
Tim Peters5b7da392003-02-04 00:21:07 +0000101/* copy_reg.dispatch_table, {type_object: pickling_function} */
102static PyObject *dispatch_table;
103
104/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000105/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000106static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000107/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000108static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000109/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000110static PyObject *extension_cache;
111
Tim Peters731098b2003-02-04 20:56:09 +0000112/* For looking up name pairs in copy_reg._extension_registry. */
113static PyObject *two_tuple;
114
Guido van Rossum60456fd1997-04-09 17:36:32 +0000115static PyObject *__class___str, *__getinitargs___str, *__dict___str,
116 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000117 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000118 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000119 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000120
Guido van Rossum053b8df1998-11-25 16:18:00 +0000121/*************************************************************************
122 Internal Data type for pickle data. */
123
124typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000125 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000126 int length; /* number of initial slots in data currently used */
127 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000128 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129} Pdata;
130
Tim Peters84e87f32001-03-17 04:50:51 +0000131static void
Tim Peterscba30e22003-02-01 06:24:36 +0000132Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133{
134 int i;
135 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000136
Tim Peters1d63c9f2003-02-02 20:29:39 +0000137 for (i = self->length, p = self->data; --i >= 0; p++) {
138 Py_DECREF(*p);
139 }
140 if (self->data)
141 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000142 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000143}
144
145static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000146 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
147 (destructor)Pdata_dealloc,
148 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000149};
150
151#define Pdata_Check(O) ((O)->ob_type == &PdataType)
152
153static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000154Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155{
156 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157
Tim Peters1d63c9f2003-02-02 20:29:39 +0000158 if (!(self = PyObject_New(Pdata, &PdataType)))
159 return NULL;
160 self->size = 8;
161 self->length = 0;
162 self->data = malloc(self->size * sizeof(PyObject*));
163 if (self->data)
164 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000165 Py_DECREF(self);
166 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167}
168
Tim Peters84e87f32001-03-17 04:50:51 +0000169static int
Tim Peterscba30e22003-02-01 06:24:36 +0000170stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000171{
172 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
173 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174}
175
Tim Peters1d63c9f2003-02-02 20:29:39 +0000176/* Retain only the initial clearto items. If clearto >= the current
177 * number of items, this is a (non-erroneous) NOP.
178 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000179static int
Tim Peterscba30e22003-02-01 06:24:36 +0000180Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000181{
182 int i;
183 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000185 if (clearto < 0) return stackUnderflow();
186 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187
Tim Peters1d63c9f2003-02-02 20:29:39 +0000188 for (i = self->length, p = self->data + clearto;
189 --i >= clearto;
190 p++) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000191 Py_DECREF(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000192 }
193 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000195 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000196}
197
Tim Peters84e87f32001-03-17 04:50:51 +0000198static int
Tim Peterscba30e22003-02-01 06:24:36 +0000199Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000200{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000201 int bigger;
202 size_t nbytes;
203
Tim Peters1d63c9f2003-02-02 20:29:39 +0000204 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000205 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000206 goto nomemory;
207 if ((int)(size_t)bigger != bigger)
208 goto nomemory;
209 nbytes = (size_t)bigger * sizeof(PyObject *);
210 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
211 goto nomemory;
212 self->data = realloc(self->data, nbytes);
213 if (self->data == NULL)
214 goto nomemory;
215 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000216 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000217
218 nomemory:
219 self->size = 0;
220 PyErr_NoMemory();
221 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000222}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000223
Tim Peterse0a39072003-02-03 15:45:56 +0000224/* D is a Pdata*. Pop the topmost element and store it into V, which
225 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000226 * is raised and V is set to NULL. D and V may be evaluated several times.
227 */
228#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000229 if ((D)->length) \
230 (V) = (D)->data[--((D)->length)]; \
231 else { \
232 PyErr_SetString(UnpicklingError, "bad pickle data"); \
233 (V) = NULL; \
234 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000235}
236
Tim Peterse0a39072003-02-03 15:45:56 +0000237/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
238 * D. If the Pdata stack can't be grown to hold the new value, both
239 * raise MemoryError and execute "return ER". The difference is in ownership
240 * of O after: _PUSH transfers ownership of O from the caller to the stack
241 * (no incref of O is done, and in case of error O is decrefed), while
242 * _APPEND pushes a new reference.
243 */
244
245/* Push O on stack D, giving ownership of O to the stack. */
246#define PDATA_PUSH(D, O, ER) { \
247 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
248 Pdata_grow((Pdata*)(D)) < 0) { \
249 Py_DECREF(O); \
250 return ER; \
251 } \
252 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
253}
254
255/* Push O on stack D, pushing a new reference. */
256#define PDATA_APPEND(D, O, ER) { \
257 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
258 Pdata_grow((Pdata*)(D)) < 0) \
259 return ER; \
260 Py_INCREF(O); \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264
Guido van Rossum053b8df1998-11-25 16:18:00 +0000265static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000266Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000267{
268 PyObject *r;
269 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000270
Tim Peters1d63c9f2003-02-02 20:29:39 +0000271 l = self->length-start;
272 r = PyTuple_New(l);
273 if (r == NULL)
274 return NULL;
275 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000277
Tim Peters1d63c9f2003-02-02 20:29:39 +0000278 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000279 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000280}
281
282static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000283Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284{
285 PyObject *r;
286 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 l=self->length-start;
289 if (!( r=PyList_New(l))) return NULL;
290 for (i=start, j=0 ; j < l; i++, j++)
291 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293 self->length=start;
294 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000295}
296
Guido van Rossum053b8df1998-11-25 16:18:00 +0000297/*************************************************************************/
298
299#define ARG_TUP(self, o) { \
300 if (self->arg || (self->arg=PyTuple_New(1))) { \
301 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
302 PyTuple_SET_ITEM(self->arg,0,o); \
303 } \
304 else { \
305 Py_DECREF(o); \
306 } \
307}
308
309#define FREE_ARG_TUP(self) { \
310 if (self->arg->ob_refcnt > 1) { \
311 Py_DECREF(self->arg); \
312 self->arg=NULL; \
313 } \
314 }
315
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000316typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000317 PyObject_HEAD
318 FILE *fp;
319 PyObject *write;
320 PyObject *file;
321 PyObject *memo;
322 PyObject *arg;
323 PyObject *pers_func;
324 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000325
326 /* pickle protocol number, >= 0 */
327 int proto;
328
329 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000330 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000332 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000333 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000334 int (*write_func)(struct Picklerobject *, char *, int);
335 char *write_buf;
336 int buf_size;
337 PyObject *dispatch_table;
338 int fast_container; /* count nested container dumps */
339 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000340} Picklerobject;
341
Barry Warsaw52acb492001-12-21 20:04:22 +0000342#ifndef PY_CPICKLE_FAST_LIMIT
343#define PY_CPICKLE_FAST_LIMIT 50
344#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000345
Jeremy Hylton938ace62002-07-17 16:30:39 +0000346static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000347
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000348typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000349 PyObject_HEAD
350 FILE *fp;
351 PyObject *file;
352 PyObject *readline;
353 PyObject *read;
354 PyObject *memo;
355 PyObject *arg;
356 Pdata *stack;
357 PyObject *mark;
358 PyObject *pers_func;
359 PyObject *last_string;
360 int *marks;
361 int num_marks;
362 int marks_size;
363 int (*read_func)(struct Unpicklerobject *, char **, int);
364 int (*readline_func)(struct Unpicklerobject *, char **);
365 int buf_size;
366 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000367 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000368} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000369
Jeremy Hylton938ace62002-07-17 16:30:39 +0000370static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000371
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000372/* Forward decls that need the above structs */
373static int save(Picklerobject *, PyObject *, int);
374static int put2(Picklerobject *, PyObject *);
375
Guido van Rossumd385d591997-04-09 17:47:47 +0000376static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000377PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000378cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
379{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000380 va_list va;
381 PyObject *args=0, *retval=0;
382 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000384 if (format) args = Py_VaBuildValue(format, va);
385 va_end(va);
386 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000387 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000390 if (retval) {
391 if (args) {
392 PyObject *v;
393 v=PyString_Format(retval, args);
394 Py_DECREF(retval);
395 Py_DECREF(args);
396 if (! v) return NULL;
397 retval=v;
398 }
399 }
400 else
401 if (args) retval=args;
402 else {
403 PyErr_SetObject(ErrType,Py_None);
404 return NULL;
405 }
406 PyErr_SetObject(ErrType,retval);
407 Py_DECREF(retval);
408 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000409}
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411static int
Tim Peterscba30e22003-02-01 06:24:36 +0000412write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000413{
414 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000416 if (s == NULL) {
417 return 0;
418 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000421 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000423 if (nbyteswritten != (size_t)n) {
424 PyErr_SetFromErrno(PyExc_IOError);
425 return -1;
426 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000428 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000429}
430
Tim Peters84e87f32001-03-17 04:50:51 +0000431static int
Tim Peterscba30e22003-02-01 06:24:36 +0000432write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000433{
434 if (s == NULL) {
435 return 0;
436 }
Tim Peterscba30e22003-02-01 06:24:36 +0000437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000438 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
439 return -1;
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000442 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443}
444
Tim Peters84e87f32001-03-17 04:50:51 +0000445static int
Tim Peterscba30e22003-02-01 06:24:36 +0000446write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447{
448 if (s == NULL) return 0;
449 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000450}
451
Tim Peters84e87f32001-03-17 04:50:51 +0000452static int
Tim Peterscba30e22003-02-01 06:24:36 +0000453write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454{
455 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000457 if (s == NULL) {
458 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000459 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000460 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000461 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462 return -1;
463 }
464 else {
465 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
466 if (write_other(self, NULL, 0) < 0)
467 return -1;
468 }
Tim Peterscba30e22003-02-01 06:24:36 +0000469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000470 if (n > WRITE_BUF_SIZE) {
471 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000472 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000473 return -1;
474 }
475 else {
476 memcpy(self->write_buf + self->buf_size, s, n);
477 self->buf_size += n;
478 return n;
479 }
480 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000482 if (self->write) {
483 /* object with write method */
484 ARG_TUP(self, py_str);
485 if (self->arg) {
486 junk = PyObject_Call(self->write, self->arg, NULL);
487 FREE_ARG_TUP(self);
488 }
489 if (junk) Py_DECREF(junk);
490 else return -1;
491 }
492 else
493 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000495 self->buf_size = 0;
496 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000497}
498
499
Tim Peters84e87f32001-03-17 04:50:51 +0000500static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000501read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502{
503 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000505 if (self->buf_size == 0) {
506 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000508 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000509 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510 PyErr_NoMemory();
511 return -1;
512 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = size;
515 }
516 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000517 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000518 if (!self->buf) {
519 PyErr_NoMemory();
520 return -1;
521 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 self->buf_size = n;
523 }
Tim Peters84e87f32001-03-17 04:50:51 +0000524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 Py_BEGIN_ALLOW_THREADS
526 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
527 Py_END_ALLOW_THREADS
528 if (nbytesread != (size_t)n) {
529 if (feof(self->fp)) {
530 PyErr_SetNone(PyExc_EOFError);
531 return -1;
532 }
Tim Peterscba30e22003-02-01 06:24:36 +0000533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000534 PyErr_SetFromErrno(PyExc_IOError);
535 return -1;
536 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000541}
542
543
Tim Peters84e87f32001-03-17 04:50:51 +0000544static int
Tim Peterscba30e22003-02-01 06:24:36 +0000545readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000546{
547 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000549 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000550 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551 PyErr_NoMemory();
552 return -1;
553 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 self->buf_size = 40;
555 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 i = 0;
558 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000559 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000561 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000562 (self->buf[i] = getc(self->fp)) == '\n') {
563 self->buf[i + 1] = '\0';
564 *s = self->buf;
565 return i + 1;
566 }
567 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000568 bigger = self->buf_size << 1;
569 if (bigger <= 0) { /* overflow */
570 PyErr_NoMemory();
571 return -1;
572 }
573 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 if (!self->buf) {
575 PyErr_NoMemory();
576 return -1;
577 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000578 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 }
Tim Peters84e87f32001-03-17 04:50:51 +0000580}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000581
582
Tim Peters84e87f32001-03-17 04:50:51 +0000583static int
Tim Peterscba30e22003-02-01 06:24:36 +0000584read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585{
586 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
589 PyErr_SetNone(PyExc_EOFError);
590 return -1;
591 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000596}
597
598
Tim Peters84e87f32001-03-17 04:50:51 +0000599static int
Tim Peterscba30e22003-02-01 06:24:36 +0000600readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601{
602 int n;
603 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
606 return -1;
607 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000611 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612}
613
614
Tim Peters84e87f32001-03-17 04:50:51 +0000615static int
Tim Peterscba30e22003-02-01 06:24:36 +0000616read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617{
618 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 ARG_TUP(self, bytes);
623 if (self->arg) {
624 str = PyObject_Call(self->read, self->arg, NULL);
625 FREE_ARG_TUP(self);
626 }
627 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629 Py_XDECREF(self->last_string);
630 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000632 if (! (*s = PyString_AsString(str))) return -1;
633 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634}
635
636
Tim Peters84e87f32001-03-17 04:50:51 +0000637static int
Tim Peterscba30e22003-02-01 06:24:36 +0000638readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639{
640 PyObject *str;
641 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
644 return -1;
645 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 if ((str_size = PyString_Size(str)) < 0)
648 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 Py_XDECREF(self->last_string);
651 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000653 if (! (*s = PyString_AsString(str)))
654 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000656 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000657}
658
Tim Petersee1a53c2003-02-02 02:57:53 +0000659/* Copy the first n bytes from s into newly malloc'ed memory, plus a
660 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
661 * The caller is responsible for free()'ing the return value.
662 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000663static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000664pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665{
Tim Petersee1a53c2003-02-02 02:57:53 +0000666 char *r = (char *)malloc(n+1);
667 if (r == NULL)
668 return (char*)PyErr_NoMemory();
669 memcpy(r, s, n);
670 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000671 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000672}
673
674
675static int
Tim Peterscba30e22003-02-01 06:24:36 +0000676get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677{
678 PyObject *value, *mv;
679 long c_value;
680 char s[30];
681 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 if (!( mv = PyDict_GetItem(self->memo, id))) {
684 PyErr_SetObject(PyExc_KeyError, id);
685 return -1;
686 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000687
Tim Peterscba30e22003-02-01 06:24:36 +0000688 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000691 if (!( PyInt_Check(value))) {
692 PyErr_SetString(PicklingError, "no int where int expected in memo");
693 return -1;
694 }
695 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000697 if (!self->bin) {
698 s[0] = GET;
699 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
700 len = strlen(s);
701 }
702 else if (Pdata_Check(self->file)) {
703 if (write_other(self, NULL, 0) < 0) return -1;
704 PDATA_APPEND(self->file, mv, -1);
705 return 0;
706 }
707 else {
708 if (c_value < 256) {
709 s[0] = BINGET;
710 s[1] = (int)(c_value & 0xff);
711 len = 2;
712 }
713 else {
714 s[0] = LONG_BINGET;
715 s[1] = (int)(c_value & 0xff);
716 s[2] = (int)((c_value >> 8) & 0xff);
717 s[3] = (int)((c_value >> 16) & 0xff);
718 s[4] = (int)((c_value >> 24) & 0xff);
719 len = 5;
720 }
721 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000722
Tim Peters0bc93f52003-02-02 18:29:33 +0000723 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000725
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000726 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000727}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000728
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730static int
Tim Peterscba30e22003-02-01 06:24:36 +0000731put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000732{
Tim Peterscba30e22003-02-01 06:24:36 +0000733 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000734 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 return put2(self, ob);
737}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000738
Guido van Rossum053b8df1998-11-25 16:18:00 +0000739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000740static int
Tim Peterscba30e22003-02-01 06:24:36 +0000741put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000742{
743 char c_str[30];
744 int p;
745 size_t len;
746 int res = -1;
747 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 if (self->fast)
750 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000752 if ((p = PyDict_Size(self->memo)) < 0)
753 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000755 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000756 /* XXX Why?
757 * XXX And does "positive" really mean non-negative?
758 * XXX pickle.py starts with PUT index 0, not 1. This makes for
759 * XXX gratuitous differences between the pickling modules.
760 */
Tim Peterscba30e22003-02-01 06:24:36 +0000761 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000762
Tim Peterscba30e22003-02-01 06:24:36 +0000763 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000765
Tim Peterscba30e22003-02-01 06:24:36 +0000766 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000767 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000768
Tim Peterscba30e22003-02-01 06:24:36 +0000769 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772 PyTuple_SET_ITEM(t, 0, memo_len);
773 Py_INCREF(memo_len);
774 PyTuple_SET_ITEM(t, 1, ob);
775 Py_INCREF(ob);
776
777 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
778 goto finally;
779
780 if (!self->bin) {
781 c_str[0] = PUT;
782 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
783 len = strlen(c_str);
784 }
785 else if (Pdata_Check(self->file)) {
786 if (write_other(self, NULL, 0) < 0) return -1;
787 PDATA_APPEND(self->file, memo_len, -1);
788 res=0; /* Job well done ;) */
789 goto finally;
790 }
791 else {
792 if (p >= 256) {
793 c_str[0] = LONG_BINPUT;
794 c_str[1] = (int)(p & 0xff);
795 c_str[2] = (int)((p >> 8) & 0xff);
796 c_str[3] = (int)((p >> 16) & 0xff);
797 c_str[4] = (int)((p >> 24) & 0xff);
798 len = 5;
799 }
800 else {
801 c_str[0] = BINPUT;
802 c_str[1] = p;
803 len = 2;
804 }
805 }
806
Tim Peters0bc93f52003-02-02 18:29:33 +0000807 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000808 goto finally;
809
810 res = 0;
811
812 finally:
813 Py_XDECREF(py_ob_id);
814 Py_XDECREF(memo_len);
815 Py_XDECREF(t);
816
817 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000818}
819
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000820#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000821
822static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000823PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824{
825 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
826 static PyObject *standard_builtins=0;
827 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000829 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000830 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000832 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000834 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000835 return NULL;
836 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 if ((globals=PyEval_GetGlobals())) {
839 Py_INCREF(globals);
840 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000841 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 goto err;
843 }
844 else {
845 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000848 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 __builtins__=standard_builtins;
852 Py_INCREF(__builtins__);
853 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000854 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 goto err;
856 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 if (PyDict_Check(__builtins__)) {
859 __import__=PyObject_GetItem(__builtins__,__import___str);
860 if (!__import__) goto err;
861 }
862 else {
863 __import__=PyObject_GetAttr(__builtins__,__import___str);
864 if (!__import__) goto err;
865 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 r=PyObject_CallFunction(__import__,"OOOO",
868 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000869 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000870 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000872 Py_DECREF(globals);
873 Py_DECREF(__builtins__);
874 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 return r;
877 err:
878 Py_XDECREF(globals);
879 Py_XDECREF(__builtins__);
880 Py_XDECREF(__import__);
881 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000882}
883
884static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000885whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000886{
887 int i, j;
888 PyObject *module = 0, *modules_dict = 0,
889 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000891 module = PyObject_GetAttrString(global, "__module__");
892 if (module) return module;
893 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000894
Tim Peterscba30e22003-02-01 06:24:36 +0000895 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000896 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 i = 0;
899 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 global_name_attr = PyObject_GetAttr(module, global_name);
904 if (!global_name_attr) {
905 PyErr_Clear();
906 continue;
907 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000909 if (global_name_attr != global) {
910 Py_DECREF(global_name_attr);
911 continue;
912 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000914 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 break;
917 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919 /* The following implements the rule in pickle.py added in 1.5
920 that used __main__ if no module is found. I don't actually
921 like this rule. jlf
922 */
923 if (!j) {
924 j=1;
925 name=__main___str;
926 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928 Py_INCREF(name);
929 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000930}
931
932
Guido van Rossum60456fd1997-04-09 17:36:32 +0000933static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934fast_save_enter(Picklerobject *self, PyObject *obj)
935{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 /* if fast_container < 0, we're doing an error exit. */
937 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
938 PyObject *key = NULL;
939 if (self->fast_memo == NULL) {
940 self->fast_memo = PyDict_New();
941 if (self->fast_memo == NULL) {
942 self->fast_container = -1;
943 return 0;
944 }
945 }
946 key = PyLong_FromVoidPtr(obj);
947 if (key == NULL)
948 return 0;
949 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000950 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951 PyErr_Format(PyExc_ValueError,
952 "fast mode: can't pickle cyclic objects including object type %s at %p",
953 obj->ob_type->tp_name, obj);
954 self->fast_container = -1;
955 return 0;
956 }
957 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000958 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 self->fast_container = -1;
960 return 0;
961 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000962 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000963 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000964 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000965}
966
Tim Peterscba30e22003-02-01 06:24:36 +0000967int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000968fast_save_leave(Picklerobject *self, PyObject *obj)
969{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000970 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
971 PyObject *key = PyLong_FromVoidPtr(obj);
972 if (key == NULL)
973 return 0;
974 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000975 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000976 return 0;
977 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000978 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000979 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000981}
982
983static int
Tim Peterscba30e22003-02-01 06:24:36 +0000984save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985{
986 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000987 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000988 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000990 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000991}
992
Guido van Rossum77f6a652002-04-03 22:41:51 +0000993static int
Tim Peterscba30e22003-02-01 06:24:36 +0000994save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000995{
Guido van Rossume2763392002-04-05 19:30:08 +0000996 static char *buf[2] = {FALSE, TRUE};
997 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000998 long l = PyInt_AS_LONG((PyIntObject *)args);
999
Tim Peters3c67d792003-02-02 17:59:11 +00001000 if (self->proto >= 2) {
1001 char opcode = l ? NEWTRUE : NEWFALSE;
1002 if (self->write_func(self, &opcode, 1) < 0)
1003 return -1;
1004 }
1005 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +00001006 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001007 return 0;
1008}
Tim Peters84e87f32001-03-17 04:50:51 +00001009
Guido van Rossum60456fd1997-04-09 17:36:32 +00001010static int
Tim Peterscba30e22003-02-01 06:24:36 +00001011save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001012{
1013 char c_str[32];
1014 long l = PyInt_AS_LONG((PyIntObject *)args);
1015 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001018#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 || l > 0x7fffffffL
1020 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001021#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001022 ) {
1023 /* Text-mode pickle, or long too big to fit in the 4-byte
1024 * signed BININT format: store as a string.
1025 */
1026 c_str[0] = INT;
1027 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001028 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 return -1;
1030 }
1031 else {
1032 /* Binary pickle and l fits in a signed 4-byte int. */
1033 c_str[1] = (int)( l & 0xff);
1034 c_str[2] = (int)((l >> 8) & 0xff);
1035 c_str[3] = (int)((l >> 16) & 0xff);
1036 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001038 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1039 if (c_str[2] == 0) {
1040 c_str[0] = BININT1;
1041 len = 2;
1042 }
1043 else {
1044 c_str[0] = BININT2;
1045 len = 3;
1046 }
1047 }
1048 else {
1049 c_str[0] = BININT;
1050 len = 5;
1051 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001052
Tim Peters0bc93f52003-02-02 18:29:33 +00001053 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001054 return -1;
1055 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001057 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058}
1059
1060
1061static int
Tim Peterscba30e22003-02-01 06:24:36 +00001062save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001063{
Tim Petersee1a53c2003-02-02 02:57:53 +00001064 int size;
1065 int res = -1;
1066 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001068 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001069
Tim Petersee1a53c2003-02-02 02:57:53 +00001070 if (self->proto >= 2) {
1071 /* Linear-time pickling. */
1072 size_t nbits;
1073 size_t nbytes;
1074 unsigned char *pdata;
1075 char c_str[5];
1076 int i;
1077 int sign = _PyLong_Sign(args);
1078
1079 if (sign == 0) {
1080 /* It's 0 -- an empty bytestring. */
1081 c_str[0] = LONG1;
1082 c_str[1] = 0;
1083 i = self->write_func(self, c_str, 2);
1084 if (i < 0) goto finally;
1085 res = 0;
1086 goto finally;
1087 }
1088 nbits = _PyLong_NumBits(args);
1089 if (nbits == (size_t)-1 && PyErr_Occurred())
1090 goto finally;
1091 /* How many bytes do we need? There are nbits >> 3 full
1092 * bytes of data, and nbits & 7 leftover bits. If there
1093 * are any leftover bits, then we clearly need another
1094 * byte. Wnat's not so obvious is that we *probably*
1095 * need another byte even if there aren't any leftovers:
1096 * the most-significant bit of the most-significant byte
1097 * acts like a sign bit, and it's usually got a sense
1098 * opposite of the one we need. The exception is longs
1099 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1100 * its own 256's-complement, so has the right sign bit
1101 * even without the extra byte. That's a pain to check
1102 * for in advance, though, so we always grab an extra
1103 * byte at the start, and cut it back later if possible.
1104 */
1105 nbytes = (nbits >> 3) + 1;
1106 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1107 PyErr_SetString(PyExc_OverflowError, "long too large "
1108 "to pickle");
1109 goto finally;
1110 }
1111 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1112 if (repr == NULL) goto finally;
1113 pdata = (unsigned char *)PyString_AS_STRING(repr);
1114 i = _PyLong_AsByteArray((PyLongObject *)args,
1115 pdata, nbytes,
1116 1 /* little endian */, 1 /* signed */);
1117 if (i < 0) goto finally;
1118 /* If the long is negative, this may be a byte more than
1119 * needed. This is so iff the MSB is all redundant sign
1120 * bits.
1121 */
1122 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1123 (pdata[nbytes - 2] & 0x80) != 0)
1124 --nbytes;
1125
1126 if (nbytes < 256) {
1127 c_str[0] = LONG1;
1128 c_str[1] = (char)nbytes;
1129 size = 2;
1130 }
1131 else {
1132 c_str[0] = LONG4;
1133 size = (int)nbytes;
1134 for (i = 1; i < 5; i++) {
1135 c_str[i] = (char)(size & 0xff);
1136 size >>= 8;
1137 }
1138 size = 5;
1139 }
1140 i = self->write_func(self, c_str, size);
1141 if (i < 0) goto finally;
1142 i = self->write_func(self, (char *)pdata, (int)nbytes);
1143 if (i < 0) goto finally;
1144 res = 0;
1145 goto finally;
1146 }
1147
1148 /* proto < 2: write the repr and newline. This is quadratic-time
1149 * (in the number of digits), in both directions.
1150 */
Tim Peterscba30e22003-02-01 06:24:36 +00001151 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 if ((size = PyString_Size(repr)) < 0)
1155 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Tim Peters0bc93f52003-02-02 18:29:33 +00001157 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Tim Peters0bc93f52003-02-02 18:29:33 +00001160 if (self->write_func(self,
1161 PyString_AS_STRING((PyStringObject *)repr),
1162 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
Tim Peters0bc93f52003-02-02 18:29:33 +00001165 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 finally:
1171 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173}
1174
1175
1176static int
Tim Peterscba30e22003-02-01 06:24:36 +00001177save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001178{
1179 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001181 if (self->bin) {
1182 int s, e;
1183 double f;
1184 long fhi, flo;
1185 char str[9];
1186 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 *p = BINFLOAT;
1189 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 if (x < 0) {
1192 s = 1;
1193 x = -x;
1194 }
1195 else
1196 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 /* Normalize f to be in the range [1.0, 2.0) */
1201 if (0.5 <= f && f < 1.0) {
1202 f *= 2.0;
1203 e--;
1204 }
1205 else if (f == 0.0) {
1206 e = 0;
1207 }
1208 else {
1209 PyErr_SetString(PyExc_SystemError,
1210 "frexp() result out of range");
1211 return -1;
1212 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if (e >= 1024) {
1215 /* XXX 1024 itself is reserved for Inf/NaN */
1216 PyErr_SetString(PyExc_OverflowError,
1217 "float too large to pack with d format");
1218 return -1;
1219 }
1220 else if (e < -1022) {
1221 /* Gradual underflow */
1222 f = ldexp(f, 1022 + e);
1223 e = 0;
1224 }
1225 else if (!(e == 0 && f == 0.0)) {
1226 e += 1023;
1227 f -= 1.0; /* Get rid of leading 1 */
1228 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001229
Tim Peterscba30e22003-02-01 06:24:36 +00001230 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 flo the low 24 bits (== 52 bits) */
1232 f *= 268435456.0; /* 2**28 */
1233 fhi = (long) floor(f); /* Truncate */
1234 f -= (double)fhi;
1235 f *= 16777216.0; /* 2**24 */
1236 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 /* First byte */
1239 *p = (s<<7) | (e>>4);
1240 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001242 /* Second byte */
1243 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1244 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001246 /* Third byte */
1247 *p = (unsigned char) ((fhi>>16) & 0xFF);
1248 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001250 /* Fourth byte */
1251 *p = (unsigned char) ((fhi>>8) & 0xFF);
1252 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 /* Fifth byte */
1255 *p = (unsigned char) (fhi & 0xFF);
1256 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001258 /* Sixth byte */
1259 *p = (unsigned char) ((flo>>16) & 0xFF);
1260 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262 /* Seventh byte */
1263 *p = (unsigned char) ((flo>>8) & 0xFF);
1264 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 /* Eighth byte */
1267 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001268
Tim Peters0bc93f52003-02-02 18:29:33 +00001269 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 return -1;
1271 }
1272 else {
1273 char c_str[250];
1274 c_str[0] = FLOAT;
1275 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001276
Tim Peters0bc93f52003-02-02 18:29:33 +00001277 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 return -1;
1279 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001282}
1283
1284
1285static int
Tim Peterscba30e22003-02-01 06:24:36 +00001286save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287{
1288 int size, len;
1289 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001291 if ((size = PyString_Size(args)) < 0)
1292 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if (!self->bin) {
1295 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298
Tim Peterscba30e22003-02-01 06:24:36 +00001299 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 if ((len = PyString_Size(repr)) < 0)
1303 goto err;
1304 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001305
Tim Peters0bc93f52003-02-02 18:29:33 +00001306 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001308
Tim Peters0bc93f52003-02-02 18:29:33 +00001309 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001311
Tim Peters0bc93f52003-02-02 18:29:33 +00001312 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001315 Py_XDECREF(repr);
1316 }
1317 else {
1318 int i;
1319 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 if ((size = PyString_Size(args)) < 0)
1322 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 if (size < 256) {
1325 c_str[0] = SHORT_BINSTRING;
1326 c_str[1] = size;
1327 len = 2;
1328 }
1329 else {
1330 c_str[0] = BINSTRING;
1331 for (i = 1; i < 5; i++)
1332 c_str[i] = (int)(size >> ((i - 1) * 8));
1333 len = 5;
1334 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001335
Tim Peters0bc93f52003-02-02 18:29:33 +00001336 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339 if (size > 128 && Pdata_Check(self->file)) {
1340 if (write_other(self, NULL, 0) < 0) return -1;
1341 PDATA_APPEND(self->file, args, -1);
1342 }
1343 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001344 if (self->write_func(self,
1345 PyString_AS_STRING(
1346 (PyStringObject *)args),
1347 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001348 return -1;
1349 }
1350 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if (doput)
1353 if (put(self, args) < 0)
1354 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001356 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 err:
1359 Py_XDECREF(repr);
1360 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001361}
1362
1363
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001364#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001365/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1366 backslash and newline characters to \uXXXX escapes. */
1367static PyObject *
1368modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1369{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 PyObject *repr;
1371 char *p;
1372 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001376 repr = PyString_FromStringAndSize(NULL, 6 * size);
1377 if (repr == NULL)
1378 return NULL;
1379 if (size == 0)
1380 return repr;
1381
1382 p = q = PyString_AS_STRING(repr);
1383 while (size-- > 0) {
1384 Py_UNICODE ch = *s++;
1385 /* Map 16-bit characters to '\uxxxx' */
1386 if (ch >= 256 || ch == '\\' || ch == '\n') {
1387 *p++ = '\\';
1388 *p++ = 'u';
1389 *p++ = hexdigit[(ch >> 12) & 0xf];
1390 *p++ = hexdigit[(ch >> 8) & 0xf];
1391 *p++ = hexdigit[(ch >> 4) & 0xf];
1392 *p++ = hexdigit[ch & 15];
1393 }
1394 /* Copy everything else as-is */
1395 else
1396 *p++ = (char) ch;
1397 }
1398 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001399 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001400 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001401}
1402
1403
Guido van Rossum60456fd1997-04-09 17:36:32 +00001404static int
Tim Peterscba30e22003-02-01 06:24:36 +00001405save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406{
1407 int size, len;
1408 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 if (!PyUnicode_Check(args))
1411 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 if (!self->bin) {
1414 char *repr_str;
1415 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 repr = modified_EncodeRawUnicodeEscape(
1418 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001419 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001420 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 if ((len = PyString_Size(repr)) < 0)
1423 goto err;
1424 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001425
Tim Peters0bc93f52003-02-02 18:29:33 +00001426 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428
Tim Peters0bc93f52003-02-02 18:29:33 +00001429 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001431
Tim Peters0bc93f52003-02-02 18:29:33 +00001432 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 Py_XDECREF(repr);
1436 }
1437 else {
1438 int i;
1439 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001440
Tim Peterscba30e22003-02-01 06:24:36 +00001441 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001442 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001444 if ((size = PyString_Size(repr)) < 0)
1445 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 c_str[0] = BINUNICODE;
1448 for (i = 1; i < 5; i++)
1449 c_str[i] = (int)(size >> ((i - 1) * 8));
1450 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001451
Tim Peters0bc93f52003-02-02 18:29:33 +00001452 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 if (size > 128 && Pdata_Check(self->file)) {
1456 if (write_other(self, NULL, 0) < 0)
1457 goto err;
1458 PDATA_APPEND(self->file, repr, -1);
1459 }
1460 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001461 if (self->write_func(self, PyString_AS_STRING(repr),
1462 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 goto err;
1464 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 Py_DECREF(repr);
1467 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 if (doput)
1470 if (put(self, args) < 0)
1471 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001475 err:
1476 Py_XDECREF(repr);
1477 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001478}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001479#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001480
Tim Peters1d63c9f2003-02-02 20:29:39 +00001481/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1482static int
Tim Peters67920142003-02-05 03:46:17 +00001483store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001484{
1485 int i;
1486 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001487
Tim Peters1d63c9f2003-02-02 20:29:39 +00001488 assert(PyTuple_Size(t) == len);
1489
1490 for (i = 0; i < len; i++) {
1491 PyObject *element = PyTuple_GET_ITEM(t, i);
1492
1493 if (element == NULL)
1494 goto finally;
1495 if (save(self, element, 0) < 0)
1496 goto finally;
1497 }
1498 res = 0;
1499
1500 finally:
1501 return res;
1502}
1503
1504/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1505 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001506 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001507 * (a tuple can be reached from itself), and that requires some subtle
1508 * magic so that it works in all cases. IOW, this is a long routine.
1509 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001510static int
Tim Peterscba30e22003-02-01 06:24:36 +00001511save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001513 PyObject *py_tuple_id = NULL;
1514 int len, i;
1515 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001517 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001518 static char pop = POP;
1519 static char pop_mark = POP_MARK;
1520 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522 if ((len = PyTuple_Size(args)) < 0)
1523 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001524
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 if (len == 0) {
1526 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001527
Tim Peters1d63c9f2003-02-02 20:29:39 +00001528 if (self->proto) {
1529 c_str[0] = EMPTY_TUPLE;
1530 len = 1;
1531 }
1532 else {
1533 c_str[0] = MARK;
1534 c_str[1] = TUPLE;
1535 len = 2;
1536 }
1537 if (self->write_func(self, c_str, len) >= 0)
1538 res = 0;
1539 /* Don't memoize an empty tuple. */
1540 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001541 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001542
Tim Peters1d63c9f2003-02-02 20:29:39 +00001543 /* A non-empty tuple. */
1544
1545 /* id(tuple) isn't in the memo now. If it shows up there after
1546 * saving the tuple elements, the tuple must be recursive, in
1547 * which case we'll pop everything we put on the stack, and fetch
1548 * its value from the memo.
1549 */
1550 py_tuple_id = PyLong_FromVoidPtr(args);
1551 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001552 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001553
Tim Peters1d63c9f2003-02-02 20:29:39 +00001554 if (len <= 3 && self->proto >= 2) {
1555 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001556 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001557 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001559 /* pop the len elements */
1560 for (i = 0; i < len; ++i)
1561 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001563 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 if (get(self, py_tuple_id) < 0)
1565 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001566 res = 0;
1567 goto finally;
1568 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001569 /* Not recursive. */
1570 if (self->write_func(self, len2opcode + len, 1) < 0)
1571 goto finally;
1572 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001573 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001574
Tim Peters1d63c9f2003-02-02 20:29:39 +00001575 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1576 * Generate MARK elt1 elt2 ... TUPLE
1577 */
1578 if (self->write_func(self, &MARKv, 1) < 0)
1579 goto finally;
1580
Tim Peters67920142003-02-05 03:46:17 +00001581 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001582 goto finally;
1583
1584 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1585 /* pop the stack stuff we pushed */
1586 if (self->bin) {
1587 if (self->write_func(self, &pop_mark, 1) < 0)
1588 goto finally;
1589 }
1590 else {
1591 /* Note that we pop one more than len, to remove
1592 * the MARK too.
1593 */
1594 for (i = 0; i <= len; i++)
1595 if (self->write_func(self, &pop, 1) < 0)
1596 goto finally;
1597 }
1598 /* fetch from memo */
1599 if (get(self, py_tuple_id) >= 0)
1600 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 goto finally;
1602 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001603
Tim Peters1d63c9f2003-02-02 20:29:39 +00001604 /* Not recursive. */
1605 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001607
Tim Peters1d63c9f2003-02-02 20:29:39 +00001608 memoize:
1609 if (put(self, args) >= 0)
1610 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001612 finally:
1613 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615}
1616
1617static int
Tim Peterscba30e22003-02-01 06:24:36 +00001618save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619{
1620 PyObject *element = 0;
1621 int s_len, len, i, using_appends, res = -1;
1622 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if (self->fast && !fast_save_enter(self, args))
1627 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 if (self->bin) {
1630 s[0] = EMPTY_LIST;
1631 s_len = 1;
1632 }
1633 else {
1634 s[0] = MARK;
1635 s[1] = LIST;
1636 s_len = 2;
1637 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001639 if ((len = PyList_Size(args)) < 0)
1640 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001641
Tim Peters0bc93f52003-02-02 18:29:33 +00001642 if (self->write_func(self, s, s_len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001645 if (len == 0) {
1646 if (put(self, args) < 0)
1647 goto finally;
1648 }
1649 else {
1650 if (put2(self, args) < 0)
1651 goto finally;
1652 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 if ((using_appends = (self->bin && (len > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001655 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001656 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001658 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001659 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001660 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001662 if (save(self, element, 0) < 0)
1663 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if (!using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001666 if (self->write_func(self, &append, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 goto finally;
1668 }
1669 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001671 if (using_appends) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001672 if (self->write_func(self, &appends, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 goto finally;
1674 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 finally:
1679 if (self->fast && !fast_save_leave(self, args))
1680 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001683}
1684
1685
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686static int
Tim Peterscba30e22003-02-01 06:24:36 +00001687save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001688{
1689 PyObject *key = 0, *value = 0;
1690 int i, len, res = -1, using_setitems;
1691 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001695 if (self->fast && !fast_save_enter(self, args))
1696 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 if (self->bin) {
1699 s[0] = EMPTY_DICT;
1700 len = 1;
1701 }
1702 else {
1703 s[0] = MARK;
1704 s[1] = DICT;
1705 len = 2;
1706 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001707
Tim Peters0bc93f52003-02-02 18:29:33 +00001708 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 if ((len = PyDict_Size(args)) < 0)
1712 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001714 if (len == 0) {
1715 if (put(self, args) < 0)
1716 goto finally;
1717 }
1718 else {
1719 if (put2(self, args) < 0)
1720 goto finally;
1721 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001723 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
Tim Peters0bc93f52003-02-02 18:29:33 +00001724 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001725 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 i = 0;
1728 while (PyDict_Next(args, &i, &key, &value)) {
1729 if (save(self, key, 0) < 0)
1730 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 if (save(self, value, 0) < 0)
1733 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 if (!using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001736 if (self->write_func(self, &setitem, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001737 goto finally;
1738 }
1739 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 if (using_setitems) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001742 if (self->write_func(self, &setitems, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743 goto finally;
1744 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001748 finally:
1749 if (self->fast && !fast_save_leave(self, args))
1750 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001753}
1754
1755
Tim Peters84e87f32001-03-17 04:50:51 +00001756static int
Tim Peterscba30e22003-02-01 06:24:36 +00001757save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758{
1759 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1760 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1761 char *module_str, *name_str;
1762 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 if (self->fast && !fast_save_enter(self, args))
1767 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001768
Tim Peters0bc93f52003-02-02 18:29:33 +00001769 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Tim Peterscba30e22003-02-01 06:24:36 +00001772 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 if (self->bin) {
1776 if (save(self, class, 0) < 0)
1777 goto finally;
1778 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1781 PyObject *element = 0;
1782 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001785 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001786 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 if ((len = PyObject_Size(class_args)) < 0)
1789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001792 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 if (save(self, element, 0) < 0) {
1796 Py_DECREF(element);
1797 goto finally;
1798 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 Py_DECREF(element);
1801 }
1802 }
1803 else {
1804 PyErr_Clear();
1805 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001807 if (!self->bin) {
1808 if (!( name = ((PyClassObject *)class)->cl_name )) {
1809 PyErr_SetString(PicklingError, "class has no name");
1810 goto finally;
1811 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Tim Peterscba30e22003-02-01 06:24:36 +00001813 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001815
Tim Peters84e87f32001-03-17 04:50:51 +00001816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 if ((module_size = PyString_Size(module)) < 0 ||
1818 (name_size = PyString_Size(name)) < 0)
1819 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 module_str = PyString_AS_STRING((PyStringObject *)module);
1822 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Tim Peters0bc93f52003-02-02 18:29:33 +00001824 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Tim Peters0bc93f52003-02-02 18:29:33 +00001827 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Tim Peters0bc93f52003-02-02 18:29:33 +00001830 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001832
Tim Peters0bc93f52003-02-02 18:29:33 +00001833 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001835
Tim Peters0bc93f52003-02-02 18:29:33 +00001836 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 goto finally;
1838 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001839 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 goto finally;
1841 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1844 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001845 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 goto finally;
1847 }
1848 else {
1849 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1852 PyErr_Clear();
1853 res = 0;
1854 goto finally;
1855 }
1856 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 if (!PyDict_Check(state)) {
1859 if (put2(self, args) < 0)
1860 goto finally;
1861 }
1862 else {
1863 if (put(self, args) < 0)
1864 goto finally;
1865 }
Tim Peters84e87f32001-03-17 04:50:51 +00001866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001867 if (save(self, state, 0) < 0)
1868 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001869
Tim Peters0bc93f52003-02-02 18:29:33 +00001870 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001873 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001875 finally:
1876 if (self->fast && !fast_save_leave(self, args))
1877 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879 Py_XDECREF(module);
1880 Py_XDECREF(class);
1881 Py_XDECREF(state);
1882 Py_XDECREF(getinitargs_func);
1883 Py_XDECREF(getstate_func);
1884 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001887}
1888
1889
Guido van Rossum60456fd1997-04-09 17:36:32 +00001890static int
Tim Peterscba30e22003-02-01 06:24:36 +00001891save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001893 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001894 char *name_str, *module_str;
1895 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 if (name) {
1900 global_name = name;
1901 Py_INCREF(global_name);
1902 }
1903 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001904 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 goto finally;
1906 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001907
Tim Peterscba30e22003-02-01 06:24:36 +00001908 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001909 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001911 if ((module_size = PyString_Size(module)) < 0 ||
1912 (name_size = PyString_Size(global_name)) < 0)
1913 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 module_str = PyString_AS_STRING((PyStringObject *)module);
1916 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001917
Guido van Rossum75bfd052002-12-24 18:10:07 +00001918 /* XXX This can be doing a relative import. Clearly it shouldn't,
1919 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 mod = PyImport_ImportModule(module_str);
1921 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 cPickle_ErrFormat(PicklingError,
1923 "Can't pickle %s: it's not found as %s.%s",
1924 "OSS", args, module, global_name);
1925 goto finally;
1926 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001927 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if (klass == NULL) {
1929 cPickle_ErrFormat(PicklingError,
1930 "Can't pickle %s: it's not found as %s.%s",
1931 "OSS", args, module, global_name);
1932 goto finally;
1933 }
1934 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001935 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001937 "Can't pickle %s: it's not the same object "
1938 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 "OSS", args, module, global_name);
1940 goto finally;
1941 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001942 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001943
Tim Peters731098b2003-02-04 20:56:09 +00001944 if (self->proto >= 2) {
1945 /* See whether this is in the extension registry, and if
1946 * so generate an EXT opcode.
1947 */
1948 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001949 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001950 char c_str[5];
1951 int n;
1952
1953 PyTuple_SET_ITEM(two_tuple, 0, module);
1954 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1955 py_code = PyDict_GetItem(extension_registry, two_tuple);
1956 if (py_code == NULL)
1957 goto gen_global; /* not registered */
1958
1959 /* Verify py_code has the right type and value. */
1960 if (!PyInt_Check(py_code)) {
1961 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001962 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001963 "OO", args, py_code);
1964 goto finally;
1965 }
1966 code = PyInt_AS_LONG(py_code);
1967 if (code <= 0 || code > 0x7fffffffL) {
1968 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1969 "extension code %ld is out of range",
1970 "Ol", args, code);
1971 goto finally;
1972 }
1973
1974 /* Generate an EXT opcode. */
1975 if (code <= 0xff) {
1976 c_str[0] = EXT1;
1977 c_str[1] = (char)code;
1978 n = 2;
1979 }
1980 else if (code <= 0xffff) {
1981 c_str[0] = EXT2;
1982 c_str[1] = (char)(code & 0xff);
1983 c_str[2] = (char)((code >> 8) & 0xff);
1984 n = 3;
1985 }
1986 else {
1987 c_str[0] = EXT4;
1988 c_str[1] = (char)(code & 0xff);
1989 c_str[2] = (char)((code >> 8) & 0xff);
1990 c_str[3] = (char)((code >> 16) & 0xff);
1991 c_str[4] = (char)((code >> 24) & 0xff);
1992 n = 5;
1993 }
1994
1995 if (self->write_func(self, c_str, n) >= 0)
1996 res = 0;
1997 goto finally; /* and don't memoize */
1998 }
1999
2000 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002001 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002003
Tim Peters0bc93f52003-02-02 18:29:33 +00002004 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002006
Tim Peters0bc93f52003-02-02 18:29:33 +00002007 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002008 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002009
Tim Peters0bc93f52003-02-02 18:29:33 +00002010 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002012
Tim Peters0bc93f52003-02-02 18:29:33 +00002013 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002014 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 if (put(self, args) < 0)
2017 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002021 finally:
2022 Py_XDECREF(module);
2023 Py_XDECREF(global_name);
2024 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002027}
2028
Guido van Rossum60456fd1997-04-09 17:36:32 +00002029static int
Tim Peterscba30e22003-02-01 06:24:36 +00002030save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031{
2032 PyObject *pid = 0;
2033 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002035 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002037 Py_INCREF(args);
2038 ARG_TUP(self, args);
2039 if (self->arg) {
2040 pid = PyObject_Call(f, self->arg, NULL);
2041 FREE_ARG_TUP(self);
2042 }
2043 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 if (pid != Py_None) {
2046 if (!self->bin) {
2047 if (!PyString_Check(pid)) {
2048 PyErr_SetString(PicklingError,
2049 "persistent id must be string");
2050 goto finally;
2051 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Tim Peters0bc93f52003-02-02 18:29:33 +00002053 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002056 if ((size = PyString_Size(pid)) < 0)
2057 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002058
Tim Peters0bc93f52003-02-02 18:29:33 +00002059 if (self->write_func(self,
2060 PyString_AS_STRING(
2061 (PyStringObject *)pid),
2062 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002064
Tim Peters0bc93f52003-02-02 18:29:33 +00002065 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 res = 1;
2069 goto finally;
2070 }
2071 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002072 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002073 res = -1;
2074 else
2075 res = 1;
2076 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 goto finally;
2079 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 finally:
2084 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002088
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002089
Tim Peters84e87f32001-03-17 04:50:51 +00002090static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002091save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002092 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093{
2094 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 if (save(self, callable, 0) < 0)
2097 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 if (save(self, tup, 0) < 0)
2100 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002101
Tim Peters0bc93f52003-02-02 18:29:33 +00002102 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 if (ob != NULL) {
2106 if (state && !PyDict_Check(state)) {
2107 if (put2(self, ob) < 0)
2108 return -1;
2109 }
2110 else {
2111 if (put(self, ob) < 0)
2112 return -1;
2113 }
2114 }
Tim Peters84e87f32001-03-17 04:50:51 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 if (state) {
2117 if (save(self, state, 0) < 0)
2118 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119
Tim Peters0bc93f52003-02-02 18:29:33 +00002120 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 return -1;
2122 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002125}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002126
Guido van Rossum60456fd1997-04-09 17:36:32 +00002127static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002128save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129{
2130 PyTypeObject *type;
2131 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2132 *callable = 0, *state = 0;
2133 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002134
Martin v. Löwis5a395302002-08-04 08:20:23 +00002135 if (self->nesting++ > Py_GetRecursionLimit()){
2136 PyErr_SetString(PyExc_RuntimeError,
2137 "maximum recursion depth exceeded");
2138 goto finally;
2139 }
2140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 if (!pers_save && self->pers_func) {
2142 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2143 res = tmp;
2144 goto finally;
2145 }
2146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002148 if (args == Py_None) {
2149 res = save_none(self, args);
2150 goto finally;
2151 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002153 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002155 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002156 case 'b':
2157 if (args == Py_False || args == Py_True) {
2158 res = save_bool(self, args);
2159 goto finally;
2160 }
2161 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002162 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002163 if (type == &PyInt_Type) {
2164 res = save_int(self, args);
2165 goto finally;
2166 }
2167 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002168
Guido van Rossum60456fd1997-04-09 17:36:32 +00002169 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 if (type == &PyLong_Type) {
2171 res = save_long(self, args);
2172 goto finally;
2173 }
2174 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002175
Guido van Rossum60456fd1997-04-09 17:36:32 +00002176 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002177 if (type == &PyFloat_Type) {
2178 res = save_float(self, args);
2179 goto finally;
2180 }
2181 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002182
Guido van Rossum60456fd1997-04-09 17:36:32 +00002183 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002184 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2185 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 goto finally;
2187 }
2188 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002189
Guido van Rossum60456fd1997-04-09 17:36:32 +00002190 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2192 res = save_string(self, args, 0);
2193 goto finally;
2194 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002195
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002196#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002197 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2199 res = save_unicode(self, args, 0);
2200 goto finally;
2201 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002202#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002203 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002205 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002206 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002207 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002209 if (PyDict_GetItem(self->memo, py_ob_id)) {
2210 if (get(self, py_ob_id) < 0)
2211 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002213 res = 0;
2214 goto finally;
2215 }
2216 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002218 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002219 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002220 if (type == &PyString_Type) {
2221 res = save_string(self, args, 1);
2222 goto finally;
2223 }
2224 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002225
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002226#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002227 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002228 if (type == &PyUnicode_Type) {
2229 res = save_unicode(self, args, 1);
2230 goto finally;
2231 }
2232 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002233#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002234
Guido van Rossum60456fd1997-04-09 17:36:32 +00002235 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 if (type == &PyTuple_Type) {
2237 res = save_tuple(self, args);
2238 goto finally;
2239 }
2240 if (type == &PyType_Type) {
2241 res = save_global(self, args, NULL);
2242 goto finally;
2243 }
2244 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002245
Guido van Rossum60456fd1997-04-09 17:36:32 +00002246 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002247 if (type == &PyList_Type) {
2248 res = save_list(self, args);
2249 goto finally;
2250 }
2251 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002252
2253 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002254 if (type == &PyDict_Type) {
2255 res = save_dict(self, args);
2256 goto finally;
2257 }
2258 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002259
2260 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002261 if (type == &PyInstance_Type) {
2262 res = save_inst(self, args);
2263 goto finally;
2264 }
2265 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002266
2267 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268 if (type == &PyClass_Type) {
2269 res = save_global(self, args, NULL);
2270 goto finally;
2271 }
2272 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002273
2274 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 if (type == &PyFunction_Type) {
2276 res = save_global(self, args, NULL);
2277 goto finally;
2278 }
2279 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002280
2281 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 if (type == &PyCFunction_Type) {
2283 res = save_global(self, args, NULL);
2284 goto finally;
2285 }
2286 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 if (!pers_save && self->inst_pers_func) {
2289 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2290 res = tmp;
2291 goto finally;
2292 }
2293 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002294
Jeremy Hylton39c61162002-07-16 19:47:43 +00002295 if (PyType_IsSubtype(type, &PyType_Type)) {
2296 res = save_global(self, args, NULL);
2297 goto finally;
2298 }
2299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2301 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 Py_INCREF(args);
2304 ARG_TUP(self, args);
2305 if (self->arg) {
2306 t = PyObject_Call(__reduce__, self->arg, NULL);
2307 FREE_ARG_TUP(self);
2308 }
2309 if (! t) goto finally;
2310 }
2311 else {
2312 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2315 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002316 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 goto finally;
2318 }
2319 else {
2320 PyErr_Clear();
2321 }
2322 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 if (t) {
2325 if (PyString_Check(t)) {
2326 res = save_global(self, args, t);
2327 goto finally;
2328 }
Tim Peters84e87f32001-03-17 04:50:51 +00002329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 if (!PyTuple_Check(t)) {
2331 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2332 "be a tuple", "O", __reduce__);
2333 goto finally;
2334 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002338 if ((size != 3) && (size != 2)) {
2339 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2340 "contain only two or three elements", "O", __reduce__);
2341 goto finally;
2342 }
Tim Peters84e87f32001-03-17 04:50:51 +00002343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002346 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002348 if (size > 2) {
2349 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002350 if (state == Py_None)
2351 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002352 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002354 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2355 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2356 "returned by %s must be a tuple", "O", __reduce__);
2357 goto finally;
2358 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002360 res = save_reduce(self, callable, arg_tup, state, args);
2361 goto finally;
2362 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002366 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002367 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368 Py_XDECREF(py_ob_id);
2369 Py_XDECREF(__reduce__);
2370 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002373}
2374
2375
2376static int
Tim Peterscba30e22003-02-01 06:24:36 +00002377dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378{
2379 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002380
Tim Peters4190fb82003-02-02 16:09:05 +00002381 if (self->proto >= 2) {
2382 char bytes[2];
2383
2384 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002385 assert(self->proto >= 0 && self->proto < 256);
2386 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002387 if (self->write_func(self, bytes, 2) < 0)
2388 return -1;
2389 }
2390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 if (save(self, args, 0) < 0)
2392 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002393
Tim Peters4190fb82003-02-02 16:09:05 +00002394 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002396
Tim Peters4190fb82003-02-02 16:09:05 +00002397 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002400 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002401}
2402
2403static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002404Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405{
Tim Peterscba30e22003-02-01 06:24:36 +00002406 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002407 PyDict_Clear(self->memo);
2408 Py_INCREF(Py_None);
2409 return Py_None;
2410}
2411
2412static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002413Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414{
2415 int l, i, rsize, ssize, clear=1, lm;
2416 long ik;
2417 PyObject *k, *r;
2418 char *s, *p, *have_get;
2419 Pdata *data;
2420
2421 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002422 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002423 return NULL;
2424
2425 /* Check to make sure we are based on a list */
2426 if (! Pdata_Check(self->file)) {
2427 PyErr_SetString(PicklingError,
2428 "Attempt to getvalue() a non-list-based pickler");
2429 return NULL;
2430 }
2431
2432 /* flush write buffer */
2433 if (write_other(self, NULL, 0) < 0) return NULL;
2434
2435 data=(Pdata*)self->file;
2436 l=data->length;
2437
2438 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002439 lm = PyDict_Size(self->memo);
2440 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002442 have_get = malloc(lm);
2443 if (have_get == NULL) return PyErr_NoMemory();
2444 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002445
2446 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002447 for (rsize = 0, i = l; --i >= 0; ) {
2448 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449
Tim Petersac5687a2003-02-02 18:08:34 +00002450 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452
2453 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002454 ik = PyInt_AS_LONG((PyIntObject*)k);
2455 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002456 PyErr_SetString(PicklingError,
2457 "Invalid get data");
2458 return NULL;
2459 }
Tim Petersac5687a2003-02-02 18:08:34 +00002460 if (have_get[ik]) /* with matching get */
2461 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002462 }
2463
2464 else if (! (PyTuple_Check(k) &&
2465 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002466 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002467 ) {
2468 PyErr_SetString(PicklingError,
2469 "Unexpected data in internal list");
2470 return NULL;
2471 }
2472
2473 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002474 ik = PyInt_AS_LONG((PyIntObject *)k);
2475 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002476 PyErr_SetString(PicklingError,
2477 "Invalid get data");
2478 return NULL;
2479 }
Tim Petersac5687a2003-02-02 18:08:34 +00002480 have_get[ik] = 1;
2481 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002483 }
2484
2485 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002486 r = PyString_FromStringAndSize(NULL, rsize);
2487 if (r == NULL) goto err;
2488 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489
Tim Petersac5687a2003-02-02 18:08:34 +00002490 for (i = 0; i < l; i++) {
2491 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492
2493 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002494 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002496 p=PyString_AS_STRING((PyStringObject *)k);
2497 while (--ssize >= 0)
2498 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 }
2500 }
2501
2502 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002503 ik = PyInt_AS_LONG((PyIntObject *)
2504 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505 if (ik < 256) {
2506 *s++ = BINGET;
2507 *s++ = (int)(ik & 0xff);
2508 }
2509 else {
2510 *s++ = LONG_BINGET;
2511 *s++ = (int)(ik & 0xff);
2512 *s++ = (int)((ik >> 8) & 0xff);
2513 *s++ = (int)((ik >> 16) & 0xff);
2514 *s++ = (int)((ik >> 24) & 0xff);
2515 }
2516 }
2517
2518 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002519 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002520
2521 if (have_get[ik]) { /* with matching get */
2522 if (ik < 256) {
2523 *s++ = BINPUT;
2524 *s++ = (int)(ik & 0xff);
2525 }
2526 else {
2527 *s++ = LONG_BINPUT;
2528 *s++ = (int)(ik & 0xff);
2529 *s++ = (int)((ik >> 8) & 0xff);
2530 *s++ = (int)((ik >> 16) & 0xff);
2531 *s++ = (int)((ik >> 24) & 0xff);
2532 }
2533 }
2534 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002535 }
2536
2537 if (clear) {
2538 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002539 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002540 }
2541
2542 free(have_get);
2543 return r;
2544 err:
2545 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002546 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002547}
2548
2549static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002550Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002551{
2552 PyObject *ob;
2553 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002554
Tim Peterscba30e22003-02-01 06:24:36 +00002555 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002556 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 if (dump(self, ob) < 0)
2559 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563 /* XXX Why does dump() return self? */
2564 Py_INCREF(self);
2565 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566}
2567
2568
Tim Peterscba30e22003-02-01 06:24:36 +00002569static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570{
Neal Norwitzb0493252002-03-31 14:44:22 +00002571 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002572 PyDoc_STR("dump(object) -- "
2573 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002574 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002575 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002576 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002577 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002578 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002579};
2580
2581
2582static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002583newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584{
2585 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002586
Tim Peters5bd2a792003-02-01 16:45:06 +00002587 if (proto < 0)
2588 proto = CURRENT_PROTOCOL_NUMBER;
2589 if (proto > CURRENT_PROTOCOL_NUMBER) {
2590 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2591 "the highest available protocol is %d",
2592 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002594 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002595
Tim Peters5bd2a792003-02-01 16:45:06 +00002596 self = PyObject_New(Picklerobject, &Picklertype);
2597 if (self == NULL)
2598 return NULL;
2599 self->proto = proto;
2600 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 self->fp = NULL;
2602 self->write = NULL;
2603 self->memo = NULL;
2604 self->arg = NULL;
2605 self->pers_func = NULL;
2606 self->inst_pers_func = NULL;
2607 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002609 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610 self->fast_container = 0;
2611 self->fast_memo = NULL;
2612 self->buf_size = 0;
2613 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002614
Tim Peters5bd2a792003-02-01 16:45:06 +00002615 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616 if (file)
2617 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002618 else {
2619 file = Pdata_New();
2620 if (file == NULL)
2621 goto err;
2622 }
2623 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002624
Tim Peterscba30e22003-02-01 06:24:36 +00002625 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002628 if (PyFile_Check(file)) {
2629 self->fp = PyFile_AsFile(file);
2630 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002631 PyErr_SetString(PyExc_ValueError,
2632 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633 goto err;
2634 }
2635 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002636 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002637 else if (PycStringIO_OutputCheck(file)) {
2638 self->write_func = write_cStringIO;
2639 }
2640 else if (file == Py_None) {
2641 self->write_func = write_none;
2642 }
2643 else {
2644 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002646 if (! Pdata_Check(file)) {
2647 self->write = PyObject_GetAttr(file, write_str);
2648 if (!self->write) {
2649 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002650 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 "argument must have 'write' "
2652 "attribute");
2653 goto err;
2654 }
2655 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002656
Tim Peters5bd2a792003-02-01 16:45:06 +00002657 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2658 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 PyErr_NoMemory();
2660 goto err;
2661 }
2662 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002664 if (PyEval_GetRestricted()) {
2665 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002666 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002667
Tim Peters5b7da392003-02-04 00:21:07 +00002668 if (m == NULL)
2669 goto err;
2670 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002672 if (self->dispatch_table == NULL)
2673 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 }
2675 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002676 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 Py_INCREF(dispatch_table);
2678 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002682 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002683 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002685}
2686
2687
2688static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002689get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690{
2691 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002692 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002693
Tim Peters5bd2a792003-02-01 16:45:06 +00002694 /* XXX What is this doing? The documented signature is
2695 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2696 * XXX Pickler(integer) too. The meaning then is clear as mud.
2697 * XXX Bug? Feature?
2698 */
2699 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002700 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002701 proto = 0;
2702 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 return NULL;
2704 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002705 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002706}
2707
2708
2709static void
Tim Peterscba30e22003-02-01 06:24:36 +00002710Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711{
2712 Py_XDECREF(self->write);
2713 Py_XDECREF(self->memo);
2714 Py_XDECREF(self->fast_memo);
2715 Py_XDECREF(self->arg);
2716 Py_XDECREF(self->file);
2717 Py_XDECREF(self->pers_func);
2718 Py_XDECREF(self->inst_pers_func);
2719 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002720 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002722}
2723
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002724static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002725Pickler_get_pers_func(Picklerobject *p)
2726{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 if (p->pers_func == NULL)
2728 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2729 else
2730 Py_INCREF(p->pers_func);
2731 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002732}
2733
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002734static int
2735Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2736{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 if (v == NULL) {
2738 PyErr_SetString(PyExc_TypeError,
2739 "attribute deletion is not supported");
2740 return -1;
2741 }
2742 Py_XDECREF(p->pers_func);
2743 Py_INCREF(v);
2744 p->pers_func = v;
2745 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002746}
2747
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002748static int
2749Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2750{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 if (v == NULL) {
2752 PyErr_SetString(PyExc_TypeError,
2753 "attribute deletion is not supported");
2754 return -1;
2755 }
2756 Py_XDECREF(p->inst_pers_func);
2757 Py_INCREF(v);
2758 p->inst_pers_func = v;
2759 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002760}
2761
2762static PyObject *
2763Pickler_get_memo(Picklerobject *p)
2764{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 if (p->memo == NULL)
2766 PyErr_SetString(PyExc_AttributeError, "memo");
2767 else
2768 Py_INCREF(p->memo);
2769 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002770}
2771
2772static int
2773Pickler_set_memo(Picklerobject *p, PyObject *v)
2774{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 if (v == NULL) {
2776 PyErr_SetString(PyExc_TypeError,
2777 "attribute deletion is not supported");
2778 return -1;
2779 }
2780 if (!PyDict_Check(v)) {
2781 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2782 return -1;
2783 }
2784 Py_XDECREF(p->memo);
2785 Py_INCREF(v);
2786 p->memo = v;
2787 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002788}
2789
2790static PyObject *
2791Pickler_get_error(Picklerobject *p)
2792{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 /* why is this an attribute on the Pickler? */
2794 Py_INCREF(PicklingError);
2795 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002796}
2797
2798static PyMemberDef Pickler_members[] = {
2799 {"binary", T_INT, offsetof(Picklerobject, bin)},
2800 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002801 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002802};
2803
2804static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002805 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002806 (setter)Pickler_set_pers_func},
2807 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2808 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002809 {"PicklingError", (getter)Pickler_get_error, NULL},
2810 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002811};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002812
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002813PyDoc_STRVAR(Picklertype__doc__,
2814"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002815
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002816static PyTypeObject Picklertype = {
2817 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002818 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002819 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002820 sizeof(Picklerobject), /*tp_basicsize*/
2821 0,
2822 (destructor)Pickler_dealloc, /* tp_dealloc */
2823 0, /* tp_print */
2824 0, /* tp_getattr */
2825 0, /* tp_setattr */
2826 0, /* tp_compare */
2827 0, /* tp_repr */
2828 0, /* tp_as_number */
2829 0, /* tp_as_sequence */
2830 0, /* tp_as_mapping */
2831 0, /* tp_hash */
2832 0, /* tp_call */
2833 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002834 PyObject_GenericGetAttr, /* tp_getattro */
2835 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002836 0, /* tp_as_buffer */
2837 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2838 Picklertype__doc__, /* tp_doc */
2839 0, /* tp_traverse */
2840 0, /* tp_clear */
2841 0, /* tp_richcompare */
2842 0, /* tp_weaklistoffset */
2843 0, /* tp_iter */
2844 0, /* tp_iternext */
2845 Pickler_methods, /* tp_methods */
2846 Pickler_members, /* tp_members */
2847 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002848};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002849
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002850static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002851find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852{
2853 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 if (fc) {
2856 if (fc==Py_None) {
2857 PyErr_SetString(UnpicklingError,
2858 "Global and instance pickles are not supported.");
2859 return NULL;
2860 }
Tim Peterscba30e22003-02-01 06:24:36 +00002861 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 py_global_name);
2863 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865 module = PySys_GetObject("modules");
2866 if (module == NULL)
2867 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 module = PyDict_GetItem(module, py_module_name);
2870 if (module == NULL) {
2871 module = PyImport_Import(py_module_name);
2872 if (!module)
2873 return NULL;
2874 global = PyObject_GetAttr(module, py_global_name);
2875 Py_DECREF(module);
2876 }
2877 else
2878 global = PyObject_GetAttr(module, py_global_name);
2879 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002880}
2881
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002882static int
Tim Peterscba30e22003-02-01 06:24:36 +00002883marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884{
2885 if (self->num_marks < 1) {
2886 PyErr_SetString(UnpicklingError, "could not find MARK");
2887 return -1;
2888 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891}
2892
Tim Peters84e87f32001-03-17 04:50:51 +00002893
Guido van Rossum60456fd1997-04-09 17:36:32 +00002894static int
Tim Peterscba30e22003-02-01 06:24:36 +00002895load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002896{
2897 PDATA_APPEND(self->stack, Py_None, -1);
2898 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002899}
2900
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002901static int
Tim Peterscba30e22003-02-01 06:24:36 +00002902bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002903{
2904 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2905 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002906}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002907
2908static int
Tim Peterscba30e22003-02-01 06:24:36 +00002909load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002910{
2911 PyObject *py_int = 0;
2912 char *endptr, *s;
2913 int len, res = -1;
2914 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002915
Tim Peters0bc93f52003-02-02 18:29:33 +00002916 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002917 if (len < 2) return bad_readline();
2918 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920 errno = 0;
2921 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2924 /* Hm, maybe we've got something long. Let's try reading
2925 it as a Python long object. */
2926 errno = 0;
2927 py_int = PyLong_FromString(s, NULL, 0);
2928 if (py_int == NULL) {
2929 PyErr_SetString(PyExc_ValueError,
2930 "could not convert string to int");
2931 goto finally;
2932 }
2933 }
2934 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002935 if (len == 3 && (l == 0 || l == 1)) {
2936 if (!( py_int = PyBool_FromLong(l))) goto finally;
2937 }
2938 else {
2939 if (!( py_int = PyInt_FromLong(l))) goto finally;
2940 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 free(s);
2944 PDATA_PUSH(self->stack, py_int, -1);
2945 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 finally:
2948 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951}
2952
Tim Peters3c67d792003-02-02 17:59:11 +00002953static int
2954load_bool(Unpicklerobject *self, PyObject *boolean)
2955{
2956 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002957 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002958 return 0;
2959}
2960
Tim Petersee1a53c2003-02-02 02:57:53 +00002961/* s contains x bytes of a little-endian integer. Return its value as a
2962 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2963 * int, but when x is 4 it's a signed one. This is an historical source
2964 * of x-platform bugs.
2965 */
Tim Peters84e87f32001-03-17 04:50:51 +00002966static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002967calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968{
2969 unsigned char c;
2970 int i;
2971 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973 for (i = 0, l = 0L; i < x; i++) {
2974 c = (unsigned char)s[i];
2975 l |= (long)c << (i * 8);
2976 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002977#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2979 * is signed, so on a box with longs bigger than 4 bytes we need
2980 * to extend a BININT's sign bit to the full width.
2981 */
2982 if (x == 4 && l & (1L << 31))
2983 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002984#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002986}
2987
2988
2989static int
Tim Peterscba30e22003-02-01 06:24:36 +00002990load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991{
2992 PyObject *py_int = 0;
2993 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Tim Peterscba30e22003-02-01 06:24:36 +00002997 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000 PDATA_PUSH(self->stack, py_int, -1);
3001 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002}
3003
3004
3005static int
Tim Peterscba30e22003-02-01 06:24:36 +00003006load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007{
3008 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009
Tim Peters0bc93f52003-02-02 18:29:33 +00003010 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003014}
3015
3016
3017static int
Tim Peterscba30e22003-02-01 06:24:36 +00003018load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019{
3020 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003021
Tim Peters0bc93f52003-02-02 18:29:33 +00003022 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026}
3027
3028
3029static int
Tim Peterscba30e22003-02-01 06:24:36 +00003030load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003031{
3032 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Tim Peters0bc93f52003-02-02 18:29:33 +00003034 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003035 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038}
Tim Peters84e87f32001-03-17 04:50:51 +00003039
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040static int
Tim Peterscba30e22003-02-01 06:24:36 +00003041load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042{
3043 PyObject *l = 0;
3044 char *end, *s;
3045 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
Tim Peters0bc93f52003-02-02 18:29:33 +00003047 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 if (len < 2) return bad_readline();
3049 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050
Tim Peterscba30e22003-02-01 06:24:36 +00003051 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 free(s);
3055 PDATA_PUSH(self->stack, l, -1);
3056 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 finally:
3059 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062}
3063
Tim Petersee1a53c2003-02-02 02:57:53 +00003064/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3065 * data following.
3066 */
3067static int
3068load_counted_long(Unpicklerobject *self, int size)
3069{
3070 int i;
3071 char *nbytes;
3072 unsigned char *pdata;
3073 PyObject *along;
3074
3075 assert(size == 1 || size == 4);
3076 i = self->read_func(self, &nbytes, size);
3077 if (i < 0) return -1;
3078
3079 size = calc_binint(nbytes, size);
3080 if (size < 0) {
3081 /* Corrupt or hostile pickle -- we never write one like
3082 * this.
3083 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003084 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003085 "byte count");
3086 return -1;
3087 }
3088
3089 if (size == 0)
3090 along = PyLong_FromLong(0L);
3091 else {
3092 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003093 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003094 if (i < 0) return -1;
3095 along = _PyLong_FromByteArray(pdata, (size_t)size,
3096 1 /* little endian */, 1 /* signed */);
3097 }
3098 if (along == NULL)
3099 return -1;
3100 PDATA_PUSH(self->stack, along, -1);
3101 return 0;
3102}
Tim Peters84e87f32001-03-17 04:50:51 +00003103
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104static int
Tim Peterscba30e22003-02-01 06:24:36 +00003105load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106{
3107 PyObject *py_float = 0;
3108 char *endptr, *s;
3109 int len, res = -1;
3110 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111
Tim Peters0bc93f52003-02-02 18:29:33 +00003112 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 if (len < 2) return bad_readline();
3114 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116 errno = 0;
3117 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3120 PyErr_SetString(PyExc_ValueError,
3121 "could not convert string to float");
3122 goto finally;
3123 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Tim Peterscba30e22003-02-01 06:24:36 +00003125 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 free(s);
3129 PDATA_PUSH(self->stack, py_float, -1);
3130 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 finally:
3133 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003136}
3137
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138static int
Tim Peterscba30e22003-02-01 06:24:36 +00003139load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140{
3141 PyObject *py_float = 0;
3142 int s, e;
3143 long fhi, flo;
3144 double x;
3145 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003146
Tim Peters0bc93f52003-02-02 18:29:33 +00003147 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003148 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 /* First byte */
3151 s = (*p>>7) & 1;
3152 e = (*p & 0x7F) << 4;
3153 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 /* Second byte */
3156 e |= (*p>>4) & 0xF;
3157 fhi = (*p & 0xF) << 24;
3158 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003160 /* Third byte */
3161 fhi |= (*p & 0xFF) << 16;
3162 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 /* Fourth byte */
3165 fhi |= (*p & 0xFF) << 8;
3166 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003168 /* Fifth byte */
3169 fhi |= *p & 0xFF;
3170 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172 /* Sixth byte */
3173 flo = (*p & 0xFF) << 16;
3174 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003176 /* Seventh byte */
3177 flo |= (*p & 0xFF) << 8;
3178 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 /* Eighth byte */
3181 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3184 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 /* XXX This sadly ignores Inf/NaN */
3187 if (e == 0)
3188 e = -1022;
3189 else {
3190 x += 1.0;
3191 e -= 1023;
3192 }
3193 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if (s)
3196 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 PDATA_PUSH(self->stack, py_float, -1);
3201 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003203
3204static int
Tim Peterscba30e22003-02-01 06:24:36 +00003205load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206{
3207 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003208 int len, res = -1;
3209 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210
Tim Peters0bc93f52003-02-02 18:29:33 +00003211 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 if (len < 2) return bad_readline();
3213 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003215
3216 /* Strip outermost quotes */
3217 while (s[len-1] <= ' ')
3218 len--;
3219 if(s[0]=='"' && s[len-1]=='"'){
3220 s[len-1] = '\0';
3221 p = s + 1 ;
3222 len -= 2;
3223 } else if(s[0]=='\'' && s[len-1]=='\''){
3224 s[len-1] = '\0';
3225 p = s + 1 ;
3226 len -= 2;
3227 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 goto insecure;
3229 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003230
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003231 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3232 if (str) {
3233 PDATA_PUSH(self->stack, str, -1);
3234 res = 0;
3235 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 insecure:
3240 free(s);
3241 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3242 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003243}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
3245
3246static int
Tim Peterscba30e22003-02-01 06:24:36 +00003247load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248{
3249 PyObject *py_string = 0;
3250 long l;
3251 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003252
Tim Peters0bc93f52003-02-02 18:29:33 +00003253 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256
Tim Peters0bc93f52003-02-02 18:29:33 +00003257 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003259
Tim Peterscba30e22003-02-01 06:24:36 +00003260 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 PDATA_PUSH(self->stack, py_string, -1);
3264 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003265}
3266
3267
3268static int
Tim Peterscba30e22003-02-01 06:24:36 +00003269load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270{
3271 PyObject *py_string = 0;
3272 unsigned char l;
3273 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003274
Tim Peters0bc93f52003-02-02 18:29:33 +00003275 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Tim Peters0bc93f52003-02-02 18:29:33 +00003280 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 PDATA_PUSH(self->stack, py_string, -1);
3285 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003286}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
3288
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003289#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003290static int
Tim Peterscba30e22003-02-01 06:24:36 +00003291load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292{
3293 PyObject *str = 0;
3294 int len, res = -1;
3295 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003296
Tim Peters0bc93f52003-02-02 18:29:33 +00003297 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003299
Tim Peterscba30e22003-02-01 06:24:36 +00003300 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003301 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303 PDATA_PUSH(self->stack, str, -1);
3304 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 finally:
3307 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003308}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003309#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003310
3311
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003312#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003313static int
Tim Peterscba30e22003-02-01 06:24:36 +00003314load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315{
3316 PyObject *unicode;
3317 long l;
3318 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003319
Tim Peters0bc93f52003-02-02 18:29:33 +00003320 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003323
Tim Peters0bc93f52003-02-02 18:29:33 +00003324 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003325 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003326
Tim Peterscba30e22003-02-01 06:24:36 +00003327 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003328 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003330 PDATA_PUSH(self->stack, unicode, -1);
3331 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003332}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003333#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003334
3335
3336static int
Tim Peterscba30e22003-02-01 06:24:36 +00003337load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338{
3339 PyObject *tup;
3340 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 if ((i = marker(self)) < 0) return -1;
3343 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3344 PDATA_PUSH(self->stack, tup, -1);
3345 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003346}
3347
3348static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003349load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003350{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003351 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003352
Tim Peters1d63c9f2003-02-02 20:29:39 +00003353 if (tup == NULL)
3354 return -1;
3355
3356 while (--len >= 0) {
3357 PyObject *element;
3358
3359 PDATA_POP(self->stack, element);
3360 if (element == NULL)
3361 return -1;
3362 PyTuple_SET_ITEM(tup, len, element);
3363 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003364 PDATA_PUSH(self->stack, tup, -1);
3365 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003366}
3367
3368static int
Tim Peterscba30e22003-02-01 06:24:36 +00003369load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370{
3371 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003373 if (!( list=PyList_New(0))) return -1;
3374 PDATA_PUSH(self->stack, list, -1);
3375 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003376}
3377
3378static int
Tim Peterscba30e22003-02-01 06:24:36 +00003379load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380{
3381 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383 if (!( dict=PyDict_New())) return -1;
3384 PDATA_PUSH(self->stack, dict, -1);
3385 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003386}
3387
3388
3389static int
Tim Peterscba30e22003-02-01 06:24:36 +00003390load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391{
3392 PyObject *list = 0;
3393 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003395 if ((i = marker(self)) < 0) return -1;
3396 if (!( list=Pdata_popList(self->stack, i))) return -1;
3397 PDATA_PUSH(self->stack, list, -1);
3398 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399}
3400
3401static int
Tim Peterscba30e22003-02-01 06:24:36 +00003402load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403{
3404 PyObject *dict, *key, *value;
3405 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 if ((i = marker(self)) < 0) return -1;
3408 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003412 for (k = i+1; k < j; k += 2) {
3413 key =self->stack->data[k-1];
3414 value=self->stack->data[k ];
3415 if (PyDict_SetItem(dict, key, value) < 0) {
3416 Py_DECREF(dict);
3417 return -1;
3418 }
3419 }
3420 Pdata_clear(self->stack, i);
3421 PDATA_PUSH(self->stack, dict, -1);
3422 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423}
3424
3425static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003426Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003428 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430 if (PyClass_Check(cls)) {
3431 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 if ((l=PyObject_Size(args)) < 0) goto err;
3434 if (!( l )) {
3435 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003436
Tim Peterscba30e22003-02-01 06:24:36 +00003437 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438 __getinitargs___str);
3439 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003440 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003441 so bypass usual construction */
3442 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003445 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003446 goto err;
3447 return inst;
3448 }
3449 Py_DECREF(__getinitargs__);
3450 }
Tim Peters84e87f32001-03-17 04:50:51 +00003451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452 if ((r=PyInstance_New(cls, args, NULL))) return r;
3453 else goto err;
3454 }
Tim Peters84e87f32001-03-17 04:50:51 +00003455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 if (args==Py_None) {
3457 /* Special case, call cls.__basicnew__() */
3458 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003460 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3461 if (!basicnew) return NULL;
3462 r=PyObject_CallObject(basicnew, NULL);
3463 Py_DECREF(basicnew);
3464 if (r) return r;
3465 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 err:
3470 {
3471 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473 PyErr_Fetch(&tp, &v, &tb);
3474 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3475 Py_XDECREF(v);
3476 v=r;
3477 }
3478 PyErr_Restore(tp,v,tb);
3479 }
3480 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481}
Tim Peters84e87f32001-03-17 04:50:51 +00003482
Guido van Rossum60456fd1997-04-09 17:36:32 +00003483
3484static int
Tim Peterscba30e22003-02-01 06:24:36 +00003485load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486{
3487 PyObject *class, *tup, *obj=0;
3488 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 if ((i = marker(self)) < 0) return -1;
3491 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3492 PDATA_POP(self->stack, class);
3493 if (class) {
3494 obj = Instance_New(class, tup);
3495 Py_DECREF(class);
3496 }
3497 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 if (! obj) return -1;
3500 PDATA_PUSH(self->stack, obj, -1);
3501 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003502}
3503
3504
3505static int
Tim Peterscba30e22003-02-01 06:24:36 +00003506load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003507{
3508 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3509 int i, len;
3510 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003513
Tim Peters0bc93f52003-02-02 18:29:33 +00003514 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 if (len < 2) return bad_readline();
3516 module_name = PyString_FromStringAndSize(s, len - 1);
3517 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003518
Tim Peters0bc93f52003-02-02 18:29:33 +00003519 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003520 if (len < 2) return bad_readline();
3521 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003522 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 self->find_class);
3524 Py_DECREF(class_name);
3525 }
3526 }
3527 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003529 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531 if ((tup=Pdata_popTuple(self->stack, i))) {
3532 obj = Instance_New(class, tup);
3533 Py_DECREF(tup);
3534 }
3535 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003537 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003539 PDATA_PUSH(self->stack, obj, -1);
3540 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541}
3542
3543
3544static int
Tim Peterscba30e22003-02-01 06:24:36 +00003545load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546{
3547 PyObject *class = 0, *module_name = 0, *class_name = 0;
3548 int len;
3549 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Tim Peters0bc93f52003-02-02 18:29:33 +00003551 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if (len < 2) return bad_readline();
3553 module_name = PyString_FromStringAndSize(s, len - 1);
3554 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003555
Tim Peters0bc93f52003-02-02 18:29:33 +00003556 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003557 if (len < 2) {
3558 Py_DECREF(module_name);
3559 return bad_readline();
3560 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003562 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003563 self->find_class);
3564 Py_DECREF(class_name);
3565 }
3566 }
3567 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003569 if (! class) return -1;
3570 PDATA_PUSH(self->stack, class, -1);
3571 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572}
3573
3574
3575static int
Tim Peterscba30e22003-02-01 06:24:36 +00003576load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003577{
3578 PyObject *pid = 0;
3579 int len;
3580 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003583 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003584 if (len < 2) return bad_readline();
3585
3586 pid = PyString_FromStringAndSize(s, len - 1);
3587 if (!pid) return -1;
3588
3589 if (PyList_Check(self->pers_func)) {
3590 if (PyList_Append(self->pers_func, pid) < 0) {
3591 Py_DECREF(pid);
3592 return -1;
3593 }
3594 }
3595 else {
3596 ARG_TUP(self, pid);
3597 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003598 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599 NULL);
3600 FREE_ARG_TUP(self);
3601 }
3602 }
3603
3604 if (! pid) return -1;
3605
3606 PDATA_PUSH(self->stack, pid, -1);
3607 return 0;
3608 }
3609 else {
3610 PyErr_SetString(UnpicklingError,
3611 "A load persistent id instruction was encountered,\n"
3612 "but no persistent_load function was specified.");
3613 return -1;
3614 }
3615}
3616
3617static int
Tim Peterscba30e22003-02-01 06:24:36 +00003618load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619{
3620 PyObject *pid = 0;
3621
3622 if (self->pers_func) {
3623 PDATA_POP(self->stack, pid);
3624 if (! pid) return -1;
3625
3626 if (PyList_Check(self->pers_func)) {
3627 if (PyList_Append(self->pers_func, pid) < 0) {
3628 Py_DECREF(pid);
3629 return -1;
3630 }
3631 }
3632 else {
3633 ARG_TUP(self, pid);
3634 if (self->arg) {
3635 pid = PyObject_Call(self->pers_func, self->arg,
3636 NULL);
3637 FREE_ARG_TUP(self);
3638 }
3639 if (! pid) return -1;
3640 }
3641
3642 PDATA_PUSH(self->stack, pid, -1);
3643 return 0;
3644 }
3645 else {
3646 PyErr_SetString(UnpicklingError,
3647 "A load persistent id instruction was encountered,\n"
3648 "but no persistent_load function was specified.");
3649 return -1;
3650 }
3651}
3652
3653
3654static int
Tim Peterscba30e22003-02-01 06:24:36 +00003655load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003656{
3657 int len;
3658
3659 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3660
3661 /* Note that we split the (pickle.py) stack into two stacks,
3662 an object stack and a mark stack. We have to be clever and
3663 pop the right one. We do this by looking at the top of the
3664 mark stack.
3665 */
3666
3667 if ((self->num_marks > 0) &&
3668 (self->marks[self->num_marks - 1] == len))
3669 self->num_marks--;
3670 else {
3671 len--;
3672 Py_DECREF(self->stack->data[len]);
3673 self->stack->length=len;
3674 }
3675
3676 return 0;
3677}
3678
3679
3680static int
Tim Peterscba30e22003-02-01 06:24:36 +00003681load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682{
3683 int i;
3684
3685 if ((i = marker(self)) < 0)
3686 return -1;
3687
3688 Pdata_clear(self->stack, i);
3689
3690 return 0;
3691}
3692
3693
3694static int
Tim Peterscba30e22003-02-01 06:24:36 +00003695load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696{
3697 PyObject *last;
3698 int len;
3699
3700 if ((len = self->stack->length) <= 0) return stackUnderflow();
3701 last=self->stack->data[len-1];
3702 Py_INCREF(last);
3703 PDATA_PUSH(self->stack, last, -1);
3704 return 0;
3705}
3706
3707
3708static int
Tim Peterscba30e22003-02-01 06:24:36 +00003709load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710{
3711 PyObject *py_str = 0, *value = 0;
3712 int len;
3713 char *s;
3714 int rc;
3715
Tim Peters0bc93f52003-02-02 18:29:33 +00003716 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003717 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003721 value = PyDict_GetItem(self->memo, py_str);
3722 if (! value) {
3723 PyErr_SetObject(BadPickleGet, py_str);
3724 rc = -1;
3725 } else {
3726 PDATA_APPEND(self->stack, value, -1);
3727 rc = 0;
3728 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730 Py_DECREF(py_str);
3731 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003732}
3733
3734
3735static int
Tim Peterscba30e22003-02-01 06:24:36 +00003736load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737{
3738 PyObject *py_key = 0, *value = 0;
3739 unsigned char key;
3740 char *s;
3741 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742
Tim Peters0bc93f52003-02-02 18:29:33 +00003743 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 key = (unsigned char)s[0];
3746 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003748 value = PyDict_GetItem(self->memo, py_key);
3749 if (! value) {
3750 PyErr_SetObject(BadPickleGet, py_key);
3751 rc = -1;
3752 } else {
3753 PDATA_APPEND(self->stack, value, -1);
3754 rc = 0;
3755 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 Py_DECREF(py_key);
3758 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759}
3760
3761
3762static int
Tim Peterscba30e22003-02-01 06:24:36 +00003763load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764{
3765 PyObject *py_key = 0, *value = 0;
3766 unsigned char c;
3767 char *s;
3768 long key;
3769 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003770
Tim Peters0bc93f52003-02-02 18:29:33 +00003771 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 c = (unsigned char)s[0];
3774 key = (long)c;
3775 c = (unsigned char)s[1];
3776 key |= (long)c << 8;
3777 c = (unsigned char)s[2];
3778 key |= (long)c << 16;
3779 c = (unsigned char)s[3];
3780 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3783
3784 value = PyDict_GetItem(self->memo, py_key);
3785 if (! value) {
3786 PyErr_SetObject(BadPickleGet, py_key);
3787 rc = -1;
3788 } else {
3789 PDATA_APPEND(self->stack, value, -1);
3790 rc = 0;
3791 }
3792
3793 Py_DECREF(py_key);
3794 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795}
3796
Tim Peters2d629652003-02-04 05:06:17 +00003797/* Push an object from the extension registry (EXT[124]). nbytes is
3798 * the number of bytes following the opcode, holding the index (code) value.
3799 */
3800static int
3801load_extension(Unpicklerobject *self, int nbytes)
3802{
3803 char *codebytes; /* the nbytes bytes after the opcode */
3804 long code; /* calc_binint returns long */
3805 PyObject *py_code; /* code as a Python int */
3806 PyObject *obj; /* the object to push */
3807 PyObject *pair; /* (module_name, class_name) */
3808 PyObject *module_name, *class_name;
3809
3810 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3811 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3812 code = calc_binint(codebytes, nbytes);
3813 if (code <= 0) { /* note that 0 is forbidden */
3814 /* Corrupt or hostile pickle. */
3815 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3816 return -1;
3817 }
3818
3819 /* Look for the code in the cache. */
3820 py_code = PyInt_FromLong(code);
3821 if (py_code == NULL) return -1;
3822 obj = PyDict_GetItem(extension_cache, py_code);
3823 if (obj != NULL) {
3824 /* Bingo. */
3825 Py_DECREF(py_code);
3826 PDATA_APPEND(self->stack, obj, -1);
3827 return 0;
3828 }
3829
3830 /* Look up the (module_name, class_name) pair. */
3831 pair = PyDict_GetItem(inverted_registry, py_code);
3832 if (pair == NULL) {
3833 Py_DECREF(py_code);
3834 PyErr_Format(PyExc_ValueError, "unregistered extension "
3835 "code %ld", code);
3836 return -1;
3837 }
3838 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003839 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003840 */
3841 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3842 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3843 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3844 Py_DECREF(py_code);
3845 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3846 "isn't a 2-tuple of strings", code);
3847 return -1;
3848 }
3849 /* Load the object. */
3850 obj = find_class(module_name, class_name, self->find_class);
3851 if (obj == NULL) {
3852 Py_DECREF(py_code);
3853 return -1;
3854 }
3855 /* Cache code -> obj. */
3856 code = PyDict_SetItem(extension_cache, py_code, obj);
3857 Py_DECREF(py_code);
3858 if (code < 0) {
3859 Py_DECREF(obj);
3860 return -1;
3861 }
3862 PDATA_PUSH(self->stack, obj, -1);
3863 return 0;
3864}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003865
3866static int
Tim Peterscba30e22003-02-01 06:24:36 +00003867load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868{
3869 PyObject *py_str = 0, *value = 0;
3870 int len, l;
3871 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003872
Tim Peters0bc93f52003-02-02 18:29:33 +00003873 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 if (l < 2) return bad_readline();
3875 if (!( len=self->stack->length )) return stackUnderflow();
3876 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3877 value=self->stack->data[len-1];
3878 l=PyDict_SetItem(self->memo, py_str, value);
3879 Py_DECREF(py_str);
3880 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881}
3882
3883
3884static int
Tim Peterscba30e22003-02-01 06:24:36 +00003885load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886{
3887 PyObject *py_key = 0, *value = 0;
3888 unsigned char key;
3889 char *s;
3890 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003891
Tim Peters0bc93f52003-02-02 18:29:33 +00003892 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003893 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3898 value=self->stack->data[len-1];
3899 len=PyDict_SetItem(self->memo, py_key, value);
3900 Py_DECREF(py_key);
3901 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003902}
3903
3904
3905static int
Tim Peterscba30e22003-02-01 06:24:36 +00003906load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907{
3908 PyObject *py_key = 0, *value = 0;
3909 long key;
3910 unsigned char c;
3911 char *s;
3912 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Tim Peters0bc93f52003-02-02 18:29:33 +00003914 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917 c = (unsigned char)s[0];
3918 key = (long)c;
3919 c = (unsigned char)s[1];
3920 key |= (long)c << 8;
3921 c = (unsigned char)s[2];
3922 key |= (long)c << 16;
3923 c = (unsigned char)s[3];
3924 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 if (!( py_key = PyInt_FromLong(key))) return -1;
3927 value=self->stack->data[len-1];
3928 len=PyDict_SetItem(self->memo, py_key, value);
3929 Py_DECREF(py_key);
3930 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931}
3932
3933
3934static int
Tim Peterscba30e22003-02-01 06:24:36 +00003935do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936{
3937 PyObject *value = 0, *list = 0, *append_method = 0;
3938 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 len=self->stack->length;
3941 if (!( len >= x && x > 0 )) return stackUnderflow();
3942 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003943 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 if (PyList_Check(list)) {
3948 PyObject *slice;
3949 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 slice=Pdata_popList(self->stack, x);
3952 list_len = PyList_GET_SIZE(list);
3953 i=PyList_SetSlice(list, list_len, list_len, slice);
3954 Py_DECREF(slice);
3955 return i;
3956 }
3957 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958
Tim Peterscba30e22003-02-01 06:24:36 +00003959 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 return -1;
3961
3962 for (i = x; i < len; i++) {
3963 PyObject *junk;
3964
3965 value=self->stack->data[i];
3966 junk=0;
3967 ARG_TUP(self, value);
3968 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003969 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970 NULL);
3971 FREE_ARG_TUP(self);
3972 }
3973 if (! junk) {
3974 Pdata_clear(self->stack, i+1);
3975 self->stack->length=x;
3976 Py_DECREF(append_method);
3977 return -1;
3978 }
3979 Py_DECREF(junk);
3980 }
3981 self->stack->length=x;
3982 Py_DECREF(append_method);
3983 }
3984
3985 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986}
3987
3988
3989static int
Tim Peterscba30e22003-02-01 06:24:36 +00003990load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991{
3992 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993}
3994
3995
3996static int
Tim Peterscba30e22003-02-01 06:24:36 +00003997load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998{
3999 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000}
4001
4002
4003static int
Tim Peterscba30e22003-02-01 06:24:36 +00004004do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004005{
4006 PyObject *value = 0, *key = 0, *dict = 0;
4007 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 if (!( (len=self->stack->length) >= x
4010 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004012 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 for (i = x+1; i < len; i += 2) {
4015 key =self->stack->data[i-1];
4016 value=self->stack->data[i ];
4017 if (PyObject_SetItem(dict, key, value) < 0) {
4018 r=-1;
4019 break;
4020 }
4021 }
4022
4023 Pdata_clear(self->stack, x);
4024
4025 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004026}
4027
4028
Tim Peters84e87f32001-03-17 04:50:51 +00004029static int
Tim Peterscba30e22003-02-01 06:24:36 +00004030load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031{
4032 return do_setitems(self, self->stack->length - 2);
4033}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035static int
Tim Peterscba30e22003-02-01 06:24:36 +00004036load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037{
4038 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039}
4040
Tim Peters84e87f32001-03-17 04:50:51 +00004041
Guido van Rossum60456fd1997-04-09 17:36:32 +00004042static int
Tim Peterscba30e22003-02-01 06:24:36 +00004043load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044{
4045 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
4046 *junk = 0, *__setstate__ = 0;
4047 int i, r = 0;
4048
4049 if (self->stack->length < 2) return stackUnderflow();
4050 PDATA_POP(self->stack, value);
4051 if (! value) return -1;
4052 inst=self->stack->data[self->stack->length-1];
4053
4054 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
4055 ARG_TUP(self, value);
4056 if (self->arg) {
4057 junk = PyObject_Call(__setstate__, self->arg, NULL);
4058 FREE_ARG_TUP(self);
4059 }
4060 Py_DECREF(__setstate__);
4061 if (! junk) return -1;
4062 Py_DECREF(junk);
4063 return 0;
4064 }
4065
4066 PyErr_Clear();
4067 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
4068 i = 0;
4069 while (PyDict_Next(value, &i, &d_key, &d_value)) {
4070 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
4071 r=-1;
4072 break;
4073 }
4074 }
4075 Py_DECREF(instdict);
4076 }
4077 else r=-1;
4078
4079 Py_XDECREF(value);
4080
4081 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004082}
4083
4084
4085static int
Tim Peterscba30e22003-02-01 06:24:36 +00004086load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087{
4088 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 /* Note that we split the (pickle.py) stack into two stacks, an
4091 object stack and a mark stack. Here we push a mark onto the
4092 mark stack.
4093 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 if ((self->num_marks + 1) >= self->marks_size) {
4096 s=self->marks_size+20;
4097 if (s <= self->num_marks) s=self->num_marks + 1;
4098 if (self->marks == NULL)
4099 self->marks=(int *)malloc(s * sizeof(int));
4100 else
Tim Peterscba30e22003-02-01 06:24:36 +00004101 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004102 s * sizeof(int));
4103 if (! self->marks) {
4104 PyErr_NoMemory();
4105 return -1;
4106 }
4107 self->marks_size = s;
4108 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004113}
4114
Guido van Rossum60456fd1997-04-09 17:36:32 +00004115static int
Tim Peterscba30e22003-02-01 06:24:36 +00004116load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117{
4118 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 PDATA_POP(self->stack, arg_tup);
4121 if (! arg_tup) return -1;
4122 PDATA_POP(self->stack, callable);
4123 if (callable) {
4124 ob = Instance_New(callable, arg_tup);
4125 Py_DECREF(callable);
4126 }
4127 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004129 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 PDATA_PUSH(self->stack, ob, -1);
4132 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004133}
Tim Peters84e87f32001-03-17 04:50:51 +00004134
Tim Peters4190fb82003-02-02 16:09:05 +00004135/* Just raises an error if we don't know the protocol specified. PROTO
4136 * is the first opcode for protocols >= 2.
4137 */
4138static int
4139load_proto(Unpicklerobject *self)
4140{
4141 int i;
4142 char *protobyte;
4143
4144 i = self->read_func(self, &protobyte, 1);
4145 if (i < 0)
4146 return -1;
4147
4148 i = calc_binint(protobyte, 1);
4149 /* No point checking for < 0, since calc_binint returns an unsigned
4150 * int when chewing on 1 byte.
4151 */
4152 assert(i >= 0);
4153 if (i <= CURRENT_PROTOCOL_NUMBER)
4154 return 0;
4155
4156 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4157 return -1;
4158}
4159
Guido van Rossum60456fd1997-04-09 17:36:32 +00004160static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004161load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162{
4163 PyObject *err = 0, *val = 0;
4164 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004166 self->num_marks = 0;
4167 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004170 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004171 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173 switch (s[0]) {
4174 case NONE:
4175 if (load_none(self) < 0)
4176 break;
4177 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 case BININT:
4180 if (load_binint(self) < 0)
4181 break;
4182 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case BININT1:
4185 if (load_binint1(self) < 0)
4186 break;
4187 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case BININT2:
4190 if (load_binint2(self) < 0)
4191 break;
4192 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case INT:
4195 if (load_int(self) < 0)
4196 break;
4197 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case LONG:
4200 if (load_long(self) < 0)
4201 break;
4202 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004203
Tim Petersee1a53c2003-02-02 02:57:53 +00004204 case LONG1:
4205 if (load_counted_long(self, 1) < 0)
4206 break;
4207 continue;
4208
4209 case LONG4:
4210 if (load_counted_long(self, 4) < 0)
4211 break;
4212 continue;
4213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case FLOAT:
4215 if (load_float(self) < 0)
4216 break;
4217 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case BINFLOAT:
4220 if (load_binfloat(self) < 0)
4221 break;
4222 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 case BINSTRING:
4225 if (load_binstring(self) < 0)
4226 break;
4227 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 case SHORT_BINSTRING:
4230 if (load_short_binstring(self) < 0)
4231 break;
4232 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 case STRING:
4235 if (load_string(self) < 0)
4236 break;
4237 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004238
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004239#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 case UNICODE:
4241 if (load_unicode(self) < 0)
4242 break;
4243 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case BINUNICODE:
4246 if (load_binunicode(self) < 0)
4247 break;
4248 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004249#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004252 if (load_counted_tuple(self, 0) < 0)
4253 break;
4254 continue;
4255
4256 case TUPLE1:
4257 if (load_counted_tuple(self, 1) < 0)
4258 break;
4259 continue;
4260
4261 case TUPLE2:
4262 if (load_counted_tuple(self, 2) < 0)
4263 break;
4264 continue;
4265
4266 case TUPLE3:
4267 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 break;
4269 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004271 case TUPLE:
4272 if (load_tuple(self) < 0)
4273 break;
4274 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276 case EMPTY_LIST:
4277 if (load_empty_list(self) < 0)
4278 break;
4279 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 case LIST:
4282 if (load_list(self) < 0)
4283 break;
4284 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004286 case EMPTY_DICT:
4287 if (load_empty_dict(self) < 0)
4288 break;
4289 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 case DICT:
4292 if (load_dict(self) < 0)
4293 break;
4294 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 case OBJ:
4297 if (load_obj(self) < 0)
4298 break;
4299 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004301 case INST:
4302 if (load_inst(self) < 0)
4303 break;
4304 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306 case GLOBAL:
4307 if (load_global(self) < 0)
4308 break;
4309 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 case APPEND:
4312 if (load_append(self) < 0)
4313 break;
4314 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case APPENDS:
4317 if (load_appends(self) < 0)
4318 break;
4319 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 case BUILD:
4322 if (load_build(self) < 0)
4323 break;
4324 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326 case DUP:
4327 if (load_dup(self) < 0)
4328 break;
4329 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 case BINGET:
4332 if (load_binget(self) < 0)
4333 break;
4334 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 case LONG_BINGET:
4337 if (load_long_binget(self) < 0)
4338 break;
4339 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 case GET:
4342 if (load_get(self) < 0)
4343 break;
4344 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004345
Tim Peters2d629652003-02-04 05:06:17 +00004346 case EXT1:
4347 if (load_extension(self, 1) < 0)
4348 break;
4349 continue;
4350
4351 case EXT2:
4352 if (load_extension(self, 2) < 0)
4353 break;
4354 continue;
4355
4356 case EXT4:
4357 if (load_extension(self, 4) < 0)
4358 break;
4359 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 case MARK:
4361 if (load_mark(self) < 0)
4362 break;
4363 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004365 case BINPUT:
4366 if (load_binput(self) < 0)
4367 break;
4368 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 case LONG_BINPUT:
4371 if (load_long_binput(self) < 0)
4372 break;
4373 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 case PUT:
4376 if (load_put(self) < 0)
4377 break;
4378 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 case POP:
4381 if (load_pop(self) < 0)
4382 break;
4383 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 case POP_MARK:
4386 if (load_pop_mark(self) < 0)
4387 break;
4388 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390 case SETITEM:
4391 if (load_setitem(self) < 0)
4392 break;
4393 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 case SETITEMS:
4396 if (load_setitems(self) < 0)
4397 break;
4398 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 case STOP:
4401 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 case PERSID:
4404 if (load_persid(self) < 0)
4405 break;
4406 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004408 case BINPERSID:
4409 if (load_binpersid(self) < 0)
4410 break;
4411 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 case REDUCE:
4414 if (load_reduce(self) < 0)
4415 break;
4416 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004417
Tim Peters4190fb82003-02-02 16:09:05 +00004418 case PROTO:
4419 if (load_proto(self) < 0)
4420 break;
4421 continue;
4422
Tim Peters3c67d792003-02-02 17:59:11 +00004423 case NEWTRUE:
4424 if (load_bool(self, Py_True) < 0)
4425 break;
4426 continue;
4427
4428 case NEWFALSE:
4429 if (load_bool(self, Py_False) < 0)
4430 break;
4431 continue;
4432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 case '\0':
4434 /* end of file */
4435 PyErr_SetNone(PyExc_EOFError);
4436 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004439 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 "invalid load key, '%s'.",
4441 "c", s[0]);
4442 return NULL;
4443 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 break;
4446 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 if ((err = PyErr_Occurred())) {
4449 if (err == PyExc_EOFError) {
4450 PyErr_SetNone(PyExc_EOFError);
4451 }
4452 return NULL;
4453 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 PDATA_POP(self->stack, val);
4456 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004457}
Tim Peters84e87f32001-03-17 04:50:51 +00004458
Guido van Rossum60456fd1997-04-09 17:36:32 +00004459
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004460/* No-load functions to support noload, which is used to
4461 find persistent references. */
4462
4463static int
Tim Peterscba30e22003-02-01 06:24:36 +00004464noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465{
4466 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468 if ((i = marker(self)) < 0) return -1;
4469 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004470}
4471
4472
4473static int
Tim Peterscba30e22003-02-01 06:24:36 +00004474noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475{
4476 int i;
4477 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 if ((i = marker(self)) < 0) return -1;
4480 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004481 if (self->readline_func(self, &s) < 0) return -1;
4482 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004483 PDATA_APPEND(self->stack, Py_None,-1);
4484 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004485}
4486
4487static int
Tim Peterscba30e22003-02-01 06:24:36 +00004488noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489{
4490 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004491
Tim Peters0bc93f52003-02-02 18:29:33 +00004492 if (self->readline_func(self, &s) < 0) return -1;
4493 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 PDATA_APPEND(self->stack, Py_None,-1);
4495 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004496}
4497
4498static int
Tim Peterscba30e22003-02-01 06:24:36 +00004499noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 if (self->stack->length < 2) return stackUnderflow();
4503 Pdata_clear(self->stack, self->stack->length-2);
4504 PDATA_APPEND(self->stack, Py_None,-1);
4505 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004506}
4507
4508static int
4509noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004510
Guido van Rossum053b8df1998-11-25 16:18:00 +00004511 if (self->stack->length < 1) return stackUnderflow();
4512 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004513 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004514}
4515
Tim Peters2d629652003-02-04 05:06:17 +00004516static int
4517noload_extension(Unpicklerobject *self, int nbytes)
4518{
4519 char *codebytes;
4520
4521 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4522 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4523 PDATA_APPEND(self->stack, Py_None, -1);
4524 return 0;
4525}
4526
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004527
4528static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004529noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530{
4531 PyObject *err = 0, *val = 0;
4532 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 self->num_marks = 0;
4535 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004538 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 switch (s[0]) {
4542 case NONE:
4543 if (load_none(self) < 0)
4544 break;
4545 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 case BININT:
4548 if (load_binint(self) < 0)
4549 break;
4550 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 case BININT1:
4553 if (load_binint1(self) < 0)
4554 break;
4555 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 case BININT2:
4558 if (load_binint2(self) < 0)
4559 break;
4560 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 case INT:
4563 if (load_int(self) < 0)
4564 break;
4565 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 case LONG:
4568 if (load_long(self) < 0)
4569 break;
4570 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004571
Tim Peters4190fb82003-02-02 16:09:05 +00004572 case LONG1:
4573 if (load_counted_long(self, 1) < 0)
4574 break;
4575 continue;
4576
4577 case LONG4:
4578 if (load_counted_long(self, 4) < 0)
4579 break;
4580 continue;
4581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 case FLOAT:
4583 if (load_float(self) < 0)
4584 break;
4585 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 case BINFLOAT:
4588 if (load_binfloat(self) < 0)
4589 break;
4590 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 case BINSTRING:
4593 if (load_binstring(self) < 0)
4594 break;
4595 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 case SHORT_BINSTRING:
4598 if (load_short_binstring(self) < 0)
4599 break;
4600 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 case STRING:
4603 if (load_string(self) < 0)
4604 break;
4605 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004606
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004607#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 case UNICODE:
4609 if (load_unicode(self) < 0)
4610 break;
4611 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 case BINUNICODE:
4614 if (load_binunicode(self) < 0)
4615 break;
4616 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004617#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004620 if (load_counted_tuple(self, 0) < 0)
4621 break;
4622 continue;
4623
4624 case TUPLE1:
4625 if (load_counted_tuple(self, 1) < 0)
4626 break;
4627 continue;
4628
4629 case TUPLE2:
4630 if (load_counted_tuple(self, 2) < 0)
4631 break;
4632 continue;
4633
4634 case TUPLE3:
4635 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004636 break;
4637 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004639 case TUPLE:
4640 if (load_tuple(self) < 0)
4641 break;
4642 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644 case EMPTY_LIST:
4645 if (load_empty_list(self) < 0)
4646 break;
4647 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004649 case LIST:
4650 if (load_list(self) < 0)
4651 break;
4652 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004654 case EMPTY_DICT:
4655 if (load_empty_dict(self) < 0)
4656 break;
4657 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659 case DICT:
4660 if (load_dict(self) < 0)
4661 break;
4662 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664 case OBJ:
4665 if (noload_obj(self) < 0)
4666 break;
4667 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 case INST:
4670 if (noload_inst(self) < 0)
4671 break;
4672 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 case GLOBAL:
4675 if (noload_global(self) < 0)
4676 break;
4677 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 case APPEND:
4680 if (load_append(self) < 0)
4681 break;
4682 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 case APPENDS:
4685 if (load_appends(self) < 0)
4686 break;
4687 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 case BUILD:
4690 if (noload_build(self) < 0)
4691 break;
4692 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 case DUP:
4695 if (load_dup(self) < 0)
4696 break;
4697 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004699 case BINGET:
4700 if (load_binget(self) < 0)
4701 break;
4702 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704 case LONG_BINGET:
4705 if (load_long_binget(self) < 0)
4706 break;
4707 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709 case GET:
4710 if (load_get(self) < 0)
4711 break;
4712 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004713
Tim Peters2d629652003-02-04 05:06:17 +00004714 case EXT1:
4715 if (noload_extension(self, 1) < 0)
4716 break;
4717 continue;
4718
4719 case EXT2:
4720 if (noload_extension(self, 2) < 0)
4721 break;
4722 continue;
4723
4724 case EXT4:
4725 if (noload_extension(self, 4) < 0)
4726 break;
4727 continue;
4728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 case MARK:
4730 if (load_mark(self) < 0)
4731 break;
4732 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 case BINPUT:
4735 if (load_binput(self) < 0)
4736 break;
4737 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 case LONG_BINPUT:
4740 if (load_long_binput(self) < 0)
4741 break;
4742 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004744 case PUT:
4745 if (load_put(self) < 0)
4746 break;
4747 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 case POP:
4750 if (load_pop(self) < 0)
4751 break;
4752 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 case POP_MARK:
4755 if (load_pop_mark(self) < 0)
4756 break;
4757 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 case SETITEM:
4760 if (load_setitem(self) < 0)
4761 break;
4762 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 case SETITEMS:
4765 if (load_setitems(self) < 0)
4766 break;
4767 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 case STOP:
4770 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 case PERSID:
4773 if (load_persid(self) < 0)
4774 break;
4775 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 case BINPERSID:
4778 if (load_binpersid(self) < 0)
4779 break;
4780 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 case REDUCE:
4783 if (noload_reduce(self) < 0)
4784 break;
4785 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004786
Tim Peters4190fb82003-02-02 16:09:05 +00004787 case PROTO:
4788 if (load_proto(self) < 0)
4789 break;
4790 continue;
4791
Tim Peters3c67d792003-02-02 17:59:11 +00004792 case NEWTRUE:
4793 if (load_bool(self, Py_True) < 0)
4794 break;
4795 continue;
4796
4797 case NEWFALSE:
4798 if (load_bool(self, Py_False) < 0)
4799 break;
4800 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004802 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 "invalid load key, '%s'.",
4804 "c", s[0]);
4805 return NULL;
4806 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 break;
4809 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 if ((err = PyErr_Occurred())) {
4812 if (err == PyExc_EOFError) {
4813 PyErr_SetNone(PyExc_EOFError);
4814 }
4815 return NULL;
4816 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 PDATA_POP(self->stack, val);
4819 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004820}
Tim Peters84e87f32001-03-17 04:50:51 +00004821
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004822
Guido van Rossum60456fd1997-04-09 17:36:32 +00004823static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004824Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825{
Tim Peterscba30e22003-02-01 06:24:36 +00004826 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004830}
4831
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004832static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004833Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834{
Tim Peterscba30e22003-02-01 06:24:36 +00004835 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004839}
4840
Guido van Rossum60456fd1997-04-09 17:36:32 +00004841
4842static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004843 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004844 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004845 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004846 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004847 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004848 "noload() -- not load a pickle, but go through most of the motions\n"
4849 "\n"
4850 "This function can be used to read past a pickle without instantiating\n"
4851 "any objects or importing any modules. It can also be used to find all\n"
4852 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004853 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004854 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004855 {NULL, NULL} /* sentinel */
4856};
4857
4858
4859static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004860newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004861{
4862 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004863
Tim Peterscba30e22003-02-01 06:24:36 +00004864 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004865 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 self->file = NULL;
4868 self->arg = NULL;
4869 self->stack = (Pdata*)Pdata_New();
4870 self->pers_func = NULL;
4871 self->last_string = NULL;
4872 self->marks = NULL;
4873 self->num_marks = 0;
4874 self->marks_size = 0;
4875 self->buf_size = 0;
4876 self->read = NULL;
4877 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004879
Tim Peterscba30e22003-02-01 06:24:36 +00004880 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004881 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 Py_INCREF(f);
4884 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004886 /* Set read, readline based on type of f */
4887 if (PyFile_Check(f)) {
4888 self->fp = PyFile_AsFile(f);
4889 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004890 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004891 "I/O operation on closed file");
4892 goto err;
4893 }
4894 self->read_func = read_file;
4895 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004896 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 else if (PycStringIO_InputCheck(f)) {
4898 self->fp = NULL;
4899 self->read_func = read_cStringIO;
4900 self->readline_func = readline_cStringIO;
4901 }
4902 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004904 self->fp = NULL;
4905 self->read_func = read_other;
4906 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4909 (self->read = PyObject_GetAttr(f, read_str)))) {
4910 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004911 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 "argument must have 'read' and "
4913 "'readline' attributes" );
4914 goto err;
4915 }
4916 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004920 err:
4921 Py_DECREF((PyObject *)self);
4922 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004923}
4924
4925
4926static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004927get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004928{
4929 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004930
Tim Peterscba30e22003-02-01 06:24:36 +00004931 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932 return NULL;
4933 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004934}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004935
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004936
Guido van Rossum60456fd1997-04-09 17:36:32 +00004937static void
Tim Peterscba30e22003-02-01 06:24:36 +00004938Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004939{
4940 Py_XDECREF(self->readline);
4941 Py_XDECREF(self->read);
4942 Py_XDECREF(self->file);
4943 Py_XDECREF(self->memo);
4944 Py_XDECREF(self->stack);
4945 Py_XDECREF(self->pers_func);
4946 Py_XDECREF(self->arg);
4947 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949 if (self->marks) {
4950 free(self->marks);
4951 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 if (self->buf_size) {
4954 free(self->buf);
4955 }
Tim Peters84e87f32001-03-17 04:50:51 +00004956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004957 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004958}
4959
4960
4961static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004962Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963{
4964 if (!strcmp(name, "persistent_load")) {
4965 if (!self->pers_func) {
4966 PyErr_SetString(PyExc_AttributeError, name);
4967 return NULL;
4968 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 Py_INCREF(self->pers_func);
4971 return self->pers_func;
4972 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004974 if (!strcmp(name, "find_global")) {
4975 if (!self->find_class) {
4976 PyErr_SetString(PyExc_AttributeError, name);
4977 return NULL;
4978 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004980 Py_INCREF(self->find_class);
4981 return self->find_class;
4982 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004984 if (!strcmp(name, "memo")) {
4985 if (!self->memo) {
4986 PyErr_SetString(PyExc_AttributeError, name);
4987 return NULL;
4988 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 Py_INCREF(self->memo);
4991 return self->memo;
4992 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004994 if (!strcmp(name, "UnpicklingError")) {
4995 Py_INCREF(UnpicklingError);
4996 return UnpicklingError;
4997 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004999 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005000}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005001
Guido van Rossum60456fd1997-04-09 17:36:32 +00005002
5003static int
Tim Peterscba30e22003-02-01 06:24:36 +00005004Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005005{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007 if (!strcmp(name, "persistent_load")) {
5008 Py_XDECREF(self->pers_func);
5009 self->pers_func = value;
5010 Py_XINCREF(value);
5011 return 0;
5012 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014 if (!strcmp(name, "find_global")) {
5015 Py_XDECREF(self->find_class);
5016 self->find_class = value;
5017 Py_XINCREF(value);
5018 return 0;
5019 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 if (! value) {
5022 PyErr_SetString(PyExc_TypeError,
5023 "attribute deletion is not supported");
5024 return -1;
5025 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005027 if (strcmp(name, "memo") == 0) {
5028 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005029 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005030 "memo must be a dictionary");
5031 return -1;
5032 }
5033 Py_XDECREF(self->memo);
5034 self->memo = value;
5035 Py_INCREF(value);
5036 return 0;
5037 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005039 PyErr_SetString(PyExc_AttributeError, name);
5040 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005041}
5042
Tim Peters5bd2a792003-02-01 16:45:06 +00005043/* ---------------------------------------------------------------------------
5044 * Module-level functions.
5045 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005046
Tim Peters5bd2a792003-02-01 16:45:06 +00005047/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005048static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005049cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005050{
5051 PyObject *ob, *file, *res = NULL;
5052 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005053 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005054
Tim Peters5bd2a792003-02-01 16:45:06 +00005055 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005057
Tim Peters5bd2a792003-02-01 16:45:06 +00005058 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 if (dump(pickler, ob) < 0)
5062 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 Py_INCREF(Py_None);
5065 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067 finally:
5068 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005070 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005071}
5072
5073
Tim Peters5bd2a792003-02-01 16:45:06 +00005074/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005075static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005076cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005077{
5078 PyObject *ob, *file = 0, *res = NULL;
5079 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005080 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005081
Tim Peters5bd2a792003-02-01 16:45:06 +00005082 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005083 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005084
Tim Peterscba30e22003-02-01 06:24:36 +00005085 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005087
Tim Peters5bd2a792003-02-01 16:45:06 +00005088 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005091 if (dump(pickler, ob) < 0)
5092 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005094 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005096 finally:
5097 Py_XDECREF(pickler);
5098 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005101}
5102
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005103
Tim Peters5bd2a792003-02-01 16:45:06 +00005104/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005105static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005106cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107{
5108 Unpicklerobject *unpickler = 0;
5109 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005110
Tim Peterscba30e22003-02-01 06:24:36 +00005111 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005113
Tim Peterscba30e22003-02-01 06:24:36 +00005114 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005115 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 finally:
5120 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005122 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005123}
5124
5125
Tim Peters5bd2a792003-02-01 16:45:06 +00005126/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005127static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005128cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129{
5130 PyObject *ob, *file = 0, *res = NULL;
5131 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005132
Tim Peterscba30e22003-02-01 06:24:36 +00005133 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005134 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005135
Tim Peterscba30e22003-02-01 06:24:36 +00005136 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005137 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005138
Tim Peterscba30e22003-02-01 06:24:36 +00005139 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005140 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005142 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 finally:
5145 Py_XDECREF(file);
5146 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005149}
5150
5151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005152PyDoc_STRVAR(Unpicklertype__doc__,
5153"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005154
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005155static PyTypeObject Unpicklertype = {
5156 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00005157 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00005158 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00005159 sizeof(Unpicklerobject), /*tp_basicsize*/
5160 0, /*tp_itemsize*/
5161 /* methods */
5162 (destructor)Unpickler_dealloc, /*tp_dealloc*/
5163 (printfunc)0, /*tp_print*/
5164 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
5165 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
5166 (cmpfunc)0, /*tp_compare*/
5167 (reprfunc)0, /*tp_repr*/
5168 0, /*tp_as_number*/
5169 0, /*tp_as_sequence*/
5170 0, /*tp_as_mapping*/
5171 (hashfunc)0, /*tp_hash*/
5172 (ternaryfunc)0, /*tp_call*/
5173 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005174
Guido van Rossum60456fd1997-04-09 17:36:32 +00005175 /* Space for future expansion */
5176 0L,0L,0L,0L,
5177 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005178};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005179
Guido van Rossum60456fd1997-04-09 17:36:32 +00005180static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005181 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005182 PyDoc_STR("dump(object, file, proto=0) -- "
5183 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005184 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005185 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005186 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005187
Neal Norwitzb0493252002-03-31 14:44:22 +00005188 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005189 PyDoc_STR("dumps(object, proto=0) -- "
5190 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005191 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005192 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005193 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005194
Neal Norwitzb0493252002-03-31 14:44:22 +00005195 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005196 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005197
Neal Norwitzb0493252002-03-31 14:44:22 +00005198 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005199 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005200
Neal Norwitzb0493252002-03-31 14:44:22 +00005201 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005202 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005203 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005204 "This takes a file-like object for writing a pickle data stream.\n"
5205 "The optional proto argument tells the pickler to use the given\n"
5206 "protocol; supported protocols are 0, 1, 2. The default\n"
5207 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5208 "only protocol that can be written to a file opened in text\n"
5209 "mode and read back successfully. When using a protocol higher\n"
5210 "than 0, make sure the file is opened in binary mode, both when\n"
5211 "pickling and unpickling.)\n"
5212 "\n"
5213 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5214 "more efficient than protocol 1.\n"
5215 "\n"
5216 "Specifying a negative protocol version selects the highest\n"
5217 "protocol version supported. The higher the protocol used, the\n"
5218 "more recent the version of Python needed to read the pickle\n"
5219 "produced.\n"
5220 "\n"
5221 "The file parameter must have a write() method that accepts a single\n"
5222 "string argument. It can thus be an open file object, a StringIO\n"
5223 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005224 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005225
Neal Norwitzb0493252002-03-31 14:44:22 +00005226 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005227 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5228
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005229 { NULL, NULL }
5230};
5231
Guido van Rossum60456fd1997-04-09 17:36:32 +00005232static int
Tim Peterscba30e22003-02-01 06:24:36 +00005233init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005234{
5235 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005236
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005237#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 INIT_STR(__class__);
5240 INIT_STR(__getinitargs__);
5241 INIT_STR(__dict__);
5242 INIT_STR(__getstate__);
5243 INIT_STR(__setstate__);
5244 INIT_STR(__name__);
5245 INIT_STR(__main__);
5246 INIT_STR(__reduce__);
5247 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 INIT_STR(append);
5249 INIT_STR(read);
5250 INIT_STR(readline);
5251 INIT_STR(copy_reg);
5252 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005254
Tim Peterscba30e22003-02-01 06:24:36 +00005255 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005256 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Tim Peters1f1b2d22003-02-01 02:16:37 +00005258 /* This is special because we want to use a different
5259 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005260 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005261 if (!dispatch_table) return -1;
5262
5263 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005264 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005265 if (!extension_registry) return -1;
5266
5267 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005268 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005269 if (!inverted_registry) return -1;
5270
5271 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005272 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005273 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005275 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005276
Tim Peters731098b2003-02-04 20:56:09 +00005277 if (!(empty_tuple = PyTuple_New(0)))
5278 return -1;
5279
5280 two_tuple = PyTuple_New(2);
5281 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005282 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005283 /* We use this temp container with no regard to refcounts, or to
5284 * keeping containees alive. Exempt from GC, because we don't
5285 * want anything looking at two_tuple() by magic.
5286 */
5287 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005289 /* Ugh */
5290 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5291 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5292 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005294 if (!( t=PyDict_New())) return -1;
5295 if (!( r=PyRun_String(
5296 "def __init__(self, *args): self.args=args\n\n"
5297 "def __str__(self):\n"
5298 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5299 Py_file_input,
5300 module_dict, t) )) return -1;
5301 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005303 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005304 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005305 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005307 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005308
Tim Peterscba30e22003-02-01 06:24:36 +00005309 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005310 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005311 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005312 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005314 if (!( t=PyDict_New())) return -1;
5315 if (!( r=PyRun_String(
5316 "def __init__(self, *args): self.args=args\n\n"
5317 "def __str__(self):\n"
5318 " a=self.args\n"
5319 " a=a and type(a[0]) or '(what)'\n"
5320 " return 'Cannot pickle %s objects' % a\n"
5321 , Py_file_input,
5322 module_dict, t) )) return -1;
5323 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005325 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005326 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005327 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005331 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005332 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005334
Martin v. Löwis658009a2002-09-16 17:26:24 +00005335 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5336 UnpicklingError, NULL)))
5337 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005339 if (PyDict_SetItemString(module_dict, "PickleError",
5340 PickleError) < 0)
5341 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005343 if (PyDict_SetItemString(module_dict, "PicklingError",
5344 PicklingError) < 0)
5345 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005347 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5348 UnpicklingError) < 0)
5349 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5352 UnpickleableError) < 0)
5353 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005355 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5356 BadPickleGet) < 0)
5357 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005359 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005361 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005362}
5363
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005364#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5365#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005366#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005367PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005368initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005369{
5370 PyObject *m, *d, *di, *v, *k;
5371 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005372 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005373 PyObject *format_version;
5374 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005376 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005377 Unpicklertype.ob_type = &PyType_Type;
5378 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005380 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005381 * so we're forced to use a temporary dictionary. :(
5382 */
5383 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005384 if (!di) return;
5385 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005387 /* Create the module and add the functions */
5388 m = Py_InitModule4("cPickle", cPickle_methods,
5389 cPickle_module_documentation,
5390 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005392 /* Add some symbolic constants to the module */
5393 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005394 v = PyString_FromString(rev);
5395 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398 /* Copy data from di. Waaa. */
5399 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5400 if (PyObject_SetItem(d, k, v) < 0) {
5401 Py_DECREF(di);
5402 return;
5403 }
5404 }
5405 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005406
Tim Peters5b7da392003-02-04 00:21:07 +00005407 /* These are purely informational; no code uses them. */
5408 /* File format version we write. */
5409 format_version = PyString_FromString("2.0");
5410 /* Format versions we can read. */
5411 compatible_formats = Py_BuildValue("[sssss]",
5412 "1.0", /* Original protocol 0 */
5413 "1.1", /* Protocol 0 + INST */
5414 "1.2", /* Original protocol 1 */
5415 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005416 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 PyDict_SetItemString(d, "format_version", format_version);
5418 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5419 Py_XDECREF(format_version);
5420 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005421}