blob: 5486524259de9698fcbdcb21d165c670472b845f [file] [log] [blame]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001#include "Python.h"
2#include "structmember.h"
3
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004PyDoc_STRVAR(pickle_module_doc,
5"Optimized C implementation for the Python pickle module.");
6
Larry Hastings61272b72014-01-07 12:41:53 -08007/*[clinic input]
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02008output preset file
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08009module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -080010class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
11class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
12class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
13class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080014[clinic start generated code]*/
15/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080016
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18enum {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010019 HIGHEST_PROTOCOL = 4,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000020 DEFAULT_PROTOCOL = 3
21};
22
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000023/* Pickle opcodes. These must be kept updated with pickle.py.
24 Extensive docs are in pickletools.py. */
25enum opcode {
26 MARK = '(',
27 STOP = '.',
28 POP = '0',
29 POP_MARK = '1',
30 DUP = '2',
31 FLOAT = 'F',
32 INT = 'I',
33 BININT = 'J',
34 BININT1 = 'K',
35 LONG = 'L',
36 BININT2 = 'M',
37 NONE = 'N',
38 PERSID = 'P',
39 BINPERSID = 'Q',
40 REDUCE = 'R',
41 STRING = 'S',
42 BINSTRING = 'T',
43 SHORT_BINSTRING = 'U',
44 UNICODE = 'V',
45 BINUNICODE = 'X',
46 APPEND = 'a',
47 BUILD = 'b',
48 GLOBAL = 'c',
49 DICT = 'd',
50 EMPTY_DICT = '}',
51 APPENDS = 'e',
52 GET = 'g',
53 BINGET = 'h',
54 INST = 'i',
55 LONG_BINGET = 'j',
56 LIST = 'l',
57 EMPTY_LIST = ']',
58 OBJ = 'o',
59 PUT = 'p',
60 BINPUT = 'q',
61 LONG_BINPUT = 'r',
62 SETITEM = 's',
63 TUPLE = 't',
64 EMPTY_TUPLE = ')',
65 SETITEMS = 'u',
66 BINFLOAT = 'G',
67
68 /* Protocol 2. */
69 PROTO = '\x80',
70 NEWOBJ = '\x81',
71 EXT1 = '\x82',
72 EXT2 = '\x83',
73 EXT4 = '\x84',
74 TUPLE1 = '\x85',
75 TUPLE2 = '\x86',
76 TUPLE3 = '\x87',
77 NEWTRUE = '\x88',
78 NEWFALSE = '\x89',
79 LONG1 = '\x8a',
80 LONG4 = '\x8b',
81
82 /* Protocol 3 (Python 3.x) */
83 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010084 SHORT_BINBYTES = 'C',
85
86 /* Protocol 4 */
87 SHORT_BINUNICODE = '\x8c',
88 BINUNICODE8 = '\x8d',
89 BINBYTES8 = '\x8e',
90 EMPTY_SET = '\x8f',
91 ADDITEMS = '\x90',
92 FROZENSET = '\x91',
93 NEWOBJ_EX = '\x92',
94 STACK_GLOBAL = '\x93',
95 MEMOIZE = '\x94',
96 FRAME = '\x95'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000097};
98
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000099enum {
100 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
101 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
102 break if this gets out of synch with pickle.py, but it's unclear that would
103 help anything either. */
104 BATCHSIZE = 1000,
105
106 /* Nesting limit until Pickler, when running in "fast mode", starts
107 checking for self-referential data-structures. */
108 FAST_NESTING_LIMIT = 50,
109
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000110 /* Initial size of the write buffer of Pickler. */
111 WRITE_BUF_SIZE = 4096,
112
Antoine Pitrou04248a82010-10-12 20:51:21 +0000113 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100114 PREFETCH = 8192 * 16,
115
116 FRAME_SIZE_TARGET = 64 * 1024,
117
118 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000119};
120
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800121/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000122
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800123/* State of the pickle module, per PEP 3121. */
124typedef struct {
125 /* Exception classes for pickle. */
126 PyObject *PickleError;
127 PyObject *PicklingError;
128 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800129
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800130 /* copyreg.dispatch_table, {type_object: pickling_function} */
131 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000132
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800133 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000134
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800135 /* copyreg._extension_registry, {(module_name, function_name): code} */
136 PyObject *extension_registry;
137 /* copyreg._extension_cache, {code: object} */
138 PyObject *extension_cache;
139 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
140 PyObject *inverted_registry;
141
142 /* Import mappings for compatibility with Python 2.x */
143
144 /* _compat_pickle.NAME_MAPPING,
145 {(oldmodule, oldname): (newmodule, newname)} */
146 PyObject *name_mapping_2to3;
147 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
148 PyObject *import_mapping_2to3;
149 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
150 PyObject *name_mapping_3to2;
151 PyObject *import_mapping_3to2;
152
153 /* codecs.encode, used for saving bytes in older protocols */
154 PyObject *codecs_encode;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800155} PickleState;
156
157/* Forward declaration of the _pickle module definition. */
158static struct PyModuleDef _picklemodule;
159
160/* Given a module object, get its per-module state. */
161static PickleState *
162_Pickle_GetState(PyObject *module)
163{
164 return (PickleState *)PyModule_GetState(module);
165}
166
167/* Find the module instance imported in the currently running sub-interpreter
168 and get its state. */
169static PickleState *
170_Pickle_GetGlobalState(void)
171{
172 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
173}
174
175/* Clear the given pickle module state. */
176static void
177_Pickle_ClearState(PickleState *st)
178{
179 Py_CLEAR(st->PickleError);
180 Py_CLEAR(st->PicklingError);
181 Py_CLEAR(st->UnpicklingError);
182 Py_CLEAR(st->dispatch_table);
183 Py_CLEAR(st->extension_registry);
184 Py_CLEAR(st->extension_cache);
185 Py_CLEAR(st->inverted_registry);
186 Py_CLEAR(st->name_mapping_2to3);
187 Py_CLEAR(st->import_mapping_2to3);
188 Py_CLEAR(st->name_mapping_3to2);
189 Py_CLEAR(st->import_mapping_3to2);
190 Py_CLEAR(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800191}
192
193/* Initialize the given pickle module state. */
194static int
195_Pickle_InitState(PickleState *st)
196{
197 PyObject *copyreg = NULL;
198 PyObject *compat_pickle = NULL;
199 PyObject *codecs = NULL;
200
201 copyreg = PyImport_ImportModule("copyreg");
202 if (!copyreg)
203 goto error;
204 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
205 if (!st->dispatch_table)
206 goto error;
207 if (!PyDict_CheckExact(st->dispatch_table)) {
208 PyErr_Format(PyExc_RuntimeError,
209 "copyreg.dispatch_table should be a dict, not %.200s",
210 Py_TYPE(st->dispatch_table)->tp_name);
211 goto error;
212 }
213 st->extension_registry = \
214 PyObject_GetAttrString(copyreg, "_extension_registry");
215 if (!st->extension_registry)
216 goto error;
217 if (!PyDict_CheckExact(st->extension_registry)) {
218 PyErr_Format(PyExc_RuntimeError,
219 "copyreg._extension_registry should be a dict, "
220 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
221 goto error;
222 }
223 st->inverted_registry = \
224 PyObject_GetAttrString(copyreg, "_inverted_registry");
225 if (!st->inverted_registry)
226 goto error;
227 if (!PyDict_CheckExact(st->inverted_registry)) {
228 PyErr_Format(PyExc_RuntimeError,
229 "copyreg._inverted_registry should be a dict, "
230 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
231 goto error;
232 }
233 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
234 if (!st->extension_cache)
235 goto error;
236 if (!PyDict_CheckExact(st->extension_cache)) {
237 PyErr_Format(PyExc_RuntimeError,
238 "copyreg._extension_cache should be a dict, "
239 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
240 goto error;
241 }
242 Py_CLEAR(copyreg);
243
244 /* Load the 2.x -> 3.x stdlib module mapping tables */
245 compat_pickle = PyImport_ImportModule("_compat_pickle");
246 if (!compat_pickle)
247 goto error;
248 st->name_mapping_2to3 = \
249 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
250 if (!st->name_mapping_2to3)
251 goto error;
252 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
253 PyErr_Format(PyExc_RuntimeError,
254 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
255 Py_TYPE(st->name_mapping_2to3)->tp_name);
256 goto error;
257 }
258 st->import_mapping_2to3 = \
259 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
260 if (!st->import_mapping_2to3)
261 goto error;
262 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
263 PyErr_Format(PyExc_RuntimeError,
264 "_compat_pickle.IMPORT_MAPPING should be a dict, "
265 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
266 goto error;
267 }
268 /* ... and the 3.x -> 2.x mapping tables */
269 st->name_mapping_3to2 = \
270 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
271 if (!st->name_mapping_3to2)
272 goto error;
273 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
274 PyErr_Format(PyExc_RuntimeError,
275 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
276 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
277 goto error;
278 }
279 st->import_mapping_3to2 = \
280 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
281 if (!st->import_mapping_3to2)
282 goto error;
283 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
284 PyErr_Format(PyExc_RuntimeError,
285 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
286 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
287 goto error;
288 }
289 Py_CLEAR(compat_pickle);
290
291 codecs = PyImport_ImportModule("codecs");
292 if (codecs == NULL)
293 goto error;
294 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
295 if (st->codecs_encode == NULL) {
296 goto error;
297 }
298 if (!PyCallable_Check(st->codecs_encode)) {
299 PyErr_Format(PyExc_RuntimeError,
300 "codecs.encode should be a callable, not %.200s",
301 Py_TYPE(st->codecs_encode)->tp_name);
302 goto error;
303 }
304 Py_CLEAR(codecs);
305
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800306 return 0;
307
308 error:
309 Py_CLEAR(copyreg);
310 Py_CLEAR(compat_pickle);
311 Py_CLEAR(codecs);
312 _Pickle_ClearState(st);
313 return -1;
314}
315
316/* Helper for calling a function with a single argument quickly.
317
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800318 This function steals the reference of the given argument. */
319static PyObject *
320_Pickle_FastCall(PyObject *func, PyObject *obj)
321{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800322 PyObject *result;
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800323 PyObject *arg_tuple = PyTuple_New(1);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800324
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800325 /* Note: this function used to reuse the argument tuple. This used to give
326 a slight performance boost with older pickle implementations where many
327 unbuffered reads occurred (thus needing many function calls).
328
329 However, this optimization was removed because it was too complicated
330 to get right. It abused the C API for tuples to mutate them which led
331 to subtle reference counting and concurrency bugs. Furthermore, the
332 introduction of protocol 4 and the prefetching optimization via peek()
333 significantly reduced the number of function calls we do. Thus, the
334 benefits became marginal at best. */
335
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800336 if (arg_tuple == NULL) {
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800337 Py_DECREF(obj);
338 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800339 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800340 PyTuple_SET_ITEM(arg_tuple, 0, obj);
341 result = PyObject_Call(func, arg_tuple, NULL);
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800342 Py_CLEAR(arg_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800343 return result;
344}
345
346/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000347
348static int
349stack_underflow(void)
350{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800351 PickleState *st = _Pickle_GetGlobalState();
352 PyErr_SetString(st->UnpicklingError, "unpickling stack underflow");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000353 return -1;
354}
355
356/* Internal data type used as the unpickling stack. */
357typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000358 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000359 PyObject **data;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000360 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000361} Pdata;
362
363static void
364Pdata_dealloc(Pdata *self)
365{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200366 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000367 while (--i >= 0) {
368 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000369 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000370 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000371 PyObject_Del(self);
372}
373
374static PyTypeObject Pdata_Type = {
375 PyVarObject_HEAD_INIT(NULL, 0)
376 "_pickle.Pdata", /*tp_name*/
377 sizeof(Pdata), /*tp_basicsize*/
378 0, /*tp_itemsize*/
379 (destructor)Pdata_dealloc, /*tp_dealloc*/
380};
381
382static PyObject *
383Pdata_New(void)
384{
385 Pdata *self;
386
387 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
388 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000389 Py_SIZE(self) = 0;
390 self->allocated = 8;
391 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000392 if (self->data)
393 return (PyObject *)self;
394 Py_DECREF(self);
395 return PyErr_NoMemory();
396}
397
398
399/* Retain only the initial clearto items. If clearto >= the current
400 * number of items, this is a (non-erroneous) NOP.
401 */
402static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200403Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000404{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200405 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000406
407 if (clearto < 0)
408 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000409 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000410 return 0;
411
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000412 while (--i >= clearto) {
413 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000414 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000415 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000416 return 0;
417}
418
419static int
420Pdata_grow(Pdata *self)
421{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000422 PyObject **data = self->data;
423 Py_ssize_t allocated = self->allocated;
424 Py_ssize_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000425
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000426 new_allocated = (allocated >> 3) + 6;
427 /* check for integer overflow */
428 if (new_allocated > PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000429 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000430 new_allocated += allocated;
431 if (new_allocated > (PY_SSIZE_T_MAX / sizeof(PyObject *)))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000432 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000433 data = PyMem_REALLOC(data, new_allocated * sizeof(PyObject *));
434 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000435 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000436
437 self->data = data;
438 self->allocated = new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000439 return 0;
440
441 nomemory:
442 PyErr_NoMemory();
443 return -1;
444}
445
446/* D is a Pdata*. Pop the topmost element and store it into V, which
447 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
448 * is raised and V is set to NULL.
449 */
450static PyObject *
451Pdata_pop(Pdata *self)
452{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800453 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000454 if (Py_SIZE(self) == 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800455 PyErr_SetString(st->UnpicklingError, "bad pickle data");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000456 return NULL;
457 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000458 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000459}
460#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
461
462static int
463Pdata_push(Pdata *self, PyObject *obj)
464{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000465 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000466 return -1;
467 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000468 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000469 return 0;
470}
471
472/* Push an object on stack, transferring its ownership to the stack. */
473#define PDATA_PUSH(D, O, ER) do { \
474 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
475
476/* Push an object on stack, adding a new reference to the object. */
477#define PDATA_APPEND(D, O, ER) do { \
478 Py_INCREF((O)); \
479 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
480
481static PyObject *
482Pdata_poptuple(Pdata *self, Py_ssize_t start)
483{
484 PyObject *tuple;
485 Py_ssize_t len, i, j;
486
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000487 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000488 tuple = PyTuple_New(len);
489 if (tuple == NULL)
490 return NULL;
491 for (i = start, j = 0; j < len; i++, j++)
492 PyTuple_SET_ITEM(tuple, j, self->data[i]);
493
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000494 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000495 return tuple;
496}
497
498static PyObject *
499Pdata_poplist(Pdata *self, Py_ssize_t start)
500{
501 PyObject *list;
502 Py_ssize_t len, i, j;
503
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000504 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000505 list = PyList_New(len);
506 if (list == NULL)
507 return NULL;
508 for (i = start, j = 0; j < len; i++, j++)
509 PyList_SET_ITEM(list, j, self->data[i]);
510
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000511 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000512 return list;
513}
514
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000515typedef struct {
516 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200517 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000518} PyMemoEntry;
519
520typedef struct {
521 Py_ssize_t mt_mask;
522 Py_ssize_t mt_used;
523 Py_ssize_t mt_allocated;
524 PyMemoEntry *mt_table;
525} PyMemoTable;
526
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000527typedef struct PicklerObject {
528 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000529 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000530 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000531 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000532 PyObject *pers_func; /* persistent_id() method, can be NULL */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100533 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000534
535 PyObject *write; /* write() method of the output stream. */
536 PyObject *output_buffer; /* Write into a local bytearray buffer before
537 flushing to the stream. */
538 Py_ssize_t output_len; /* Length of output_buffer. */
539 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000540 int proto; /* Pickle protocol number, >= 0 */
541 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100542 int framing; /* True when framing is enabled, proto >= 4 */
543 Py_ssize_t frame_start; /* Position in output_buffer where the
544 where the current frame begins. -1 if there
545 is no frame currently open. */
546
547 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000548 int fast; /* Enable fast mode if set to a true value.
549 The fast mode disable the usage of memo,
550 therefore speeding the pickling process by
551 not generating superfluous PUT opcodes. It
552 should not be used if with self-referential
553 objects. */
554 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000555 int fix_imports; /* Indicate whether Pickler should fix
556 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000557 PyObject *fast_memo;
558} PicklerObject;
559
560typedef struct UnpicklerObject {
561 PyObject_HEAD
562 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000563
564 /* The unpickler memo is just an array of PyObject *s. Using a dict
565 is unnecessary, since the keys are contiguous ints. */
566 PyObject **memo;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100567 Py_ssize_t memo_size; /* Capacity of the memo array */
568 Py_ssize_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000569
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000570 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000571
572 Py_buffer buffer;
573 char *input_buffer;
574 char *input_line;
575 Py_ssize_t input_len;
576 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000577 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100578
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000579 PyObject *read; /* read() method of the input stream. */
580 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000581 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000582
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000583 char *encoding; /* Name of the encoding to be used for
584 decoding strings pickled using Python
585 2.x. The default value is "ASCII" */
586 char *errors; /* Name of errors handling scheme to used when
587 decoding strings. The default value is
588 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500589 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000590 objects. */
591 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
592 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000593 int proto; /* Protocol of the pickle loaded. */
594 int fix_imports; /* Indicate whether Unpickler should fix
595 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000596} UnpicklerObject;
597
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200598typedef struct {
599 PyObject_HEAD
600 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
601} PicklerMemoProxyObject;
602
603typedef struct {
604 PyObject_HEAD
605 UnpicklerObject *unpickler;
606} UnpicklerMemoProxyObject;
607
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000608/* Forward declarations */
609static int save(PicklerObject *, PyObject *, int);
610static int save_reduce(PicklerObject *, PyObject *, PyObject *);
611static PyTypeObject Pickler_Type;
612static PyTypeObject Unpickler_Type;
613
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200614#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000615
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000616/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300617 A custom hashtable mapping void* to Python ints. This is used by the pickler
618 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000619 a bunch of unnecessary object creation. This makes a huge performance
620 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000621
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000622#define MT_MINSIZE 8
623#define PERTURB_SHIFT 5
624
625
626static PyMemoTable *
627PyMemoTable_New(void)
628{
629 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
630 if (memo == NULL) {
631 PyErr_NoMemory();
632 return NULL;
633 }
634
635 memo->mt_used = 0;
636 memo->mt_allocated = MT_MINSIZE;
637 memo->mt_mask = MT_MINSIZE - 1;
638 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
639 if (memo->mt_table == NULL) {
640 PyMem_FREE(memo);
641 PyErr_NoMemory();
642 return NULL;
643 }
644 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
645
646 return memo;
647}
648
649static PyMemoTable *
650PyMemoTable_Copy(PyMemoTable *self)
651{
652 Py_ssize_t i;
653 PyMemoTable *new = PyMemoTable_New();
654 if (new == NULL)
655 return NULL;
656
657 new->mt_used = self->mt_used;
658 new->mt_allocated = self->mt_allocated;
659 new->mt_mask = self->mt_mask;
660 /* The table we get from _New() is probably smaller than we wanted.
661 Free it and allocate one that's the right size. */
662 PyMem_FREE(new->mt_table);
663 new->mt_table = PyMem_MALLOC(self->mt_allocated * sizeof(PyMemoEntry));
664 if (new->mt_table == NULL) {
665 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200666 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000667 return NULL;
668 }
669 for (i = 0; i < self->mt_allocated; i++) {
670 Py_XINCREF(self->mt_table[i].me_key);
671 }
672 memcpy(new->mt_table, self->mt_table,
673 sizeof(PyMemoEntry) * self->mt_allocated);
674
675 return new;
676}
677
678static Py_ssize_t
679PyMemoTable_Size(PyMemoTable *self)
680{
681 return self->mt_used;
682}
683
684static int
685PyMemoTable_Clear(PyMemoTable *self)
686{
687 Py_ssize_t i = self->mt_allocated;
688
689 while (--i >= 0) {
690 Py_XDECREF(self->mt_table[i].me_key);
691 }
692 self->mt_used = 0;
693 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
694 return 0;
695}
696
697static void
698PyMemoTable_Del(PyMemoTable *self)
699{
700 if (self == NULL)
701 return;
702 PyMemoTable_Clear(self);
703
704 PyMem_FREE(self->mt_table);
705 PyMem_FREE(self);
706}
707
708/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
709 can be considerably simpler than dictobject.c's lookdict(). */
710static PyMemoEntry *
711_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
712{
713 size_t i;
714 size_t perturb;
715 size_t mask = (size_t)self->mt_mask;
716 PyMemoEntry *table = self->mt_table;
717 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000718 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000719
720 i = hash & mask;
721 entry = &table[i];
722 if (entry->me_key == NULL || entry->me_key == key)
723 return entry;
724
725 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
726 i = (i << 2) + i + perturb + 1;
727 entry = &table[i & mask];
728 if (entry->me_key == NULL || entry->me_key == key)
729 return entry;
730 }
731 assert(0); /* Never reached */
732 return NULL;
733}
734
735/* Returns -1 on failure, 0 on success. */
736static int
737_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
738{
739 PyMemoEntry *oldtable = NULL;
740 PyMemoEntry *oldentry, *newentry;
741 Py_ssize_t new_size = MT_MINSIZE;
742 Py_ssize_t to_process;
743
744 assert(min_size > 0);
745
746 /* Find the smallest valid table size >= min_size. */
747 while (new_size < min_size && new_size > 0)
748 new_size <<= 1;
749 if (new_size <= 0) {
750 PyErr_NoMemory();
751 return -1;
752 }
753 /* new_size needs to be a power of two. */
754 assert((new_size & (new_size - 1)) == 0);
755
756 /* Allocate new table. */
757 oldtable = self->mt_table;
758 self->mt_table = PyMem_MALLOC(new_size * sizeof(PyMemoEntry));
759 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200760 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000761 PyErr_NoMemory();
762 return -1;
763 }
764 self->mt_allocated = new_size;
765 self->mt_mask = new_size - 1;
766 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
767
768 /* Copy entries from the old table. */
769 to_process = self->mt_used;
770 for (oldentry = oldtable; to_process > 0; oldentry++) {
771 if (oldentry->me_key != NULL) {
772 to_process--;
773 /* newentry is a pointer to a chunk of the new
774 mt_table, so we're setting the key:value pair
775 in-place. */
776 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
777 newentry->me_key = oldentry->me_key;
778 newentry->me_value = oldentry->me_value;
779 }
780 }
781
782 /* Deallocate the old table. */
783 PyMem_FREE(oldtable);
784 return 0;
785}
786
787/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200788static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000789PyMemoTable_Get(PyMemoTable *self, PyObject *key)
790{
791 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
792 if (entry->me_key == NULL)
793 return NULL;
794 return &entry->me_value;
795}
796
797/* Returns -1 on failure, 0 on success. */
798static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200799PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000800{
801 PyMemoEntry *entry;
802
803 assert(key != NULL);
804
805 entry = _PyMemoTable_Lookup(self, key);
806 if (entry->me_key != NULL) {
807 entry->me_value = value;
808 return 0;
809 }
810 Py_INCREF(key);
811 entry->me_key = key;
812 entry->me_value = value;
813 self->mt_used++;
814
815 /* If we added a key, we can safely resize. Otherwise just return!
816 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
817 *
818 * Quadrupling the size improves average table sparseness
819 * (reducing collisions) at the cost of some memory. It also halves
820 * the number of expensive resize operations in a growing memo table.
821 *
822 * Very large memo tables (over 50K items) use doubling instead.
823 * This may help applications with severe memory constraints.
824 */
825 if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
826 return 0;
827 return _PyMemoTable_ResizeTable(self,
828 (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
829}
830
831#undef MT_MINSIZE
832#undef PERTURB_SHIFT
833
834/*************************************************************************/
835
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000836
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000837static int
838_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000839{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000840 Py_CLEAR(self->output_buffer);
841 self->output_buffer =
842 PyBytes_FromStringAndSize(NULL, self->max_output_len);
843 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000844 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000845 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100846 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000847 return 0;
848}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000849
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100850static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100851_write_size64(char *out, size_t value)
852{
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800853 int i;
854
855 assert(sizeof(size_t) <= 8);
856
857 for (i = 0; i < sizeof(size_t); i++) {
858 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
859 }
860 for (i = sizeof(size_t); i < 8; i++) {
861 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800862 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100863}
864
865static void
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100866_Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
867{
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100868 qdata[0] = FRAME;
869 _write_size64(qdata + 1, frame_len);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100870}
871
872static int
873_Pickler_CommitFrame(PicklerObject *self)
874{
875 size_t frame_len;
876 char *qdata;
877
878 if (!self->framing || self->frame_start == -1)
879 return 0;
880 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
881 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
882 _Pickler_WriteFrameHeader(self, qdata, frame_len);
883 self->frame_start = -1;
884 return 0;
885}
886
887static int
888_Pickler_OpcodeBoundary(PicklerObject *self)
889{
890 Py_ssize_t frame_len;
891
892 if (!self->framing || self->frame_start == -1)
893 return 0;
894 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
895 if (frame_len >= FRAME_SIZE_TARGET)
896 return _Pickler_CommitFrame(self);
897 else
898 return 0;
899}
900
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000901static PyObject *
902_Pickler_GetString(PicklerObject *self)
903{
904 PyObject *output_buffer = self->output_buffer;
905
906 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100907
908 if (_Pickler_CommitFrame(self))
909 return NULL;
910
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000911 self->output_buffer = NULL;
912 /* Resize down to exact size */
913 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
914 return NULL;
915 return output_buffer;
916}
917
918static int
919_Pickler_FlushToFile(PicklerObject *self)
920{
921 PyObject *output, *result;
922
923 assert(self->write != NULL);
924
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100925 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000926 output = _Pickler_GetString(self);
927 if (output == NULL)
928 return -1;
929
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -0800930 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000931 Py_XDECREF(result);
932 return (result == NULL) ? -1 : 0;
933}
934
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200935static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100936_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000937{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100938 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000939 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100940 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000941
942 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100943 need_new_frame = (self->framing && self->frame_start == -1);
944
945 if (need_new_frame)
946 n = data_len + FRAME_HEADER_SIZE;
947 else
948 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000949
950 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100951 if (required > self->max_output_len) {
952 /* Make place in buffer for the pickle chunk */
953 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
954 PyErr_NoMemory();
955 return -1;
956 }
957 self->max_output_len = (self->output_len + n) / 2 * 3;
958 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
959 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000960 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000961 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100962 if (need_new_frame) {
963 /* Setup new frame */
964 Py_ssize_t frame_start = self->output_len;
965 self->frame_start = frame_start;
966 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
967 /* Write an invalid value, for debugging */
968 buffer[frame_start + i] = 0xFE;
969 }
970 self->output_len += FRAME_HEADER_SIZE;
971 }
972 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000973 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100974 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000975 buffer[self->output_len + i] = s[i];
976 }
977 }
978 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100979 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000980 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100981 self->output_len += data_len;
982 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000983}
984
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000985static PicklerObject *
986_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000987{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000988 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000989
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000990 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
991 if (self == NULL)
992 return NULL;
993
994 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100995 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000996 self->write = NULL;
997 self->proto = 0;
998 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100999 self->framing = 0;
1000 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001001 self->fast = 0;
1002 self->fast_nesting = 0;
1003 self->fix_imports = 0;
1004 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001005 self->max_output_len = WRITE_BUF_SIZE;
1006 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001007
1008 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001009 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1010 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001011
1012 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001013 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001014 return NULL;
1015 }
1016 return self;
1017}
1018
1019static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001020_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001021{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001022 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001023
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001024 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001025 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001026 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001027 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001028 proto = PyLong_AsLong(protocol);
1029 if (proto < 0) {
1030 if (proto == -1 && PyErr_Occurred())
1031 return -1;
1032 proto = HIGHEST_PROTOCOL;
1033 }
1034 else if (proto > HIGHEST_PROTOCOL) {
1035 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1036 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001037 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001038 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001039 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001040 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001041 self->bin = proto > 0;
1042 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001043 return 0;
1044}
1045
1046/* Returns -1 (with an exception set) on failure, 0 on success. This may
1047 be called once on a freshly created Pickler. */
1048static int
1049_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1050{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001051 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001052 assert(file != NULL);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001053 self->write = _PyObject_GetAttrId(file, &PyId_write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001054 if (self->write == NULL) {
1055 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1056 PyErr_SetString(PyExc_TypeError,
1057 "file must have a 'write' attribute");
1058 return -1;
1059 }
1060
1061 return 0;
1062}
1063
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001064/* Returns the size of the input on success, -1 on failure. This takes its
1065 own reference to `input`. */
1066static Py_ssize_t
1067_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1068{
1069 if (self->buffer.buf != NULL)
1070 PyBuffer_Release(&self->buffer);
1071 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1072 return -1;
1073 self->input_buffer = self->buffer.buf;
1074 self->input_len = self->buffer.len;
1075 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001076 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001077 return self->input_len;
1078}
1079
Antoine Pitrou04248a82010-10-12 20:51:21 +00001080static int
1081_Unpickler_SkipConsumed(UnpicklerObject *self)
1082{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001083 Py_ssize_t consumed;
1084 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001085
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001086 consumed = self->next_read_idx - self->prefetched_idx;
1087 if (consumed <= 0)
1088 return 0;
1089
1090 assert(self->peek); /* otherwise we did something wrong */
1091 /* This makes an useless copy... */
1092 r = PyObject_CallFunction(self->read, "n", consumed);
1093 if (r == NULL)
1094 return -1;
1095 Py_DECREF(r);
1096
1097 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001098 return 0;
1099}
1100
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001101static const Py_ssize_t READ_WHOLE_LINE = -1;
1102
1103/* If reading from a file, we need to only pull the bytes we need, since there
1104 may be multiple pickle objects arranged contiguously in the same input
1105 buffer.
1106
1107 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1108 bytes from the input stream/buffer.
1109
1110 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1111 failure; on success, returns the number of bytes read from the file.
1112
1113 On success, self->input_len will be 0; this is intentional so that when
1114 unpickling from a file, the "we've run out of data" code paths will trigger,
1115 causing the Unpickler to go back to the file for more data. Use the returned
1116 size to tell you how much data you can process. */
1117static Py_ssize_t
1118_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1119{
1120 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001121 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001122
1123 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001124
Antoine Pitrou04248a82010-10-12 20:51:21 +00001125 if (_Unpickler_SkipConsumed(self) < 0)
1126 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001127
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001128 if (n == READ_WHOLE_LINE) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08001129 PyObject *empty_tuple = PyTuple_New(0);
1130 data = PyObject_Call(self->readline, empty_tuple, NULL);
1131 Py_DECREF(empty_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001132 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001133 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001134 PyObject *len;
1135 /* Prefetch some data without advancing the file pointer, if possible */
1136 if (self->peek && n < PREFETCH) {
1137 len = PyLong_FromSsize_t(PREFETCH);
1138 if (len == NULL)
1139 return -1;
1140 data = _Pickle_FastCall(self->peek, len);
1141 if (data == NULL) {
1142 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1143 return -1;
1144 /* peek() is probably not supported by the given file object */
1145 PyErr_Clear();
1146 Py_CLEAR(self->peek);
1147 }
1148 else {
1149 read_size = _Unpickler_SetStringInput(self, data);
1150 Py_DECREF(data);
1151 self->prefetched_idx = 0;
1152 if (n <= read_size)
1153 return n;
1154 }
1155 }
1156 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001157 if (len == NULL)
1158 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001159 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001160 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001161 if (data == NULL)
1162 return -1;
1163
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001164 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001165 Py_DECREF(data);
1166 return read_size;
1167}
1168
1169/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1170
1171 This should be used for all data reads, rather than accessing the unpickler's
1172 input buffer directly. This method deals correctly with reading from input
1173 streams, which the input buffer doesn't deal with.
1174
1175 Note that when reading from a file-like object, self->next_read_idx won't
1176 be updated (it should remain at 0 for the entire unpickling process). You
1177 should use this function's return value to know how many bytes you can
1178 consume.
1179
1180 Returns -1 (with an exception set) on failure. On success, return the
1181 number of chars read. */
1182static Py_ssize_t
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001183_Unpickler_Read(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001184{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001185 Py_ssize_t num_read;
1186
Antoine Pitrou04248a82010-10-12 20:51:21 +00001187 if (self->next_read_idx + n <= self->input_len) {
1188 *s = self->input_buffer + self->next_read_idx;
1189 self->next_read_idx += n;
1190 return n;
1191 }
1192 if (!self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001193 PyErr_Format(PyExc_EOFError, "Ran out of input");
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001194 return -1;
1195 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001196 num_read = _Unpickler_ReadFromFile(self, n);
1197 if (num_read < 0)
1198 return -1;
1199 if (num_read < n) {
1200 PyErr_Format(PyExc_EOFError, "Ran out of input");
1201 return -1;
1202 }
1203 *s = self->input_buffer;
1204 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001205 return n;
1206}
1207
1208static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001209_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1210 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001211{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001212 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001213 if (input_line == NULL) {
1214 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001215 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001216 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001217
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001218 memcpy(input_line, line, len);
1219 input_line[len] = '\0';
1220 self->input_line = input_line;
1221 *result = self->input_line;
1222 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001223}
1224
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001225/* Read a line from the input stream/buffer. If we run off the end of the input
1226 before hitting \n, return the data we found.
1227
1228 Returns the number of chars read, or -1 on failure. */
1229static Py_ssize_t
1230_Unpickler_Readline(UnpicklerObject *self, char **result)
1231{
1232 Py_ssize_t i, num_read;
1233
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001234 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001235 if (self->input_buffer[i] == '\n') {
1236 char *line_start = self->input_buffer + self->next_read_idx;
1237 num_read = i - self->next_read_idx + 1;
1238 self->next_read_idx = i + 1;
1239 return _Unpickler_CopyLine(self, line_start, num_read, result);
1240 }
1241 }
1242 if (self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001243 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1244 if (num_read < 0)
1245 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001246 self->next_read_idx = num_read;
Antoine Pitrouf6c7a852011-08-11 21:04:02 +02001247 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001248 }
Victor Stinner121aab42011-09-29 23:40:53 +02001249
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001250 /* If we get here, we've run off the end of the input string. Return the
1251 remaining string and let the caller figure it out. */
1252 *result = self->input_buffer + self->next_read_idx;
1253 num_read = i - self->next_read_idx;
1254 self->next_read_idx = i;
1255 return num_read;
1256}
1257
1258/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1259 will be modified in place. */
1260static int
1261_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1262{
1263 Py_ssize_t i;
1264 PyObject **memo;
1265
1266 assert(new_size > self->memo_size);
1267
1268 memo = PyMem_REALLOC(self->memo, new_size * sizeof(PyObject *));
1269 if (memo == NULL) {
1270 PyErr_NoMemory();
1271 return -1;
1272 }
1273 self->memo = memo;
1274 for (i = self->memo_size; i < new_size; i++)
1275 self->memo[i] = NULL;
1276 self->memo_size = new_size;
1277 return 0;
1278}
1279
1280/* Returns NULL if idx is out of bounds. */
1281static PyObject *
1282_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1283{
1284 if (idx < 0 || idx >= self->memo_size)
1285 return NULL;
1286
1287 return self->memo[idx];
1288}
1289
1290/* Returns -1 (with an exception set) on failure, 0 on success.
1291 This takes its own reference to `value`. */
1292static int
1293_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1294{
1295 PyObject *old_item;
1296
1297 if (idx >= self->memo_size) {
1298 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1299 return -1;
1300 assert(idx < self->memo_size);
1301 }
1302 Py_INCREF(value);
1303 old_item = self->memo[idx];
1304 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001305 if (old_item != NULL) {
1306 Py_DECREF(old_item);
1307 }
1308 else {
1309 self->memo_len++;
1310 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001311 return 0;
1312}
1313
1314static PyObject **
1315_Unpickler_NewMemo(Py_ssize_t new_size)
1316{
1317 PyObject **memo = PyMem_MALLOC(new_size * sizeof(PyObject *));
Victor Stinner42024562013-07-12 00:53:57 +02001318 if (memo == NULL) {
1319 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001320 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001321 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001322 memset(memo, 0, new_size * sizeof(PyObject *));
1323 return memo;
1324}
1325
1326/* Free the unpickler's memo, taking care to decref any items left in it. */
1327static void
1328_Unpickler_MemoCleanup(UnpicklerObject *self)
1329{
1330 Py_ssize_t i;
1331 PyObject **memo = self->memo;
1332
1333 if (self->memo == NULL)
1334 return;
1335 self->memo = NULL;
1336 i = self->memo_size;
1337 while (--i >= 0) {
1338 Py_XDECREF(memo[i]);
1339 }
1340 PyMem_FREE(memo);
1341}
1342
1343static UnpicklerObject *
1344_Unpickler_New(void)
1345{
1346 UnpicklerObject *self;
1347
1348 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1349 if (self == NULL)
1350 return NULL;
1351
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001352 self->pers_func = NULL;
1353 self->input_buffer = NULL;
1354 self->input_line = NULL;
1355 self->input_len = 0;
1356 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001357 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001358 self->read = NULL;
1359 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001360 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001361 self->encoding = NULL;
1362 self->errors = NULL;
1363 self->marks = NULL;
1364 self->num_marks = 0;
1365 self->marks_size = 0;
1366 self->proto = 0;
1367 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001368 memset(&self->buffer, 0, sizeof(Py_buffer));
1369 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001370 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001371 self->memo = _Unpickler_NewMemo(self->memo_size);
1372 self->stack = (Pdata *)Pdata_New();
1373
1374 if (self->memo == NULL || self->stack == NULL) {
1375 Py_DECREF(self);
1376 return NULL;
1377 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001378
1379 return self;
1380}
1381
1382/* Returns -1 (with an exception set) on failure, 0 on success. This may
1383 be called once on a freshly created Pickler. */
1384static int
1385_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1386{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001387 _Py_IDENTIFIER(peek);
1388 _Py_IDENTIFIER(read);
1389 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001390
1391 self->peek = _PyObject_GetAttrId(file, &PyId_peek);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001392 if (self->peek == NULL) {
1393 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1394 PyErr_Clear();
1395 else
1396 return -1;
1397 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001398 self->read = _PyObject_GetAttrId(file, &PyId_read);
1399 self->readline = _PyObject_GetAttrId(file, &PyId_readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001400 if (self->readline == NULL || self->read == NULL) {
1401 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1402 PyErr_SetString(PyExc_TypeError,
1403 "file must have 'read' and 'readline' attributes");
1404 Py_CLEAR(self->read);
1405 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001406 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001407 return -1;
1408 }
1409 return 0;
1410}
1411
1412/* Returns -1 (with an exception set) on failure, 0 on success. This may
1413 be called once on a freshly created Pickler. */
1414static int
1415_Unpickler_SetInputEncoding(UnpicklerObject *self,
1416 const char *encoding,
1417 const char *errors)
1418{
1419 if (encoding == NULL)
1420 encoding = "ASCII";
1421 if (errors == NULL)
1422 errors = "strict";
1423
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001424 self->encoding = _PyMem_Strdup(encoding);
1425 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001426 if (self->encoding == NULL || self->errors == NULL) {
1427 PyErr_NoMemory();
1428 return -1;
1429 }
1430 return 0;
1431}
1432
1433/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001434static int
1435memo_get(PicklerObject *self, PyObject *key)
1436{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001437 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001438 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001439 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001440
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001441 value = PyMemoTable_Get(self->memo, key);
1442 if (value == NULL) {
1443 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001444 return -1;
1445 }
1446
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001447 if (!self->bin) {
1448 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001449 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1450 "%" PY_FORMAT_SIZE_T "d\n", *value);
1451 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001452 }
1453 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001454 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001455 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001456 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001457 len = 2;
1458 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001459 else if (*value <= 0xffffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001460 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001461 pdata[1] = (unsigned char)(*value & 0xff);
1462 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1463 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1464 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001465 len = 5;
1466 }
1467 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001468 PickleState *st = _Pickle_GetGlobalState();
1469 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001470 "memo id too large for LONG_BINGET");
1471 return -1;
1472 }
1473 }
1474
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001475 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001476 return -1;
1477
1478 return 0;
1479}
1480
1481/* Store an object in the memo, assign it a new unique ID based on the number
1482 of objects currently stored in the memo and generate a PUT opcode. */
1483static int
1484memo_put(PicklerObject *self, PyObject *obj)
1485{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001486 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001487 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001488 Py_ssize_t idx;
1489
1490 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001491
1492 if (self->fast)
1493 return 0;
1494
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001495 idx = PyMemoTable_Size(self->memo);
1496 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1497 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001498
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001499 if (self->proto >= 4) {
1500 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1501 return -1;
1502 return 0;
1503 }
1504 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001505 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001506 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001507 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001508 len = strlen(pdata);
1509 }
1510 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001511 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001512 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001513 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001514 len = 2;
1515 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001516 else if (idx <= 0xffffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001517 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001518 pdata[1] = (unsigned char)(idx & 0xff);
1519 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1520 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1521 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001522 len = 5;
1523 }
1524 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001525 PickleState *st = _Pickle_GetGlobalState();
1526 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001527 "memo id too large for LONG_BINPUT");
1528 return -1;
1529 }
1530 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001531 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001532 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001533
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001534 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001535}
1536
1537static PyObject *
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001538getattribute(PyObject *obj, PyObject *name, int allow_qualname) {
1539 PyObject *dotted_path;
1540 Py_ssize_t i;
1541 _Py_static_string(PyId_dot, ".");
1542 _Py_static_string(PyId_locals, "<locals>");
1543
1544 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
1545 if (dotted_path == NULL) {
1546 return NULL;
1547 }
1548 assert(Py_SIZE(dotted_path) >= 1);
1549 if (!allow_qualname && Py_SIZE(dotted_path) > 1) {
1550 PyErr_Format(PyExc_AttributeError,
1551 "Can't get qualified attribute %R on %R;"
1552 "use protocols >= 4 to enable support",
1553 name, obj);
1554 Py_DECREF(dotted_path);
1555 return NULL;
1556 }
1557 Py_INCREF(obj);
1558 for (i = 0; i < Py_SIZE(dotted_path); i++) {
1559 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
1560 PyObject *tmp;
1561 PyObject *result = PyUnicode_RichCompare(
1562 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1563 int is_equal = (result == Py_True);
1564 assert(PyBool_Check(result));
1565 Py_DECREF(result);
1566 if (is_equal) {
1567 PyErr_Format(PyExc_AttributeError,
1568 "Can't get local attribute %R on %R", name, obj);
1569 Py_DECREF(dotted_path);
1570 Py_DECREF(obj);
1571 return NULL;
1572 }
1573 tmp = PyObject_GetAttr(obj, subpath);
1574 Py_DECREF(obj);
1575 if (tmp == NULL) {
1576 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1577 PyErr_Clear();
1578 PyErr_Format(PyExc_AttributeError,
1579 "Can't get attribute %R on %R", name, obj);
1580 }
1581 Py_DECREF(dotted_path);
1582 return NULL;
1583 }
1584 obj = tmp;
1585 }
1586 Py_DECREF(dotted_path);
1587 return obj;
1588}
1589
1590static PyObject *
1591whichmodule(PyObject *global, PyObject *global_name, int allow_qualname)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001592{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001593 PyObject *module_name;
1594 PyObject *modules_dict;
1595 PyObject *module;
1596 PyObject *obj;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001597 Py_ssize_t i, j;
1598 _Py_IDENTIFIER(__module__);
1599 _Py_IDENTIFIER(modules);
1600 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001601
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001602 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1603
1604 if (module_name == NULL) {
1605 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001606 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001607 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001608 }
1609 else {
1610 /* In some rare cases (e.g., bound methods of extension types),
1611 __module__ can be None. If it is so, then search sys.modules for
1612 the module of global. */
1613 if (module_name != Py_None)
1614 return module_name;
1615 Py_CLEAR(module_name);
1616 }
1617 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001618
Victor Stinnerbb520202013-11-06 22:40:41 +01001619 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001620 if (modules_dict == NULL) {
1621 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001622 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001623 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001624
1625 i = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001626 while ((j = PyDict_Next(modules_dict, &i, &module_name, &module))) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001627 PyObject *result = PyUnicode_RichCompare(
1628 module_name, _PyUnicode_FromId(&PyId___main__), Py_EQ);
1629 int is_equal = (result == Py_True);
1630 assert(PyBool_Check(result));
1631 Py_DECREF(result);
1632 if (is_equal)
1633 continue;
1634 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001635 continue;
1636
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001637 obj = getattribute(module, global_name, allow_qualname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001638 if (obj == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001639 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001640 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001641 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001642 continue;
1643 }
1644
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001645 if (obj == global) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001646 Py_DECREF(obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001647 Py_INCREF(module_name);
1648 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001649 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001650 Py_DECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001651 }
1652
1653 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001654 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001655 Py_INCREF(module_name);
1656 return module_name;
1657}
1658
1659/* fast_save_enter() and fast_save_leave() are guards against recursive
1660 objects when Pickler is used with the "fast mode" (i.e., with object
1661 memoization disabled). If the nesting of a list or dict object exceed
1662 FAST_NESTING_LIMIT, these guards will start keeping an internal
1663 reference to the seen list or dict objects and check whether these objects
1664 are recursive. These are not strictly necessary, since save() has a
1665 hard-coded recursion limit, but they give a nicer error message than the
1666 typical RuntimeError. */
1667static int
1668fast_save_enter(PicklerObject *self, PyObject *obj)
1669{
1670 /* if fast_nesting < 0, we're doing an error exit. */
1671 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1672 PyObject *key = NULL;
1673 if (self->fast_memo == NULL) {
1674 self->fast_memo = PyDict_New();
1675 if (self->fast_memo == NULL) {
1676 self->fast_nesting = -1;
1677 return 0;
1678 }
1679 }
1680 key = PyLong_FromVoidPtr(obj);
1681 if (key == NULL)
1682 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001683 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001684 Py_DECREF(key);
1685 PyErr_Format(PyExc_ValueError,
1686 "fast mode: can't pickle cyclic objects "
1687 "including object type %.200s at %p",
1688 obj->ob_type->tp_name, obj);
1689 self->fast_nesting = -1;
1690 return 0;
1691 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001692 if (PyErr_Occurred()) {
1693 return 0;
1694 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001695 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1696 Py_DECREF(key);
1697 self->fast_nesting = -1;
1698 return 0;
1699 }
1700 Py_DECREF(key);
1701 }
1702 return 1;
1703}
1704
1705static int
1706fast_save_leave(PicklerObject *self, PyObject *obj)
1707{
1708 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1709 PyObject *key = PyLong_FromVoidPtr(obj);
1710 if (key == NULL)
1711 return 0;
1712 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1713 Py_DECREF(key);
1714 return 0;
1715 }
1716 Py_DECREF(key);
1717 }
1718 return 1;
1719}
1720
1721static int
1722save_none(PicklerObject *self, PyObject *obj)
1723{
1724 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001725 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001726 return -1;
1727
1728 return 0;
1729}
1730
1731static int
1732save_bool(PicklerObject *self, PyObject *obj)
1733{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001734 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001735 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001736 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001737 return -1;
1738 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001739 else {
1740 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1741 * so that unpicklers written before bools were introduced unpickle them
1742 * as ints, but unpicklers after can recognize that bools were intended.
1743 * Note that protocol 2 added direct ways to pickle bools.
1744 */
1745 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1746 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1747 return -1;
1748 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001749 return 0;
1750}
1751
1752static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001753save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001754{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001755 PyObject *repr = NULL;
1756 Py_ssize_t size;
1757 long val;
1758 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001759
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001760 const char long_op = LONG;
1761
1762 val= PyLong_AsLong(obj);
1763 if (val == -1 && PyErr_Occurred()) {
1764 /* out of range for int pickling */
1765 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001766 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001767 else if (self->bin &&
1768 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001769 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
Larry Hastings61272b72014-01-07 12:41:53 -08001770 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001771
1772 Note: we can't use -0x80000000L in the above condition because some
1773 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1774 before applying the unary minus when sizeof(long) <= 4. The
1775 resulting value stays unsigned which is commonly not what we want,
1776 so MSVC happily warns us about it. However, that result would have
1777 been fine because we guard for sizeof(long) <= 4 which turns the
1778 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001779 char pdata[32];
1780 Py_ssize_t len = 0;
1781
1782 pdata[1] = (unsigned char)(val & 0xff);
1783 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1784 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1785 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001786
1787 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1788 if (pdata[2] == 0) {
1789 pdata[0] = BININT1;
1790 len = 2;
1791 }
1792 else {
1793 pdata[0] = BININT2;
1794 len = 3;
1795 }
1796 }
1797 else {
1798 pdata[0] = BININT;
1799 len = 5;
1800 }
1801
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001802 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001803 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001804
1805 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001806 }
1807
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001808 if (self->proto >= 2) {
1809 /* Linear-time pickling. */
1810 size_t nbits;
1811 size_t nbytes;
1812 unsigned char *pdata;
1813 char header[5];
1814 int i;
1815 int sign = _PyLong_Sign(obj);
1816
1817 if (sign == 0) {
1818 header[0] = LONG1;
1819 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001820 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001821 goto error;
1822 return 0;
1823 }
1824 nbits = _PyLong_NumBits(obj);
1825 if (nbits == (size_t)-1 && PyErr_Occurred())
1826 goto error;
1827 /* How many bytes do we need? There are nbits >> 3 full
1828 * bytes of data, and nbits & 7 leftover bits. If there
1829 * are any leftover bits, then we clearly need another
1830 * byte. Wnat's not so obvious is that we *probably*
1831 * need another byte even if there aren't any leftovers:
1832 * the most-significant bit of the most-significant byte
1833 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001834 * opposite of the one we need. The exception is ints
1835 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001836 * its own 256's-complement, so has the right sign bit
1837 * even without the extra byte. That's a pain to check
1838 * for in advance, though, so we always grab an extra
1839 * byte at the start, and cut it back later if possible.
1840 */
1841 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001842 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001843 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001844 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001845 goto error;
1846 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001847 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001848 if (repr == NULL)
1849 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001850 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001851 i = _PyLong_AsByteArray((PyLongObject *)obj,
1852 pdata, nbytes,
1853 1 /* little endian */ , 1 /* signed */ );
1854 if (i < 0)
1855 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001856 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001857 * needed. This is so iff the MSB is all redundant sign
1858 * bits.
1859 */
1860 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001861 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001862 pdata[nbytes - 1] == 0xff &&
1863 (pdata[nbytes - 2] & 0x80) != 0) {
1864 nbytes--;
1865 }
1866
1867 if (nbytes < 256) {
1868 header[0] = LONG1;
1869 header[1] = (unsigned char)nbytes;
1870 size = 2;
1871 }
1872 else {
1873 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001874 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001875 for (i = 1; i < 5; i++) {
1876 header[i] = (unsigned char)(size & 0xff);
1877 size >>= 8;
1878 }
1879 size = 5;
1880 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001881 if (_Pickler_Write(self, header, size) < 0 ||
1882 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001883 goto error;
1884 }
1885 else {
1886 char *string;
1887
Mark Dickinson8dd05142009-01-20 20:43:58 +00001888 /* proto < 2: write the repr and newline. This is quadratic-time (in
1889 the number of digits), in both directions. We add a trailing 'L'
1890 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001891
1892 repr = PyObject_Repr(obj);
1893 if (repr == NULL)
1894 goto error;
1895
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001896 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001897 if (string == NULL)
1898 goto error;
1899
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001900 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1901 _Pickler_Write(self, string, size) < 0 ||
1902 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001903 goto error;
1904 }
1905
1906 if (0) {
1907 error:
1908 status = -1;
1909 }
1910 Py_XDECREF(repr);
1911
1912 return status;
1913}
1914
1915static int
1916save_float(PicklerObject *self, PyObject *obj)
1917{
1918 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1919
1920 if (self->bin) {
1921 char pdata[9];
1922 pdata[0] = BINFLOAT;
1923 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1924 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001925 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001926 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001927 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001928 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001929 int result = -1;
1930 char *buf = NULL;
1931 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001932
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001933 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001934 goto done;
1935
Mark Dickinson3e09f432009-04-17 08:41:23 +00001936 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001937 if (!buf) {
1938 PyErr_NoMemory();
1939 goto done;
1940 }
1941
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001942 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001943 goto done;
1944
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001945 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001946 goto done;
1947
1948 result = 0;
1949done:
1950 PyMem_Free(buf);
1951 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001952 }
1953
1954 return 0;
1955}
1956
1957static int
1958save_bytes(PicklerObject *self, PyObject *obj)
1959{
1960 if (self->proto < 3) {
1961 /* Older pickle protocols do not have an opcode for pickling bytes
1962 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001963 the __reduce__ method) to permit bytes object unpickling.
1964
1965 Here we use a hack to be compatible with Python 2. Since in Python
1966 2 'bytes' is just an alias for 'str' (which has different
1967 parameters than the actual bytes object), we use codecs.encode
1968 to create the appropriate 'str' object when unpickled using
1969 Python 2 *and* the appropriate 'bytes' object when unpickled
1970 using Python 3. Again this is a hack and we don't need to do this
1971 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001973 int status;
1974
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001975 if (PyBytes_GET_SIZE(obj) == 0) {
1976 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
1977 }
1978 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001979 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001980 PyObject *unicode_str =
1981 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
1982 PyBytes_GET_SIZE(obj),
1983 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001984 _Py_IDENTIFIER(latin1);
1985
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001986 if (unicode_str == NULL)
1987 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001988 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001989 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001990 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001991 Py_DECREF(unicode_str);
1992 }
1993
1994 if (reduce_value == NULL)
1995 return -1;
1996
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001997 /* save_reduce() will memoize the object automatically. */
1998 status = save_reduce(self, reduce_value, obj);
1999 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002000 return status;
2001 }
2002 else {
2003 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002004 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002005 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002006
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002007 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002008 if (size < 0)
2009 return -1;
2010
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002011 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002012 header[0] = SHORT_BINBYTES;
2013 header[1] = (unsigned char)size;
2014 len = 2;
2015 }
2016 else if (size <= 0xffffffffL) {
2017 header[0] = BINBYTES;
2018 header[1] = (unsigned char)(size & 0xff);
2019 header[2] = (unsigned char)((size >> 8) & 0xff);
2020 header[3] = (unsigned char)((size >> 16) & 0xff);
2021 header[4] = (unsigned char)((size >> 24) & 0xff);
2022 len = 5;
2023 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002024 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002025 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002026 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002027 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002028 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002029 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002030 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002031 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002032 return -1; /* string too large */
2033 }
2034
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002035 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002036 return -1;
2037
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002038 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002039 return -1;
2040
2041 if (memo_put(self, obj) < 0)
2042 return -1;
2043
2044 return 0;
2045 }
2046}
2047
2048/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2049 backslash and newline characters to \uXXXX escapes. */
2050static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002051raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002052{
2053 PyObject *repr, *result;
2054 char *p;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002055 Py_ssize_t i, size, expandsize;
2056 void *data;
2057 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002058
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002059 if (PyUnicode_READY(obj))
2060 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002061
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002062 size = PyUnicode_GET_LENGTH(obj);
2063 data = PyUnicode_DATA(obj);
2064 kind = PyUnicode_KIND(obj);
2065 if (kind == PyUnicode_4BYTE_KIND)
2066 expandsize = 10;
2067 else
2068 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002069
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002070 if (size > PY_SSIZE_T_MAX / expandsize)
2071 return PyErr_NoMemory();
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002072 repr = PyByteArray_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002073 if (repr == NULL)
2074 return NULL;
2075 if (size == 0)
2076 goto done;
2077
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002078 p = PyByteArray_AS_STRING(repr);
2079 for (i=0; i < size; i++) {
2080 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002081 /* Map 32-bit characters to '\Uxxxxxxxx' */
2082 if (ch >= 0x10000) {
2083 *p++ = '\\';
2084 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002085 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2086 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2087 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2088 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2089 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2090 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2091 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2092 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002093 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002094 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002095 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002096 *p++ = '\\';
2097 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002098 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2099 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2100 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2101 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002102 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002103 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002104 else
2105 *p++ = (char) ch;
2106 }
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002107 size = p - PyByteArray_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002108
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002109done:
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002110 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(repr), size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002111 Py_DECREF(repr);
2112 return result;
2113}
2114
2115static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002116write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2117{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002118 char header[9];
2119 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002120
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002121 if (size <= 0xff && self->proto >= 4) {
2122 header[0] = SHORT_BINUNICODE;
2123 header[1] = (unsigned char)(size & 0xff);
2124 len = 2;
2125 }
2126 else if (size <= 0xffffffffUL) {
2127 header[0] = BINUNICODE;
2128 header[1] = (unsigned char)(size & 0xff);
2129 header[2] = (unsigned char)((size >> 8) & 0xff);
2130 header[3] = (unsigned char)((size >> 16) & 0xff);
2131 header[4] = (unsigned char)((size >> 24) & 0xff);
2132 len = 5;
2133 }
2134 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002135 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002136 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002137 len = 9;
2138 }
2139 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002140 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002141 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002142 return -1;
2143 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002144
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002145 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002146 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002147 if (_Pickler_Write(self, data, size) < 0)
2148 return -1;
2149
2150 return 0;
2151}
2152
2153static int
2154write_unicode_binary(PicklerObject *self, PyObject *obj)
2155{
2156 PyObject *encoded = NULL;
2157 Py_ssize_t size;
2158 char *data;
2159 int r;
2160
2161 if (PyUnicode_READY(obj))
2162 return -1;
2163
2164 data = PyUnicode_AsUTF8AndSize(obj, &size);
2165 if (data != NULL)
2166 return write_utf8(self, data, size);
2167
2168 /* Issue #8383: for strings with lone surrogates, fallback on the
2169 "surrogatepass" error handler. */
2170 PyErr_Clear();
2171 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2172 if (encoded == NULL)
2173 return -1;
2174
2175 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2176 PyBytes_GET_SIZE(encoded));
2177 Py_DECREF(encoded);
2178 return r;
2179}
2180
2181static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002182save_unicode(PicklerObject *self, PyObject *obj)
2183{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002184 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002185 if (write_unicode_binary(self, obj) < 0)
2186 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002187 }
2188 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002189 PyObject *encoded;
2190 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002191 const char unicode_op = UNICODE;
2192
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002193 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002194 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002195 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002196
Antoine Pitrou299978d2013-04-07 17:38:11 +02002197 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2198 Py_DECREF(encoded);
2199 return -1;
2200 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002201
2202 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002203 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2204 Py_DECREF(encoded);
2205 return -1;
2206 }
2207 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002208
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002209 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002210 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002211 }
2212 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002213 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002214
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002215 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002216}
2217
2218/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2219static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002220store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002221{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002222 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002223
2224 assert(PyTuple_Size(t) == len);
2225
2226 for (i = 0; i < len; i++) {
2227 PyObject *element = PyTuple_GET_ITEM(t, i);
2228
2229 if (element == NULL)
2230 return -1;
2231 if (save(self, element, 0) < 0)
2232 return -1;
2233 }
2234
2235 return 0;
2236}
2237
2238/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2239 * used across protocols to minimize the space needed to pickle them.
2240 * Tuples are also the only builtin immutable type that can be recursive
2241 * (a tuple can be reached from itself), and that requires some subtle
2242 * magic so that it works in all cases. IOW, this is a long routine.
2243 */
2244static int
2245save_tuple(PicklerObject *self, PyObject *obj)
2246{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002247 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002248
2249 const char mark_op = MARK;
2250 const char tuple_op = TUPLE;
2251 const char pop_op = POP;
2252 const char pop_mark_op = POP_MARK;
2253 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2254
2255 if ((len = PyTuple_Size(obj)) < 0)
2256 return -1;
2257
2258 if (len == 0) {
2259 char pdata[2];
2260
2261 if (self->proto) {
2262 pdata[0] = EMPTY_TUPLE;
2263 len = 1;
2264 }
2265 else {
2266 pdata[0] = MARK;
2267 pdata[1] = TUPLE;
2268 len = 2;
2269 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002270 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002271 return -1;
2272 return 0;
2273 }
2274
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002275 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002276 * saving the tuple elements, the tuple must be recursive, in
2277 * which case we'll pop everything we put on the stack, and fetch
2278 * its value from the memo.
2279 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002280 if (len <= 3 && self->proto >= 2) {
2281 /* Use TUPLE{1,2,3} opcodes. */
2282 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002283 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002284
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002285 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002286 /* pop the len elements */
2287 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002288 if (_Pickler_Write(self, &pop_op, 1) < 0)
2289 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002290 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002291 if (memo_get(self, obj) < 0)
2292 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002293
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002294 return 0;
2295 }
2296 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002297 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2298 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002299 }
2300 goto memoize;
2301 }
2302
2303 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2304 * Generate MARK e1 e2 ... TUPLE
2305 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002306 if (_Pickler_Write(self, &mark_op, 1) < 0)
2307 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002308
2309 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002310 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002311
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002312 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002313 /* pop the stack stuff we pushed */
2314 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002315 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2316 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002317 }
2318 else {
2319 /* Note that we pop one more than len, to remove
2320 * the MARK too.
2321 */
2322 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002323 if (_Pickler_Write(self, &pop_op, 1) < 0)
2324 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002325 }
2326 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002327 if (memo_get(self, obj) < 0)
2328 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002329
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002330 return 0;
2331 }
2332 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002333 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2334 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002335 }
2336
2337 memoize:
2338 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002339 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002340
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002341 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002342}
2343
2344/* iter is an iterator giving items, and we batch up chunks of
2345 * MARK item item ... item APPENDS
2346 * opcode sequences. Calling code should have arranged to first create an
2347 * empty list, or list-like object, for the APPENDS to operate on.
2348 * Returns 0 on success, <0 on error.
2349 */
2350static int
2351batch_list(PicklerObject *self, PyObject *iter)
2352{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002353 PyObject *obj = NULL;
2354 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002355 int i, n;
2356
2357 const char mark_op = MARK;
2358 const char append_op = APPEND;
2359 const char appends_op = APPENDS;
2360
2361 assert(iter != NULL);
2362
2363 /* XXX: I think this function could be made faster by avoiding the
2364 iterator interface and fetching objects directly from list using
2365 PyList_GET_ITEM.
2366 */
2367
2368 if (self->proto == 0) {
2369 /* APPENDS isn't available; do one at a time. */
2370 for (;;) {
2371 obj = PyIter_Next(iter);
2372 if (obj == NULL) {
2373 if (PyErr_Occurred())
2374 return -1;
2375 break;
2376 }
2377 i = save(self, obj, 0);
2378 Py_DECREF(obj);
2379 if (i < 0)
2380 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002381 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002382 return -1;
2383 }
2384 return 0;
2385 }
2386
2387 /* proto > 0: write in batches of BATCHSIZE. */
2388 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002389 /* Get first item */
2390 firstitem = PyIter_Next(iter);
2391 if (firstitem == NULL) {
2392 if (PyErr_Occurred())
2393 goto error;
2394
2395 /* nothing more to add */
2396 break;
2397 }
2398
2399 /* Try to get a second item */
2400 obj = PyIter_Next(iter);
2401 if (obj == NULL) {
2402 if (PyErr_Occurred())
2403 goto error;
2404
2405 /* Only one item to write */
2406 if (save(self, firstitem, 0) < 0)
2407 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002408 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002409 goto error;
2410 Py_CLEAR(firstitem);
2411 break;
2412 }
2413
2414 /* More than one item to write */
2415
2416 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002417 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002418 goto error;
2419
2420 if (save(self, firstitem, 0) < 0)
2421 goto error;
2422 Py_CLEAR(firstitem);
2423 n = 1;
2424
2425 /* Fetch and save up to BATCHSIZE items */
2426 while (obj) {
2427 if (save(self, obj, 0) < 0)
2428 goto error;
2429 Py_CLEAR(obj);
2430 n += 1;
2431
2432 if (n == BATCHSIZE)
2433 break;
2434
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002435 obj = PyIter_Next(iter);
2436 if (obj == NULL) {
2437 if (PyErr_Occurred())
2438 goto error;
2439 break;
2440 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002441 }
2442
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002443 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002444 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002445
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002446 } while (n == BATCHSIZE);
2447 return 0;
2448
2449 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002450 Py_XDECREF(firstitem);
2451 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002452 return -1;
2453}
2454
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002455/* This is a variant of batch_list() above, specialized for lists (with no
2456 * support for list subclasses). Like batch_list(), we batch up chunks of
2457 * MARK item item ... item APPENDS
2458 * opcode sequences. Calling code should have arranged to first create an
2459 * empty list, or list-like object, for the APPENDS to operate on.
2460 * Returns 0 on success, -1 on error.
2461 *
2462 * This version is considerably faster than batch_list(), if less general.
2463 *
2464 * Note that this only works for protocols > 0.
2465 */
2466static int
2467batch_list_exact(PicklerObject *self, PyObject *obj)
2468{
2469 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002470 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002471
2472 const char append_op = APPEND;
2473 const char appends_op = APPENDS;
2474 const char mark_op = MARK;
2475
2476 assert(obj != NULL);
2477 assert(self->proto > 0);
2478 assert(PyList_CheckExact(obj));
2479
2480 if (PyList_GET_SIZE(obj) == 1) {
2481 item = PyList_GET_ITEM(obj, 0);
2482 if (save(self, item, 0) < 0)
2483 return -1;
2484 if (_Pickler_Write(self, &append_op, 1) < 0)
2485 return -1;
2486 return 0;
2487 }
2488
2489 /* Write in batches of BATCHSIZE. */
2490 total = 0;
2491 do {
2492 this_batch = 0;
2493 if (_Pickler_Write(self, &mark_op, 1) < 0)
2494 return -1;
2495 while (total < PyList_GET_SIZE(obj)) {
2496 item = PyList_GET_ITEM(obj, total);
2497 if (save(self, item, 0) < 0)
2498 return -1;
2499 total++;
2500 if (++this_batch == BATCHSIZE)
2501 break;
2502 }
2503 if (_Pickler_Write(self, &appends_op, 1) < 0)
2504 return -1;
2505
2506 } while (total < PyList_GET_SIZE(obj));
2507
2508 return 0;
2509}
2510
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002511static int
2512save_list(PicklerObject *self, PyObject *obj)
2513{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002514 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002515 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002516 int status = 0;
2517
2518 if (self->fast && !fast_save_enter(self, obj))
2519 goto error;
2520
2521 /* Create an empty list. */
2522 if (self->bin) {
2523 header[0] = EMPTY_LIST;
2524 len = 1;
2525 }
2526 else {
2527 header[0] = MARK;
2528 header[1] = LIST;
2529 len = 2;
2530 }
2531
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002532 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002533 goto error;
2534
2535 /* Get list length, and bow out early if empty. */
2536 if ((len = PyList_Size(obj)) < 0)
2537 goto error;
2538
2539 if (memo_put(self, obj) < 0)
2540 goto error;
2541
2542 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002543 /* Materialize the list elements. */
2544 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002545 if (Py_EnterRecursiveCall(" while pickling an object"))
2546 goto error;
2547 status = batch_list_exact(self, obj);
2548 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002549 } else {
2550 PyObject *iter = PyObject_GetIter(obj);
2551 if (iter == NULL)
2552 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002553
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002554 if (Py_EnterRecursiveCall(" while pickling an object")) {
2555 Py_DECREF(iter);
2556 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002557 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002558 status = batch_list(self, iter);
2559 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002560 Py_DECREF(iter);
2561 }
2562 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002563 if (0) {
2564 error:
2565 status = -1;
2566 }
2567
2568 if (self->fast && !fast_save_leave(self, obj))
2569 status = -1;
2570
2571 return status;
2572}
2573
2574/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2575 * MARK key value ... key value SETITEMS
2576 * opcode sequences. Calling code should have arranged to first create an
2577 * empty dict, or dict-like object, for the SETITEMS to operate on.
2578 * Returns 0 on success, <0 on error.
2579 *
2580 * This is very much like batch_list(). The difference between saving
2581 * elements directly, and picking apart two-tuples, is so long-winded at
2582 * the C level, though, that attempts to combine these routines were too
2583 * ugly to bear.
2584 */
2585static int
2586batch_dict(PicklerObject *self, PyObject *iter)
2587{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002588 PyObject *obj = NULL;
2589 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002590 int i, n;
2591
2592 const char mark_op = MARK;
2593 const char setitem_op = SETITEM;
2594 const char setitems_op = SETITEMS;
2595
2596 assert(iter != NULL);
2597
2598 if (self->proto == 0) {
2599 /* SETITEMS isn't available; do one at a time. */
2600 for (;;) {
2601 obj = PyIter_Next(iter);
2602 if (obj == NULL) {
2603 if (PyErr_Occurred())
2604 return -1;
2605 break;
2606 }
2607 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2608 PyErr_SetString(PyExc_TypeError, "dict items "
2609 "iterator must return 2-tuples");
2610 return -1;
2611 }
2612 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2613 if (i >= 0)
2614 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2615 Py_DECREF(obj);
2616 if (i < 0)
2617 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002618 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002619 return -1;
2620 }
2621 return 0;
2622 }
2623
2624 /* proto > 0: write in batches of BATCHSIZE. */
2625 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002626 /* Get first item */
2627 firstitem = PyIter_Next(iter);
2628 if (firstitem == NULL) {
2629 if (PyErr_Occurred())
2630 goto error;
2631
2632 /* nothing more to add */
2633 break;
2634 }
2635 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2636 PyErr_SetString(PyExc_TypeError, "dict items "
2637 "iterator must return 2-tuples");
2638 goto error;
2639 }
2640
2641 /* Try to get a second item */
2642 obj = PyIter_Next(iter);
2643 if (obj == NULL) {
2644 if (PyErr_Occurred())
2645 goto error;
2646
2647 /* Only one item to write */
2648 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2649 goto error;
2650 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2651 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002652 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002653 goto error;
2654 Py_CLEAR(firstitem);
2655 break;
2656 }
2657
2658 /* More than one item to write */
2659
2660 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002661 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002662 goto error;
2663
2664 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2665 goto error;
2666 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2667 goto error;
2668 Py_CLEAR(firstitem);
2669 n = 1;
2670
2671 /* Fetch and save up to BATCHSIZE items */
2672 while (obj) {
2673 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2674 PyErr_SetString(PyExc_TypeError, "dict items "
2675 "iterator must return 2-tuples");
2676 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002677 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002678 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2679 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2680 goto error;
2681 Py_CLEAR(obj);
2682 n += 1;
2683
2684 if (n == BATCHSIZE)
2685 break;
2686
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002687 obj = PyIter_Next(iter);
2688 if (obj == NULL) {
2689 if (PyErr_Occurred())
2690 goto error;
2691 break;
2692 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002693 }
2694
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002695 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002696 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002697
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002698 } while (n == BATCHSIZE);
2699 return 0;
2700
2701 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002702 Py_XDECREF(firstitem);
2703 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002704 return -1;
2705}
2706
Collin Winter5c9b02d2009-05-25 05:43:30 +00002707/* This is a variant of batch_dict() above that specializes for dicts, with no
2708 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2709 * MARK key value ... key value SETITEMS
2710 * opcode sequences. Calling code should have arranged to first create an
2711 * empty dict, or dict-like object, for the SETITEMS to operate on.
2712 * Returns 0 on success, -1 on error.
2713 *
2714 * Note that this currently doesn't work for protocol 0.
2715 */
2716static int
2717batch_dict_exact(PicklerObject *self, PyObject *obj)
2718{
2719 PyObject *key = NULL, *value = NULL;
2720 int i;
2721 Py_ssize_t dict_size, ppos = 0;
2722
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002723 const char mark_op = MARK;
2724 const char setitem_op = SETITEM;
2725 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002726
2727 assert(obj != NULL);
2728 assert(self->proto > 0);
2729
2730 dict_size = PyDict_Size(obj);
2731
2732 /* Special-case len(d) == 1 to save space. */
2733 if (dict_size == 1) {
2734 PyDict_Next(obj, &ppos, &key, &value);
2735 if (save(self, key, 0) < 0)
2736 return -1;
2737 if (save(self, value, 0) < 0)
2738 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002739 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002740 return -1;
2741 return 0;
2742 }
2743
2744 /* Write in batches of BATCHSIZE. */
2745 do {
2746 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002747 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002748 return -1;
2749 while (PyDict_Next(obj, &ppos, &key, &value)) {
2750 if (save(self, key, 0) < 0)
2751 return -1;
2752 if (save(self, value, 0) < 0)
2753 return -1;
2754 if (++i == BATCHSIZE)
2755 break;
2756 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002757 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002758 return -1;
2759 if (PyDict_Size(obj) != dict_size) {
2760 PyErr_Format(
2761 PyExc_RuntimeError,
2762 "dictionary changed size during iteration");
2763 return -1;
2764 }
2765
2766 } while (i == BATCHSIZE);
2767 return 0;
2768}
2769
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002770static int
2771save_dict(PicklerObject *self, PyObject *obj)
2772{
2773 PyObject *items, *iter;
2774 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002775 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002776 int status = 0;
2777
2778 if (self->fast && !fast_save_enter(self, obj))
2779 goto error;
2780
2781 /* Create an empty dict. */
2782 if (self->bin) {
2783 header[0] = EMPTY_DICT;
2784 len = 1;
2785 }
2786 else {
2787 header[0] = MARK;
2788 header[1] = DICT;
2789 len = 2;
2790 }
2791
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002792 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002793 goto error;
2794
2795 /* Get dict size, and bow out early if empty. */
2796 if ((len = PyDict_Size(obj)) < 0)
2797 goto error;
2798
2799 if (memo_put(self, obj) < 0)
2800 goto error;
2801
2802 if (len != 0) {
2803 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002804 if (PyDict_CheckExact(obj) && self->proto > 0) {
2805 /* We can take certain shortcuts if we know this is a dict and
2806 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002807 if (Py_EnterRecursiveCall(" while pickling an object"))
2808 goto error;
2809 status = batch_dict_exact(self, obj);
2810 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002811 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002812 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002813
2814 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002815 if (items == NULL)
2816 goto error;
2817 iter = PyObject_GetIter(items);
2818 Py_DECREF(items);
2819 if (iter == NULL)
2820 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002821 if (Py_EnterRecursiveCall(" while pickling an object")) {
2822 Py_DECREF(iter);
2823 goto error;
2824 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002825 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002826 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002827 Py_DECREF(iter);
2828 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002829 }
2830
2831 if (0) {
2832 error:
2833 status = -1;
2834 }
2835
2836 if (self->fast && !fast_save_leave(self, obj))
2837 status = -1;
2838
2839 return status;
2840}
2841
2842static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002843save_set(PicklerObject *self, PyObject *obj)
2844{
2845 PyObject *item;
2846 int i;
2847 Py_ssize_t set_size, ppos = 0;
2848 Py_hash_t hash;
2849
2850 const char empty_set_op = EMPTY_SET;
2851 const char mark_op = MARK;
2852 const char additems_op = ADDITEMS;
2853
2854 if (self->proto < 4) {
2855 PyObject *items;
2856 PyObject *reduce_value;
2857 int status;
2858
2859 items = PySequence_List(obj);
2860 if (items == NULL) {
2861 return -1;
2862 }
2863 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2864 Py_DECREF(items);
2865 if (reduce_value == NULL) {
2866 return -1;
2867 }
2868 /* save_reduce() will memoize the object automatically. */
2869 status = save_reduce(self, reduce_value, obj);
2870 Py_DECREF(reduce_value);
2871 return status;
2872 }
2873
2874 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2875 return -1;
2876
2877 if (memo_put(self, obj) < 0)
2878 return -1;
2879
2880 set_size = PySet_GET_SIZE(obj);
2881 if (set_size == 0)
2882 return 0; /* nothing to do */
2883
2884 /* Write in batches of BATCHSIZE. */
2885 do {
2886 i = 0;
2887 if (_Pickler_Write(self, &mark_op, 1) < 0)
2888 return -1;
2889 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2890 if (save(self, item, 0) < 0)
2891 return -1;
2892 if (++i == BATCHSIZE)
2893 break;
2894 }
2895 if (_Pickler_Write(self, &additems_op, 1) < 0)
2896 return -1;
2897 if (PySet_GET_SIZE(obj) != set_size) {
2898 PyErr_Format(
2899 PyExc_RuntimeError,
2900 "set changed size during iteration");
2901 return -1;
2902 }
2903 } while (i == BATCHSIZE);
2904
2905 return 0;
2906}
2907
2908static int
2909save_frozenset(PicklerObject *self, PyObject *obj)
2910{
2911 PyObject *iter;
2912
2913 const char mark_op = MARK;
2914 const char frozenset_op = FROZENSET;
2915
2916 if (self->fast && !fast_save_enter(self, obj))
2917 return -1;
2918
2919 if (self->proto < 4) {
2920 PyObject *items;
2921 PyObject *reduce_value;
2922 int status;
2923
2924 items = PySequence_List(obj);
2925 if (items == NULL) {
2926 return -1;
2927 }
2928 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2929 items);
2930 Py_DECREF(items);
2931 if (reduce_value == NULL) {
2932 return -1;
2933 }
2934 /* save_reduce() will memoize the object automatically. */
2935 status = save_reduce(self, reduce_value, obj);
2936 Py_DECREF(reduce_value);
2937 return status;
2938 }
2939
2940 if (_Pickler_Write(self, &mark_op, 1) < 0)
2941 return -1;
2942
2943 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002944 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002945 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002946 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002947 for (;;) {
2948 PyObject *item;
2949
2950 item = PyIter_Next(iter);
2951 if (item == NULL) {
2952 if (PyErr_Occurred()) {
2953 Py_DECREF(iter);
2954 return -1;
2955 }
2956 break;
2957 }
2958 if (save(self, item, 0) < 0) {
2959 Py_DECREF(item);
2960 Py_DECREF(iter);
2961 return -1;
2962 }
2963 Py_DECREF(item);
2964 }
2965 Py_DECREF(iter);
2966
2967 /* If the object is already in the memo, this means it is
2968 recursive. In this case, throw away everything we put on the
2969 stack, and fetch the object back from the memo. */
2970 if (PyMemoTable_Get(self->memo, obj)) {
2971 const char pop_mark_op = POP_MARK;
2972
2973 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2974 return -1;
2975 if (memo_get(self, obj) < 0)
2976 return -1;
2977 return 0;
2978 }
2979
2980 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
2981 return -1;
2982 if (memo_put(self, obj) < 0)
2983 return -1;
2984
2985 return 0;
2986}
2987
2988static int
2989fix_imports(PyObject **module_name, PyObject **global_name)
2990{
2991 PyObject *key;
2992 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002993 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002994
2995 key = PyTuple_Pack(2, *module_name, *global_name);
2996 if (key == NULL)
2997 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002998 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002999 Py_DECREF(key);
3000 if (item) {
3001 PyObject *fixed_module_name;
3002 PyObject *fixed_global_name;
3003
3004 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3005 PyErr_Format(PyExc_RuntimeError,
3006 "_compat_pickle.REVERSE_NAME_MAPPING values "
3007 "should be 2-tuples, not %.200s",
3008 Py_TYPE(item)->tp_name);
3009 return -1;
3010 }
3011 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3012 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3013 if (!PyUnicode_Check(fixed_module_name) ||
3014 !PyUnicode_Check(fixed_global_name)) {
3015 PyErr_Format(PyExc_RuntimeError,
3016 "_compat_pickle.REVERSE_NAME_MAPPING values "
3017 "should be pairs of str, not (%.200s, %.200s)",
3018 Py_TYPE(fixed_module_name)->tp_name,
3019 Py_TYPE(fixed_global_name)->tp_name);
3020 return -1;
3021 }
3022
3023 Py_CLEAR(*module_name);
3024 Py_CLEAR(*global_name);
3025 Py_INCREF(fixed_module_name);
3026 Py_INCREF(fixed_global_name);
3027 *module_name = fixed_module_name;
3028 *global_name = fixed_global_name;
3029 }
3030 else if (PyErr_Occurred()) {
3031 return -1;
3032 }
3033
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003034 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003035 if (item) {
3036 if (!PyUnicode_Check(item)) {
3037 PyErr_Format(PyExc_RuntimeError,
3038 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3039 "should be strings, not %.200s",
3040 Py_TYPE(item)->tp_name);
3041 return -1;
3042 }
3043 Py_CLEAR(*module_name);
3044 Py_INCREF(item);
3045 *module_name = item;
3046 }
3047 else if (PyErr_Occurred()) {
3048 return -1;
3049 }
3050
3051 return 0;
3052}
3053
3054static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003055save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3056{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003057 PyObject *global_name = NULL;
3058 PyObject *module_name = NULL;
3059 PyObject *module = NULL;
3060 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003061 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003062 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003063 _Py_IDENTIFIER(__name__);
3064 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003065
3066 const char global_op = GLOBAL;
3067
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003068 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003069 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003070 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003071 }
3072 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003073 if (self->proto >= 4) {
3074 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3075 if (global_name == NULL) {
3076 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3077 goto error;
3078 PyErr_Clear();
3079 }
3080 }
3081 if (global_name == NULL) {
3082 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3083 if (global_name == NULL)
3084 goto error;
3085 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003086 }
3087
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003088 module_name = whichmodule(obj, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003089 if (module_name == NULL)
3090 goto error;
3091
3092 /* XXX: Change to use the import C API directly with level=0 to disallow
3093 relative imports.
3094
3095 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3096 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3097 custom import functions (IMHO, this would be a nice security
3098 feature). The import C API would need to be extended to support the
3099 extra parameters of __import__ to fix that. */
3100 module = PyImport_Import(module_name);
3101 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003102 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003103 "Can't pickle %R: import of module %R failed",
3104 obj, module_name);
3105 goto error;
3106 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003107 cls = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003108 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003109 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003110 "Can't pickle %R: attribute lookup %S on %S failed",
3111 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003112 goto error;
3113 }
3114 if (cls != obj) {
3115 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003116 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003117 "Can't pickle %R: it's not the same object as %S.%S",
3118 obj, module_name, global_name);
3119 goto error;
3120 }
3121 Py_DECREF(cls);
3122
3123 if (self->proto >= 2) {
3124 /* See whether this is in the extension registry, and if
3125 * so generate an EXT opcode.
3126 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003127 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003128 PyObject *code_obj; /* extension code as Python object */
3129 long code; /* extension code as C value */
3130 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003131 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003132
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003133 extension_key = PyTuple_Pack(2, module_name, global_name);
3134 if (extension_key == NULL) {
3135 goto error;
3136 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003137 code_obj = PyDict_GetItemWithError(st->extension_registry,
3138 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003139 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003140 /* The object is not registered in the extension registry.
3141 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003142 if (code_obj == NULL) {
3143 if (PyErr_Occurred()) {
3144 goto error;
3145 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003146 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003147 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003148
3149 /* XXX: pickle.py doesn't check neither the type, nor the range
3150 of the value returned by the extension_registry. It should for
3151 consistency. */
3152
3153 /* Verify code_obj has the right type and value. */
3154 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003155 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003156 "Can't pickle %R: extension code %R isn't an integer",
3157 obj, code_obj);
3158 goto error;
3159 }
3160 code = PyLong_AS_LONG(code_obj);
3161 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003162 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003163 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3164 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003165 goto error;
3166 }
3167
3168 /* Generate an EXT opcode. */
3169 if (code <= 0xff) {
3170 pdata[0] = EXT1;
3171 pdata[1] = (unsigned char)code;
3172 n = 2;
3173 }
3174 else if (code <= 0xffff) {
3175 pdata[0] = EXT2;
3176 pdata[1] = (unsigned char)(code & 0xff);
3177 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3178 n = 3;
3179 }
3180 else {
3181 pdata[0] = EXT4;
3182 pdata[1] = (unsigned char)(code & 0xff);
3183 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3184 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3185 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3186 n = 5;
3187 }
3188
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003189 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003190 goto error;
3191 }
3192 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003193 gen_global:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003194 if (self->proto >= 4) {
3195 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003196
Christian Heimese8b1ba12013-11-23 21:13:39 +01003197 if (save(self, module_name, 0) < 0)
3198 goto error;
3199 if (save(self, global_name, 0) < 0)
3200 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003201
3202 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3203 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003204 }
3205 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003206 /* Generate a normal global opcode if we are using a pickle
3207 protocol < 4, or if the object is not registered in the
3208 extension registry. */
3209 PyObject *encoded;
3210 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003211
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003212 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003213 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003214
3215 /* For protocol < 3 and if the user didn't request against doing
3216 so, we convert module names to the old 2.x module names. */
3217 if (self->proto < 3 && self->fix_imports) {
3218 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003219 goto error;
3220 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003221 }
3222
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003223 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3224 both the module name and the global name using UTF-8. We do so
3225 only when we are using the pickle protocol newer than version
3226 3. This is to ensure compatibility with older Unpickler running
3227 on Python 2.x. */
3228 if (self->proto == 3) {
3229 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003230 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003231 else {
3232 unicode_encoder = PyUnicode_AsASCIIString;
3233 }
3234 encoded = unicode_encoder(module_name);
3235 if (encoded == NULL) {
3236 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003237 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003238 "can't pickle module identifier '%S' using "
3239 "pickle protocol %i",
3240 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003241 goto error;
3242 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003243 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3244 PyBytes_GET_SIZE(encoded)) < 0) {
3245 Py_DECREF(encoded);
3246 goto error;
3247 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003248 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003249 if(_Pickler_Write(self, "\n", 1) < 0)
3250 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003251
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003252 /* Save the name of the module. */
3253 encoded = unicode_encoder(global_name);
3254 if (encoded == NULL) {
3255 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003256 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003257 "can't pickle global identifier '%S' using "
3258 "pickle protocol %i",
3259 global_name, self->proto);
3260 goto error;
3261 }
3262 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3263 PyBytes_GET_SIZE(encoded)) < 0) {
3264 Py_DECREF(encoded);
3265 goto error;
3266 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003267 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003268 if (_Pickler_Write(self, "\n", 1) < 0)
3269 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003270 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003271 /* Memoize the object. */
3272 if (memo_put(self, obj) < 0)
3273 goto error;
3274 }
3275
3276 if (0) {
3277 error:
3278 status = -1;
3279 }
3280 Py_XDECREF(module_name);
3281 Py_XDECREF(global_name);
3282 Py_XDECREF(module);
3283
3284 return status;
3285}
3286
3287static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003288save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3289{
3290 PyObject *reduce_value;
3291 int status;
3292
3293 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3294 if (reduce_value == NULL) {
3295 return -1;
3296 }
3297 status = save_reduce(self, reduce_value, obj);
3298 Py_DECREF(reduce_value);
3299 return status;
3300}
3301
3302static int
3303save_type(PicklerObject *self, PyObject *obj)
3304{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003305 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003306 return save_singleton_type(self, obj, Py_None);
3307 }
3308 else if (obj == (PyObject *)&PyEllipsis_Type) {
3309 return save_singleton_type(self, obj, Py_Ellipsis);
3310 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003311 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003312 return save_singleton_type(self, obj, Py_NotImplemented);
3313 }
3314 return save_global(self, obj, NULL);
3315}
3316
3317static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003318save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3319{
3320 PyObject *pid = NULL;
3321 int status = 0;
3322
3323 const char persid_op = PERSID;
3324 const char binpersid_op = BINPERSID;
3325
3326 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003327 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003328 if (pid == NULL)
3329 return -1;
3330
3331 if (pid != Py_None) {
3332 if (self->bin) {
3333 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003334 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003335 goto error;
3336 }
3337 else {
3338 PyObject *pid_str = NULL;
3339 char *pid_ascii_bytes;
3340 Py_ssize_t size;
3341
3342 pid_str = PyObject_Str(pid);
3343 if (pid_str == NULL)
3344 goto error;
3345
3346 /* XXX: Should it check whether the persistent id only contains
3347 ASCII characters? And what if the pid contains embedded
3348 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003349 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003350 Py_DECREF(pid_str);
3351 if (pid_ascii_bytes == NULL)
3352 goto error;
3353
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003354 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3355 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3356 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003357 goto error;
3358 }
3359 status = 1;
3360 }
3361
3362 if (0) {
3363 error:
3364 status = -1;
3365 }
3366 Py_XDECREF(pid);
3367
3368 return status;
3369}
3370
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003371static PyObject *
3372get_class(PyObject *obj)
3373{
3374 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003375 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003376
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003377 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003378 if (cls == NULL) {
3379 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3380 PyErr_Clear();
3381 cls = (PyObject *) Py_TYPE(obj);
3382 Py_INCREF(cls);
3383 }
3384 }
3385 return cls;
3386}
3387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003388/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3389 * appropriate __reduce__ method for obj.
3390 */
3391static int
3392save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3393{
3394 PyObject *callable;
3395 PyObject *argtup;
3396 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003397 PyObject *listitems = Py_None;
3398 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003399 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003400 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003401 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003402
3403 const char reduce_op = REDUCE;
3404 const char build_op = BUILD;
3405 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003406 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003407
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003408 size = PyTuple_Size(args);
3409 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003410 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003411 "__reduce__ must contain 2 through 5 elements");
3412 return -1;
3413 }
3414
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003415 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3416 &callable, &argtup, &state, &listitems, &dictitems))
3417 return -1;
3418
3419 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003420 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003421 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003422 return -1;
3423 }
3424 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003425 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003426 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003427 return -1;
3428 }
3429
3430 if (state == Py_None)
3431 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003432
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003433 if (listitems == Py_None)
3434 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003435 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003436 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003437 "returned by __reduce__ must be an iterator, not %s",
3438 Py_TYPE(listitems)->tp_name);
3439 return -1;
3440 }
3441
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003442 if (dictitems == Py_None)
3443 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003444 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003445 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003446 "returned by __reduce__ must be an iterator, not %s",
3447 Py_TYPE(dictitems)->tp_name);
3448 return -1;
3449 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003450
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003451 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003452 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003453 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003454
Victor Stinner804e05e2013-11-14 01:26:17 +01003455 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003456 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003457 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003458 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003459 }
3460 PyErr_Clear();
3461 }
3462 else if (self->proto >= 4) {
3463 _Py_IDENTIFIER(__newobj_ex__);
3464 use_newobj_ex = PyUnicode_Check(name) &&
3465 PyUnicode_Compare(
3466 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3467 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003468 }
3469 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003470 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003471 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003472 PyUnicode_Compare(
3473 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003474 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003475 }
3476 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003477
3478 if (use_newobj_ex) {
3479 PyObject *cls;
3480 PyObject *args;
3481 PyObject *kwargs;
3482
3483 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003484 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003485 "length of the NEWOBJ_EX argument tuple must be "
3486 "exactly 3, not %zd", Py_SIZE(argtup));
3487 return -1;
3488 }
3489
3490 cls = PyTuple_GET_ITEM(argtup, 0);
3491 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003492 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003493 "first item from NEWOBJ_EX argument tuple must "
3494 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3495 return -1;
3496 }
3497 args = PyTuple_GET_ITEM(argtup, 1);
3498 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003499 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003500 "second item from NEWOBJ_EX argument tuple must "
3501 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3502 return -1;
3503 }
3504 kwargs = PyTuple_GET_ITEM(argtup, 2);
3505 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003506 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003507 "third item from NEWOBJ_EX argument tuple must "
3508 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3509 return -1;
3510 }
3511
3512 if (save(self, cls, 0) < 0 ||
3513 save(self, args, 0) < 0 ||
3514 save(self, kwargs, 0) < 0 ||
3515 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3516 return -1;
3517 }
3518 }
3519 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003520 PyObject *cls;
3521 PyObject *newargtup;
3522 PyObject *obj_class;
3523 int p;
3524
3525 /* Sanity checks. */
3526 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003527 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003528 return -1;
3529 }
3530
3531 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003532 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003533 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003534 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003535 return -1;
3536 }
3537
3538 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003539 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003540 p = obj_class != cls; /* true iff a problem */
3541 Py_DECREF(obj_class);
3542 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003543 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003544 "__newobj__ args has the wrong class");
3545 return -1;
3546 }
3547 }
3548 /* XXX: These calls save() are prone to infinite recursion. Imagine
3549 what happen if the value returned by the __reduce__() method of
3550 some extension type contains another object of the same type. Ouch!
3551
3552 Here is a quick example, that I ran into, to illustrate what I
3553 mean:
3554
3555 >>> import pickle, copyreg
3556 >>> copyreg.dispatch_table.pop(complex)
3557 >>> pickle.dumps(1+2j)
3558 Traceback (most recent call last):
3559 ...
3560 RuntimeError: maximum recursion depth exceeded
3561
3562 Removing the complex class from copyreg.dispatch_table made the
3563 __reduce_ex__() method emit another complex object:
3564
3565 >>> (1+1j).__reduce_ex__(2)
3566 (<function __newobj__ at 0xb7b71c3c>,
3567 (<class 'complex'>, (1+1j)), None, None, None)
3568
3569 Thus when save() was called on newargstup (the 2nd item) recursion
3570 ensued. Of course, the bug was in the complex class which had a
3571 broken __getnewargs__() that emitted another complex object. But,
3572 the point, here, is it is quite easy to end up with a broken reduce
3573 function. */
3574
3575 /* Save the class and its __new__ arguments. */
3576 if (save(self, cls, 0) < 0)
3577 return -1;
3578
3579 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3580 if (newargtup == NULL)
3581 return -1;
3582
3583 p = save(self, newargtup, 0);
3584 Py_DECREF(newargtup);
3585 if (p < 0)
3586 return -1;
3587
3588 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003589 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003590 return -1;
3591 }
3592 else { /* Not using NEWOBJ. */
3593 if (save(self, callable, 0) < 0 ||
3594 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003595 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003596 return -1;
3597 }
3598
3599 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3600 the caller do not want to memoize the object. Not particularly useful,
3601 but that is to mimic the behavior save_reduce() in pickle.py when
3602 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003603 if (obj != NULL) {
3604 /* If the object is already in the memo, this means it is
3605 recursive. In this case, throw away everything we put on the
3606 stack, and fetch the object back from the memo. */
3607 if (PyMemoTable_Get(self->memo, obj)) {
3608 const char pop_op = POP;
3609
3610 if (_Pickler_Write(self, &pop_op, 1) < 0)
3611 return -1;
3612 if (memo_get(self, obj) < 0)
3613 return -1;
3614
3615 return 0;
3616 }
3617 else if (memo_put(self, obj) < 0)
3618 return -1;
3619 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003620
3621 if (listitems && batch_list(self, listitems) < 0)
3622 return -1;
3623
3624 if (dictitems && batch_dict(self, dictitems) < 0)
3625 return -1;
3626
3627 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003628 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003629 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003630 return -1;
3631 }
3632
3633 return 0;
3634}
3635
3636static int
3637save(PicklerObject *self, PyObject *obj, int pers_save)
3638{
3639 PyTypeObject *type;
3640 PyObject *reduce_func = NULL;
3641 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003642 int status = 0;
3643
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003644 if (_Pickler_OpcodeBoundary(self) < 0)
3645 return -1;
3646
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003647 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003648 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003649
3650 /* The extra pers_save argument is necessary to avoid calling save_pers()
3651 on its returned object. */
3652 if (!pers_save && self->pers_func) {
3653 /* save_pers() returns:
3654 -1 to signal an error;
3655 0 if it did nothing successfully;
3656 1 if a persistent id was saved.
3657 */
3658 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3659 goto done;
3660 }
3661
3662 type = Py_TYPE(obj);
3663
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003664 /* The old cPickle had an optimization that used switch-case statement
3665 dispatching on the first letter of the type name. This has was removed
3666 since benchmarks shown that this optimization was actually slowing
3667 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003668
3669 /* Atom types; these aren't memoized, so don't check the memo. */
3670
3671 if (obj == Py_None) {
3672 status = save_none(self, obj);
3673 goto done;
3674 }
3675 else if (obj == Py_False || obj == Py_True) {
3676 status = save_bool(self, obj);
3677 goto done;
3678 }
3679 else if (type == &PyLong_Type) {
3680 status = save_long(self, obj);
3681 goto done;
3682 }
3683 else if (type == &PyFloat_Type) {
3684 status = save_float(self, obj);
3685 goto done;
3686 }
3687
3688 /* Check the memo to see if it has the object. If so, generate
3689 a GET (or BINGET) opcode, instead of pickling the object
3690 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003691 if (PyMemoTable_Get(self->memo, obj)) {
3692 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003693 goto error;
3694 goto done;
3695 }
3696
3697 if (type == &PyBytes_Type) {
3698 status = save_bytes(self, obj);
3699 goto done;
3700 }
3701 else if (type == &PyUnicode_Type) {
3702 status = save_unicode(self, obj);
3703 goto done;
3704 }
3705 else if (type == &PyDict_Type) {
3706 status = save_dict(self, obj);
3707 goto done;
3708 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003709 else if (type == &PySet_Type) {
3710 status = save_set(self, obj);
3711 goto done;
3712 }
3713 else if (type == &PyFrozenSet_Type) {
3714 status = save_frozenset(self, obj);
3715 goto done;
3716 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003717 else if (type == &PyList_Type) {
3718 status = save_list(self, obj);
3719 goto done;
3720 }
3721 else if (type == &PyTuple_Type) {
3722 status = save_tuple(self, obj);
3723 goto done;
3724 }
3725 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003726 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003727 goto done;
3728 }
3729 else if (type == &PyFunction_Type) {
3730 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003731 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003732 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003733
3734 /* XXX: This part needs some unit tests. */
3735
3736 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003737 * self.dispatch_table, copyreg.dispatch_table, the object's
3738 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003739 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003740 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003741 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003742 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3743 (PyObject *)type);
3744 if (reduce_func == NULL) {
3745 if (PyErr_Occurred()) {
3746 goto error;
3747 }
3748 } else {
3749 /* PyDict_GetItemWithError() returns a borrowed reference.
3750 Increase the reference count to be consistent with
3751 PyObject_GetItem and _PyObject_GetAttrId used below. */
3752 Py_INCREF(reduce_func);
3753 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003754 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003755 reduce_func = PyObject_GetItem(self->dispatch_table,
3756 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003757 if (reduce_func == NULL) {
3758 if (PyErr_ExceptionMatches(PyExc_KeyError))
3759 PyErr_Clear();
3760 else
3761 goto error;
3762 }
3763 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003764 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003766 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003767 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003768 else if (PyType_IsSubtype(type, &PyType_Type)) {
3769 status = save_global(self, obj, NULL);
3770 goto done;
3771 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003772 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003773 _Py_IDENTIFIER(__reduce__);
3774 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003775
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003776
3777 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3778 automatically defined as __reduce__. While this is convenient, this
3779 make it impossible to know which method was actually called. Of
3780 course, this is not a big deal. But still, it would be nice to let
3781 the user know which method was called when something go
3782 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3783 don't actually have to check for a __reduce__ method. */
3784
3785 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003786 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003787 if (reduce_func != NULL) {
3788 PyObject *proto;
3789 proto = PyLong_FromLong(self->proto);
3790 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003791 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003792 }
3793 }
3794 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003795 PickleState *st = _Pickle_GetGlobalState();
3796
3797 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003798 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003799 }
3800 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003801 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003802 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003803 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003804 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003805 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003806 PyObject *empty_tuple = PyTuple_New(0);
3807 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003808 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003809 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003810 }
3811 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003812 PyErr_Format(st->PicklingError,
3813 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003814 type->tp_name, obj);
3815 goto error;
3816 }
3817 }
3818 }
3819
3820 if (reduce_value == NULL)
3821 goto error;
3822
3823 if (PyUnicode_Check(reduce_value)) {
3824 status = save_global(self, obj, reduce_value);
3825 goto done;
3826 }
3827
3828 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003829 PickleState *st = _Pickle_GetGlobalState();
3830 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003831 "__reduce__ must return a string or tuple");
3832 goto error;
3833 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003834
3835 status = save_reduce(self, reduce_value, obj);
3836
3837 if (0) {
3838 error:
3839 status = -1;
3840 }
3841 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003842
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003843 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003844 Py_XDECREF(reduce_func);
3845 Py_XDECREF(reduce_value);
3846
3847 return status;
3848}
3849
3850static int
3851dump(PicklerObject *self, PyObject *obj)
3852{
3853 const char stop_op = STOP;
3854
3855 if (self->proto >= 2) {
3856 char header[2];
3857
3858 header[0] = PROTO;
3859 assert(self->proto >= 0 && self->proto < 256);
3860 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003861 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003862 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003863 if (self->proto >= 4)
3864 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003865 }
3866
3867 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003868 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003869 return -1;
3870
3871 return 0;
3872}
3873
Larry Hastings61272b72014-01-07 12:41:53 -08003874/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003875
3876_pickle.Pickler.clear_memo
3877
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003878Clears the pickler's "memo".
3879
3880The memo is the data structure that remembers which objects the
3881pickler has already seen, so that shared or recursive objects are
3882pickled by reference and not by value. This method is useful when
3883re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003884[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003885
Larry Hastings3cceb382014-01-04 11:09:09 -08003886static PyObject *
3887_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02003888/*[clinic end generated code: checksum=8665c8658aaa094ba9b424d3d7fe0add5e8142ab]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003889{
3890 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003891 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003892
3893 Py_RETURN_NONE;
3894}
3895
Larry Hastings61272b72014-01-07 12:41:53 -08003896/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003897
3898_pickle.Pickler.dump
3899
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003900 obj: object
3901 /
3902
3903Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003904[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003905
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003906static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003907_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02003908/*[clinic end generated code: checksum=87ecad1261e02ac7ad0b051467b61bb058ae55b3]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003909{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003910 /* Check whether the Pickler was initialized correctly (issue3664).
3911 Developers often forget to call __init__() in their subclasses, which
3912 would trigger a segfault without this check. */
3913 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003914 PickleState *st = _Pickle_GetGlobalState();
3915 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003916 "Pickler.__init__() was not called by %s.__init__()",
3917 Py_TYPE(self)->tp_name);
3918 return NULL;
3919 }
3920
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003921 if (_Pickler_ClearBuffer(self) < 0)
3922 return NULL;
3923
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003924 if (dump(self, obj) < 0)
3925 return NULL;
3926
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003927 if (_Pickler_FlushToFile(self) < 0)
3928 return NULL;
3929
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003930 Py_RETURN_NONE;
3931}
3932
3933static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003934 _PICKLE_PICKLER_DUMP_METHODDEF
3935 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003936 {NULL, NULL} /* sentinel */
3937};
3938
3939static void
3940Pickler_dealloc(PicklerObject *self)
3941{
3942 PyObject_GC_UnTrack(self);
3943
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003944 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003945 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003946 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003947 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003948 Py_XDECREF(self->fast_memo);
3949
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003950 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003951
3952 Py_TYPE(self)->tp_free((PyObject *)self);
3953}
3954
3955static int
3956Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
3957{
3958 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003959 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003960 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003961 Py_VISIT(self->fast_memo);
3962 return 0;
3963}
3964
3965static int
3966Pickler_clear(PicklerObject *self)
3967{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003968 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003969 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003970 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003971 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003972 Py_CLEAR(self->fast_memo);
3973
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003974 if (self->memo != NULL) {
3975 PyMemoTable *memo = self->memo;
3976 self->memo = NULL;
3977 PyMemoTable_Del(memo);
3978 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003979 return 0;
3980}
3981
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003982
Larry Hastings61272b72014-01-07 12:41:53 -08003983/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003984
3985_pickle.Pickler.__init__
3986
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003987 file: object
3988 protocol: object = NULL
3989 fix_imports: bool = True
3990
3991This takes a binary file for writing a pickle data stream.
3992
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08003993The optional *protocol* argument tells the pickler to use the given
3994protocol; supported protocols are 0, 1, 2, 3 and 4. The default
3995protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003996
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08003997Specifying a negative protocol version selects the highest protocol
3998version supported. The higher the protocol used, the more recent the
3999version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004000
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004001The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004002bytes argument. It can thus be a file object opened for binary
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004003writing, a io.BytesIO instance, or any other custom object that meets
4004this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004005
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004006If *fix_imports* is True and protocol is less than 3, pickle will try
4007to map the new Python 3 names to the old module names used in Python
40082, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004009[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004010
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004011static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004012_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02004013/*[clinic end generated code: checksum=56e229f3b1f4332fbfe28a33e43dae836a8dab43]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004014{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004015 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004016 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004017
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004018 /* In case of multiple __init__() calls, clear previous content. */
4019 if (self->write != NULL)
4020 (void)Pickler_clear(self);
4021
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004022 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004023 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004024
4025 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004026 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004027
4028 /* memo and output_buffer may have already been created in _Pickler_New */
4029 if (self->memo == NULL) {
4030 self->memo = PyMemoTable_New();
4031 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004032 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004033 }
4034 self->output_len = 0;
4035 if (self->output_buffer == NULL) {
4036 self->max_output_len = WRITE_BUF_SIZE;
4037 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4038 self->max_output_len);
4039 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004040 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004041 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004042
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004043 self->fast = 0;
4044 self->fast_nesting = 0;
4045 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004046 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004047 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4048 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4049 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004050 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004051 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004052 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004053 self->dispatch_table = NULL;
4054 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4055 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4056 &PyId_dispatch_table);
4057 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004058 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004059 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004060
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004061 return 0;
4062}
4063
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004064
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004065/* Define a proxy object for the Pickler's internal memo object. This is to
4066 * avoid breaking code like:
4067 * pickler.memo.clear()
4068 * and
4069 * pickler.memo = saved_memo
4070 * Is this a good idea? Not really, but we don't want to break code that uses
4071 * it. Note that we don't implement the entire mapping API here. This is
4072 * intentional, as these should be treated as black-box implementation details.
4073 */
4074
Larry Hastings61272b72014-01-07 12:41:53 -08004075/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004076_pickle.PicklerMemoProxy.clear
4077
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004078Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004079[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004080
Larry Hastings3cceb382014-01-04 11:09:09 -08004081static PyObject *
4082_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02004083/*[clinic end generated code: checksum=5fb9370d48ae8b055fc72518a2b12d1714338078]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004084{
4085 if (self->pickler->memo)
4086 PyMemoTable_Clear(self->pickler->memo);
4087 Py_RETURN_NONE;
4088}
4089
Larry Hastings61272b72014-01-07 12:41:53 -08004090/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004091_pickle.PicklerMemoProxy.copy
4092
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004093Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004094[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004095
Larry Hastings3cceb382014-01-04 11:09:09 -08004096static PyObject *
4097_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02004098/*[clinic end generated code: checksum=bb83a919d29225ef55ba0ecfca002369ea4eb8ea]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004099{
4100 Py_ssize_t i;
4101 PyMemoTable *memo;
4102 PyObject *new_memo = PyDict_New();
4103 if (new_memo == NULL)
4104 return NULL;
4105
4106 memo = self->pickler->memo;
4107 for (i = 0; i < memo->mt_allocated; ++i) {
4108 PyMemoEntry entry = memo->mt_table[i];
4109 if (entry.me_key != NULL) {
4110 int status;
4111 PyObject *key, *value;
4112
4113 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004114 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004115
4116 if (key == NULL || value == NULL) {
4117 Py_XDECREF(key);
4118 Py_XDECREF(value);
4119 goto error;
4120 }
4121 status = PyDict_SetItem(new_memo, key, value);
4122 Py_DECREF(key);
4123 Py_DECREF(value);
4124 if (status < 0)
4125 goto error;
4126 }
4127 }
4128 return new_memo;
4129
4130 error:
4131 Py_XDECREF(new_memo);
4132 return NULL;
4133}
4134
Larry Hastings61272b72014-01-07 12:41:53 -08004135/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004136_pickle.PicklerMemoProxy.__reduce__
4137
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004138Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004139[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004140
Larry Hastings3cceb382014-01-04 11:09:09 -08004141static PyObject *
4142_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02004143/*[clinic end generated code: checksum=bebba1168863ab1d6560ad707d0f4ab41deb722d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004144{
4145 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004146 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004147 if (contents == NULL)
4148 return NULL;
4149
4150 reduce_value = PyTuple_New(2);
4151 if (reduce_value == NULL) {
4152 Py_DECREF(contents);
4153 return NULL;
4154 }
4155 dict_args = PyTuple_New(1);
4156 if (dict_args == NULL) {
4157 Py_DECREF(contents);
4158 Py_DECREF(reduce_value);
4159 return NULL;
4160 }
4161 PyTuple_SET_ITEM(dict_args, 0, contents);
4162 Py_INCREF((PyObject *)&PyDict_Type);
4163 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4164 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4165 return reduce_value;
4166}
4167
4168static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004169 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4170 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4171 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004172 {NULL, NULL} /* sentinel */
4173};
4174
4175static void
4176PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4177{
4178 PyObject_GC_UnTrack(self);
4179 Py_XDECREF(self->pickler);
4180 PyObject_GC_Del((PyObject *)self);
4181}
4182
4183static int
4184PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4185 visitproc visit, void *arg)
4186{
4187 Py_VISIT(self->pickler);
4188 return 0;
4189}
4190
4191static int
4192PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4193{
4194 Py_CLEAR(self->pickler);
4195 return 0;
4196}
4197
4198static PyTypeObject PicklerMemoProxyType = {
4199 PyVarObject_HEAD_INIT(NULL, 0)
4200 "_pickle.PicklerMemoProxy", /*tp_name*/
4201 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4202 0,
4203 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4204 0, /* tp_print */
4205 0, /* tp_getattr */
4206 0, /* tp_setattr */
4207 0, /* tp_compare */
4208 0, /* tp_repr */
4209 0, /* tp_as_number */
4210 0, /* tp_as_sequence */
4211 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004212 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004213 0, /* tp_call */
4214 0, /* tp_str */
4215 PyObject_GenericGetAttr, /* tp_getattro */
4216 PyObject_GenericSetAttr, /* tp_setattro */
4217 0, /* tp_as_buffer */
4218 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4219 0, /* tp_doc */
4220 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4221 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4222 0, /* tp_richcompare */
4223 0, /* tp_weaklistoffset */
4224 0, /* tp_iter */
4225 0, /* tp_iternext */
4226 picklerproxy_methods, /* tp_methods */
4227};
4228
4229static PyObject *
4230PicklerMemoProxy_New(PicklerObject *pickler)
4231{
4232 PicklerMemoProxyObject *self;
4233
4234 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4235 if (self == NULL)
4236 return NULL;
4237 Py_INCREF(pickler);
4238 self->pickler = pickler;
4239 PyObject_GC_Track(self);
4240 return (PyObject *)self;
4241}
4242
4243/*****************************************************************************/
4244
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004245static PyObject *
4246Pickler_get_memo(PicklerObject *self)
4247{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004248 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004249}
4250
4251static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004252Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004253{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004254 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004255
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004256 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004257 PyErr_SetString(PyExc_TypeError,
4258 "attribute deletion is not supported");
4259 return -1;
4260 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004261
4262 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4263 PicklerObject *pickler =
4264 ((PicklerMemoProxyObject *)obj)->pickler;
4265
4266 new_memo = PyMemoTable_Copy(pickler->memo);
4267 if (new_memo == NULL)
4268 return -1;
4269 }
4270 else if (PyDict_Check(obj)) {
4271 Py_ssize_t i = 0;
4272 PyObject *key, *value;
4273
4274 new_memo = PyMemoTable_New();
4275 if (new_memo == NULL)
4276 return -1;
4277
4278 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004279 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004280 PyObject *memo_obj;
4281
4282 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4283 PyErr_SetString(PyExc_TypeError,
4284 "'memo' values must be 2-item tuples");
4285 goto error;
4286 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004287 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004288 if (memo_id == -1 && PyErr_Occurred())
4289 goto error;
4290 memo_obj = PyTuple_GET_ITEM(value, 1);
4291 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4292 goto error;
4293 }
4294 }
4295 else {
4296 PyErr_Format(PyExc_TypeError,
4297 "'memo' attribute must be an PicklerMemoProxy object"
4298 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004299 return -1;
4300 }
4301
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004302 PyMemoTable_Del(self->memo);
4303 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004304
4305 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004306
4307 error:
4308 if (new_memo)
4309 PyMemoTable_Del(new_memo);
4310 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004311}
4312
4313static PyObject *
4314Pickler_get_persid(PicklerObject *self)
4315{
4316 if (self->pers_func == NULL)
4317 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4318 else
4319 Py_INCREF(self->pers_func);
4320 return self->pers_func;
4321}
4322
4323static int
4324Pickler_set_persid(PicklerObject *self, PyObject *value)
4325{
4326 PyObject *tmp;
4327
4328 if (value == NULL) {
4329 PyErr_SetString(PyExc_TypeError,
4330 "attribute deletion is not supported");
4331 return -1;
4332 }
4333 if (!PyCallable_Check(value)) {
4334 PyErr_SetString(PyExc_TypeError,
4335 "persistent_id must be a callable taking one argument");
4336 return -1;
4337 }
4338
4339 tmp = self->pers_func;
4340 Py_INCREF(value);
4341 self->pers_func = value;
4342 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4343
4344 return 0;
4345}
4346
4347static PyMemberDef Pickler_members[] = {
4348 {"bin", T_INT, offsetof(PicklerObject, bin)},
4349 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004350 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004351 {NULL}
4352};
4353
4354static PyGetSetDef Pickler_getsets[] = {
4355 {"memo", (getter)Pickler_get_memo,
4356 (setter)Pickler_set_memo},
4357 {"persistent_id", (getter)Pickler_get_persid,
4358 (setter)Pickler_set_persid},
4359 {NULL}
4360};
4361
4362static PyTypeObject Pickler_Type = {
4363 PyVarObject_HEAD_INIT(NULL, 0)
4364 "_pickle.Pickler" , /*tp_name*/
4365 sizeof(PicklerObject), /*tp_basicsize*/
4366 0, /*tp_itemsize*/
4367 (destructor)Pickler_dealloc, /*tp_dealloc*/
4368 0, /*tp_print*/
4369 0, /*tp_getattr*/
4370 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004371 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004372 0, /*tp_repr*/
4373 0, /*tp_as_number*/
4374 0, /*tp_as_sequence*/
4375 0, /*tp_as_mapping*/
4376 0, /*tp_hash*/
4377 0, /*tp_call*/
4378 0, /*tp_str*/
4379 0, /*tp_getattro*/
4380 0, /*tp_setattro*/
4381 0, /*tp_as_buffer*/
4382 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004383 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004384 (traverseproc)Pickler_traverse, /*tp_traverse*/
4385 (inquiry)Pickler_clear, /*tp_clear*/
4386 0, /*tp_richcompare*/
4387 0, /*tp_weaklistoffset*/
4388 0, /*tp_iter*/
4389 0, /*tp_iternext*/
4390 Pickler_methods, /*tp_methods*/
4391 Pickler_members, /*tp_members*/
4392 Pickler_getsets, /*tp_getset*/
4393 0, /*tp_base*/
4394 0, /*tp_dict*/
4395 0, /*tp_descr_get*/
4396 0, /*tp_descr_set*/
4397 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004398 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004399 PyType_GenericAlloc, /*tp_alloc*/
4400 PyType_GenericNew, /*tp_new*/
4401 PyObject_GC_Del, /*tp_free*/
4402 0, /*tp_is_gc*/
4403};
4404
Victor Stinner121aab42011-09-29 23:40:53 +02004405/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004406
4407 XXX: It would be nice to able to avoid Python function call overhead, by
4408 using directly the C version of find_class(), when find_class() is not
4409 overridden by a subclass. Although, this could become rather hackish. A
4410 simpler optimization would be to call the C function when self is not a
4411 subclass instance. */
4412static PyObject *
4413find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4414{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004415 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004416
4417 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4418 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004419}
4420
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004421static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004422marker(UnpicklerObject *self)
4423{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004424 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004425 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004426 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004427 return -1;
4428 }
4429
4430 return self->marks[--self->num_marks];
4431}
4432
4433static int
4434load_none(UnpicklerObject *self)
4435{
4436 PDATA_APPEND(self->stack, Py_None, -1);
4437 return 0;
4438}
4439
4440static int
4441bad_readline(void)
4442{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004443 PickleState *st = _Pickle_GetGlobalState();
4444 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004445 return -1;
4446}
4447
4448static int
4449load_int(UnpicklerObject *self)
4450{
4451 PyObject *value;
4452 char *endptr, *s;
4453 Py_ssize_t len;
4454 long x;
4455
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004456 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004457 return -1;
4458 if (len < 2)
4459 return bad_readline();
4460
4461 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004462 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004463 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004464 x = strtol(s, &endptr, 0);
4465
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004466 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004467 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004468 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004469 errno = 0;
4470 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004471 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004472 if (value == NULL) {
4473 PyErr_SetString(PyExc_ValueError,
4474 "could not convert string to int");
4475 return -1;
4476 }
4477 }
4478 else {
4479 if (len == 3 && (x == 0 || x == 1)) {
4480 if ((value = PyBool_FromLong(x)) == NULL)
4481 return -1;
4482 }
4483 else {
4484 if ((value = PyLong_FromLong(x)) == NULL)
4485 return -1;
4486 }
4487 }
4488
4489 PDATA_PUSH(self->stack, value, -1);
4490 return 0;
4491}
4492
4493static int
4494load_bool(UnpicklerObject *self, PyObject *boolean)
4495{
4496 assert(boolean == Py_True || boolean == Py_False);
4497 PDATA_APPEND(self->stack, boolean, -1);
4498 return 0;
4499}
4500
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004501/* s contains x bytes of an unsigned little-endian integer. Return its value
4502 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4503 */
4504static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004505calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004506{
4507 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004508 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004509 size_t x = 0;
4510
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004511 for (i = 0; i < nbytes && i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004512 x |= (size_t) s[i] << (8 * i);
4513 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004514
4515 if (x > PY_SSIZE_T_MAX)
4516 return -1;
4517 else
4518 return (Py_ssize_t) x;
4519}
4520
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004521/* s contains x bytes of a little-endian integer. Return its value as a
4522 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4523 * int, but when x is 4 it's a signed one. This is an historical source
4524 * of x-platform bugs.
4525 */
4526static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004527calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004528{
4529 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004530 int i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004531 long x = 0;
4532
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004533 for (i = 0; i < nbytes; i++) {
4534 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004535 }
4536
4537 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4538 * is signed, so on a box with longs bigger than 4 bytes we need
4539 * to extend a BININT's sign bit to the full width.
4540 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004541 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004542 x |= -(x & (1L << 31));
4543 }
4544
4545 return x;
4546}
4547
4548static int
4549load_binintx(UnpicklerObject *self, char *s, int size)
4550{
4551 PyObject *value;
4552 long x;
4553
4554 x = calc_binint(s, size);
4555
4556 if ((value = PyLong_FromLong(x)) == NULL)
4557 return -1;
4558
4559 PDATA_PUSH(self->stack, value, -1);
4560 return 0;
4561}
4562
4563static int
4564load_binint(UnpicklerObject *self)
4565{
4566 char *s;
4567
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004568 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004569 return -1;
4570
4571 return load_binintx(self, s, 4);
4572}
4573
4574static int
4575load_binint1(UnpicklerObject *self)
4576{
4577 char *s;
4578
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004579 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004580 return -1;
4581
4582 return load_binintx(self, s, 1);
4583}
4584
4585static int
4586load_binint2(UnpicklerObject *self)
4587{
4588 char *s;
4589
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004590 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004591 return -1;
4592
4593 return load_binintx(self, s, 2);
4594}
4595
4596static int
4597load_long(UnpicklerObject *self)
4598{
4599 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004600 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004601 Py_ssize_t len;
4602
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004603 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004604 return -1;
4605 if (len < 2)
4606 return bad_readline();
4607
Mark Dickinson8dd05142009-01-20 20:43:58 +00004608 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4609 the 'L' before calling PyLong_FromString. In order to maintain
4610 compatibility with Python 3.0.0, we don't actually *require*
4611 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004612 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004613 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004614 /* XXX: Should the base argument explicitly set to 10? */
4615 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004616 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004617 return -1;
4618
4619 PDATA_PUSH(self->stack, value, -1);
4620 return 0;
4621}
4622
4623/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4624 * data following.
4625 */
4626static int
4627load_counted_long(UnpicklerObject *self, int size)
4628{
4629 PyObject *value;
4630 char *nbytes;
4631 char *pdata;
4632
4633 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004634 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004635 return -1;
4636
4637 size = calc_binint(nbytes, size);
4638 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004639 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004640 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004641 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004642 "LONG pickle has negative byte count");
4643 return -1;
4644 }
4645
4646 if (size == 0)
4647 value = PyLong_FromLong(0L);
4648 else {
4649 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004650 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004651 return -1;
4652 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4653 1 /* little endian */ , 1 /* signed */ );
4654 }
4655 if (value == NULL)
4656 return -1;
4657 PDATA_PUSH(self->stack, value, -1);
4658 return 0;
4659}
4660
4661static int
4662load_float(UnpicklerObject *self)
4663{
4664 PyObject *value;
4665 char *endptr, *s;
4666 Py_ssize_t len;
4667 double d;
4668
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004669 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004670 return -1;
4671 if (len < 2)
4672 return bad_readline();
4673
4674 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004675 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4676 if (d == -1.0 && PyErr_Occurred())
4677 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004678 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004679 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4680 return -1;
4681 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004682 value = PyFloat_FromDouble(d);
4683 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004684 return -1;
4685
4686 PDATA_PUSH(self->stack, value, -1);
4687 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004688}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004689
4690static int
4691load_binfloat(UnpicklerObject *self)
4692{
4693 PyObject *value;
4694 double x;
4695 char *s;
4696
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004697 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004698 return -1;
4699
4700 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4701 if (x == -1.0 && PyErr_Occurred())
4702 return -1;
4703
4704 if ((value = PyFloat_FromDouble(x)) == NULL)
4705 return -1;
4706
4707 PDATA_PUSH(self->stack, value, -1);
4708 return 0;
4709}
4710
4711static int
4712load_string(UnpicklerObject *self)
4713{
4714 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004715 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004716 Py_ssize_t len;
4717 char *s, *p;
4718
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004719 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004720 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004721 /* Strip the newline */
4722 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004723 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004724 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004725 p = s + 1;
4726 len -= 2;
4727 }
4728 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004729 PickleState *st = _Pickle_GetGlobalState();
4730 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004731 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004732 return -1;
4733 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004734 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004735
4736 /* Use the PyBytes API to decode the string, since that is what is used
4737 to encode, and then coerce the result to Unicode. */
4738 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004739 if (bytes == NULL)
4740 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004741
4742 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4743 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4744 if (strcmp(self->encoding, "bytes") == 0) {
4745 obj = bytes;
4746 }
4747 else {
4748 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4749 Py_DECREF(bytes);
4750 if (obj == NULL) {
4751 return -1;
4752 }
4753 }
4754
4755 PDATA_PUSH(self->stack, obj, -1);
4756 return 0;
4757}
4758
4759static int
4760load_counted_binstring(UnpicklerObject *self, int nbytes)
4761{
4762 PyObject *obj;
4763 Py_ssize_t size;
4764 char *s;
4765
4766 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004767 return -1;
4768
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004769 size = calc_binsize(s, nbytes);
4770 if (size < 0) {
4771 PickleState *st = _Pickle_GetGlobalState();
4772 PyErr_Format(st->UnpicklingError,
4773 "BINSTRING exceeds system's maximum size of %zd bytes",
4774 PY_SSIZE_T_MAX);
4775 return -1;
4776 }
4777
4778 if (_Unpickler_Read(self, &s, size) < 0)
4779 return -1;
4780
4781 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4782 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4783 if (strcmp(self->encoding, "bytes") == 0) {
4784 obj = PyBytes_FromStringAndSize(s, size);
4785 }
4786 else {
4787 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4788 }
4789 if (obj == NULL) {
4790 return -1;
4791 }
4792
4793 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004794 return 0;
4795}
4796
4797static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004798load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004799{
4800 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004801 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004802 char *s;
4803
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004804 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004805 return -1;
4806
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004807 size = calc_binsize(s, nbytes);
4808 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004809 PyErr_Format(PyExc_OverflowError,
4810 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004811 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004812 return -1;
4813 }
4814
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004815 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004816 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004817
4818 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004819 if (bytes == NULL)
4820 return -1;
4821
4822 PDATA_PUSH(self->stack, bytes, -1);
4823 return 0;
4824}
4825
4826static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004827load_unicode(UnpicklerObject *self)
4828{
4829 PyObject *str;
4830 Py_ssize_t len;
4831 char *s;
4832
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004833 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004834 return -1;
4835 if (len < 1)
4836 return bad_readline();
4837
4838 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4839 if (str == NULL)
4840 return -1;
4841
4842 PDATA_PUSH(self->stack, str, -1);
4843 return 0;
4844}
4845
4846static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004847load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004848{
4849 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004850 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004851 char *s;
4852
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004853 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004854 return -1;
4855
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004856 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004857 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004858 PyErr_Format(PyExc_OverflowError,
4859 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004860 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004861 return -1;
4862 }
4863
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004864 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004865 return -1;
4866
Victor Stinner485fb562010-04-13 11:07:24 +00004867 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004868 if (str == NULL)
4869 return -1;
4870
4871 PDATA_PUSH(self->stack, str, -1);
4872 return 0;
4873}
4874
4875static int
4876load_tuple(UnpicklerObject *self)
4877{
4878 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004879 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004880
4881 if ((i = marker(self)) < 0)
4882 return -1;
4883
4884 tuple = Pdata_poptuple(self->stack, i);
4885 if (tuple == NULL)
4886 return -1;
4887 PDATA_PUSH(self->stack, tuple, -1);
4888 return 0;
4889}
4890
4891static int
4892load_counted_tuple(UnpicklerObject *self, int len)
4893{
4894 PyObject *tuple;
4895
4896 tuple = PyTuple_New(len);
4897 if (tuple == NULL)
4898 return -1;
4899
4900 while (--len >= 0) {
4901 PyObject *item;
4902
4903 PDATA_POP(self->stack, item);
4904 if (item == NULL)
4905 return -1;
4906 PyTuple_SET_ITEM(tuple, len, item);
4907 }
4908 PDATA_PUSH(self->stack, tuple, -1);
4909 return 0;
4910}
4911
4912static int
4913load_empty_list(UnpicklerObject *self)
4914{
4915 PyObject *list;
4916
4917 if ((list = PyList_New(0)) == NULL)
4918 return -1;
4919 PDATA_PUSH(self->stack, list, -1);
4920 return 0;
4921}
4922
4923static int
4924load_empty_dict(UnpicklerObject *self)
4925{
4926 PyObject *dict;
4927
4928 if ((dict = PyDict_New()) == NULL)
4929 return -1;
4930 PDATA_PUSH(self->stack, dict, -1);
4931 return 0;
4932}
4933
4934static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004935load_empty_set(UnpicklerObject *self)
4936{
4937 PyObject *set;
4938
4939 if ((set = PySet_New(NULL)) == NULL)
4940 return -1;
4941 PDATA_PUSH(self->stack, set, -1);
4942 return 0;
4943}
4944
4945static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004946load_list(UnpicklerObject *self)
4947{
4948 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004949 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004950
4951 if ((i = marker(self)) < 0)
4952 return -1;
4953
4954 list = Pdata_poplist(self->stack, i);
4955 if (list == NULL)
4956 return -1;
4957 PDATA_PUSH(self->stack, list, -1);
4958 return 0;
4959}
4960
4961static int
4962load_dict(UnpicklerObject *self)
4963{
4964 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004965 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004966
4967 if ((i = marker(self)) < 0)
4968 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004969 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004970
4971 if ((dict = PyDict_New()) == NULL)
4972 return -1;
4973
4974 for (k = i + 1; k < j; k += 2) {
4975 key = self->stack->data[k - 1];
4976 value = self->stack->data[k];
4977 if (PyDict_SetItem(dict, key, value) < 0) {
4978 Py_DECREF(dict);
4979 return -1;
4980 }
4981 }
4982 Pdata_clear(self->stack, i);
4983 PDATA_PUSH(self->stack, dict, -1);
4984 return 0;
4985}
4986
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004987static int
4988load_frozenset(UnpicklerObject *self)
4989{
4990 PyObject *items;
4991 PyObject *frozenset;
4992 Py_ssize_t i;
4993
4994 if ((i = marker(self)) < 0)
4995 return -1;
4996
4997 items = Pdata_poptuple(self->stack, i);
4998 if (items == NULL)
4999 return -1;
5000
5001 frozenset = PyFrozenSet_New(items);
5002 Py_DECREF(items);
5003 if (frozenset == NULL)
5004 return -1;
5005
5006 PDATA_PUSH(self->stack, frozenset, -1);
5007 return 0;
5008}
5009
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005010static PyObject *
5011instantiate(PyObject *cls, PyObject *args)
5012{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005013 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005014 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005015 /* Caller must assure args are a tuple. Normally, args come from
5016 Pdata_poptuple which packs objects from the top of the stack
5017 into a newly created tuple. */
5018 assert(PyTuple_Check(args));
5019 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005020 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005021 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005022 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005023 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005024 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005025
5026 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005027 }
5028 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005029}
5030
5031static int
5032load_obj(UnpicklerObject *self)
5033{
5034 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005035 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005036
5037 if ((i = marker(self)) < 0)
5038 return -1;
5039
5040 args = Pdata_poptuple(self->stack, i + 1);
5041 if (args == NULL)
5042 return -1;
5043
5044 PDATA_POP(self->stack, cls);
5045 if (cls) {
5046 obj = instantiate(cls, args);
5047 Py_DECREF(cls);
5048 }
5049 Py_DECREF(args);
5050 if (obj == NULL)
5051 return -1;
5052
5053 PDATA_PUSH(self->stack, obj, -1);
5054 return 0;
5055}
5056
5057static int
5058load_inst(UnpicklerObject *self)
5059{
5060 PyObject *cls = NULL;
5061 PyObject *args = NULL;
5062 PyObject *obj = NULL;
5063 PyObject *module_name;
5064 PyObject *class_name;
5065 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005066 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005067 char *s;
5068
5069 if ((i = marker(self)) < 0)
5070 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005071 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005072 return -1;
5073 if (len < 2)
5074 return bad_readline();
5075
5076 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5077 identifiers are permitted in Python 3.0, since the INST opcode is only
5078 supported by older protocols on Python 2.x. */
5079 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5080 if (module_name == NULL)
5081 return -1;
5082
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005083 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005084 if (len < 2)
5085 return bad_readline();
5086 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005087 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005088 cls = find_class(self, module_name, class_name);
5089 Py_DECREF(class_name);
5090 }
5091 }
5092 Py_DECREF(module_name);
5093
5094 if (cls == NULL)
5095 return -1;
5096
5097 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5098 obj = instantiate(cls, args);
5099 Py_DECREF(args);
5100 }
5101 Py_DECREF(cls);
5102
5103 if (obj == NULL)
5104 return -1;
5105
5106 PDATA_PUSH(self->stack, obj, -1);
5107 return 0;
5108}
5109
5110static int
5111load_newobj(UnpicklerObject *self)
5112{
5113 PyObject *args = NULL;
5114 PyObject *clsraw = NULL;
5115 PyTypeObject *cls; /* clsraw cast to its true type */
5116 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005117 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005118
5119 /* Stack is ... cls argtuple, and we want to call
5120 * cls.__new__(cls, *argtuple).
5121 */
5122 PDATA_POP(self->stack, args);
5123 if (args == NULL)
5124 goto error;
5125 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005126 PyErr_SetString(st->UnpicklingError,
5127 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005128 goto error;
5129 }
5130
5131 PDATA_POP(self->stack, clsraw);
5132 cls = (PyTypeObject *)clsraw;
5133 if (cls == NULL)
5134 goto error;
5135 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005136 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005137 "isn't a type object");
5138 goto error;
5139 }
5140 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005141 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005142 "has NULL tp_new");
5143 goto error;
5144 }
5145
5146 /* Call __new__. */
5147 obj = cls->tp_new(cls, args, NULL);
5148 if (obj == NULL)
5149 goto error;
5150
5151 Py_DECREF(args);
5152 Py_DECREF(clsraw);
5153 PDATA_PUSH(self->stack, obj, -1);
5154 return 0;
5155
5156 error:
5157 Py_XDECREF(args);
5158 Py_XDECREF(clsraw);
5159 return -1;
5160}
5161
5162static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005163load_newobj_ex(UnpicklerObject *self)
5164{
5165 PyObject *cls, *args, *kwargs;
5166 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005167 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005168
5169 PDATA_POP(self->stack, kwargs);
5170 if (kwargs == NULL) {
5171 return -1;
5172 }
5173 PDATA_POP(self->stack, args);
5174 if (args == NULL) {
5175 Py_DECREF(kwargs);
5176 return -1;
5177 }
5178 PDATA_POP(self->stack, cls);
5179 if (cls == NULL) {
5180 Py_DECREF(kwargs);
5181 Py_DECREF(args);
5182 return -1;
5183 }
Larry Hastings61272b72014-01-07 12:41:53 -08005184
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005185 if (!PyType_Check(cls)) {
5186 Py_DECREF(kwargs);
5187 Py_DECREF(args);
5188 Py_DECREF(cls);
Larry Hastings61272b72014-01-07 12:41:53 -08005189 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005190 "NEWOBJ_EX class argument must be a type, not %.200s",
5191 Py_TYPE(cls)->tp_name);
5192 return -1;
5193 }
5194
5195 if (((PyTypeObject *)cls)->tp_new == NULL) {
5196 Py_DECREF(kwargs);
5197 Py_DECREF(args);
5198 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005199 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005200 "NEWOBJ_EX class argument doesn't have __new__");
5201 return -1;
5202 }
5203 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5204 Py_DECREF(kwargs);
5205 Py_DECREF(args);
5206 Py_DECREF(cls);
5207 if (obj == NULL) {
5208 return -1;
5209 }
5210 PDATA_PUSH(self->stack, obj, -1);
5211 return 0;
5212}
5213
5214static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005215load_global(UnpicklerObject *self)
5216{
5217 PyObject *global = NULL;
5218 PyObject *module_name;
5219 PyObject *global_name;
5220 Py_ssize_t len;
5221 char *s;
5222
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005223 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005224 return -1;
5225 if (len < 2)
5226 return bad_readline();
5227 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5228 if (!module_name)
5229 return -1;
5230
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005231 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005232 if (len < 2) {
5233 Py_DECREF(module_name);
5234 return bad_readline();
5235 }
5236 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5237 if (global_name) {
5238 global = find_class(self, module_name, global_name);
5239 Py_DECREF(global_name);
5240 }
5241 }
5242 Py_DECREF(module_name);
5243
5244 if (global == NULL)
5245 return -1;
5246 PDATA_PUSH(self->stack, global, -1);
5247 return 0;
5248}
5249
5250static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005251load_stack_global(UnpicklerObject *self)
5252{
5253 PyObject *global;
5254 PyObject *module_name;
5255 PyObject *global_name;
5256
5257 PDATA_POP(self->stack, global_name);
5258 PDATA_POP(self->stack, module_name);
5259 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5260 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005261 PickleState *st = _Pickle_GetGlobalState();
5262 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005263 Py_XDECREF(global_name);
5264 Py_XDECREF(module_name);
5265 return -1;
5266 }
5267 global = find_class(self, module_name, global_name);
5268 Py_DECREF(global_name);
5269 Py_DECREF(module_name);
5270 if (global == NULL)
5271 return -1;
5272 PDATA_PUSH(self->stack, global, -1);
5273 return 0;
5274}
5275
5276static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005277load_persid(UnpicklerObject *self)
5278{
5279 PyObject *pid;
5280 Py_ssize_t len;
5281 char *s;
5282
5283 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005284 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005285 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005286 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005287 return bad_readline();
5288
5289 pid = PyBytes_FromStringAndSize(s, len - 1);
5290 if (pid == NULL)
5291 return -1;
5292
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005293 /* This does not leak since _Pickle_FastCall() steals the reference
5294 to pid first. */
5295 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005296 if (pid == NULL)
5297 return -1;
5298
5299 PDATA_PUSH(self->stack, pid, -1);
5300 return 0;
5301 }
5302 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005303 PickleState *st = _Pickle_GetGlobalState();
5304 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005305 "A load persistent id instruction was encountered,\n"
5306 "but no persistent_load function was specified.");
5307 return -1;
5308 }
5309}
5310
5311static int
5312load_binpersid(UnpicklerObject *self)
5313{
5314 PyObject *pid;
5315
5316 if (self->pers_func) {
5317 PDATA_POP(self->stack, pid);
5318 if (pid == NULL)
5319 return -1;
5320
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005321 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005322 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005323 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005324 if (pid == NULL)
5325 return -1;
5326
5327 PDATA_PUSH(self->stack, pid, -1);
5328 return 0;
5329 }
5330 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005331 PickleState *st = _Pickle_GetGlobalState();
5332 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005333 "A load persistent id instruction was encountered,\n"
5334 "but no persistent_load function was specified.");
5335 return -1;
5336 }
5337}
5338
5339static int
5340load_pop(UnpicklerObject *self)
5341{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005342 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005343
5344 /* Note that we split the (pickle.py) stack into two stacks,
5345 * an object stack and a mark stack. We have to be clever and
5346 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005347 * mark stack first, and only signalling a stack underflow if
5348 * the object stack is empty and the mark stack doesn't match
5349 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005350 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005351 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005352 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005353 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005354 len--;
5355 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005356 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005357 } else {
5358 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005359 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005360 return 0;
5361}
5362
5363static int
5364load_pop_mark(UnpicklerObject *self)
5365{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005366 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005367
5368 if ((i = marker(self)) < 0)
5369 return -1;
5370
5371 Pdata_clear(self->stack, i);
5372
5373 return 0;
5374}
5375
5376static int
5377load_dup(UnpicklerObject *self)
5378{
5379 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005380 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005381
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005382 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005383 return stack_underflow();
5384 last = self->stack->data[len - 1];
5385 PDATA_APPEND(self->stack, last, -1);
5386 return 0;
5387}
5388
5389static int
5390load_get(UnpicklerObject *self)
5391{
5392 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005393 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005394 Py_ssize_t len;
5395 char *s;
5396
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005397 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005398 return -1;
5399 if (len < 2)
5400 return bad_readline();
5401
5402 key = PyLong_FromString(s, NULL, 10);
5403 if (key == NULL)
5404 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005405 idx = PyLong_AsSsize_t(key);
5406 if (idx == -1 && PyErr_Occurred()) {
5407 Py_DECREF(key);
5408 return -1;
5409 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005410
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005411 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005412 if (value == NULL) {
5413 if (!PyErr_Occurred())
5414 PyErr_SetObject(PyExc_KeyError, key);
5415 Py_DECREF(key);
5416 return -1;
5417 }
5418 Py_DECREF(key);
5419
5420 PDATA_APPEND(self->stack, value, -1);
5421 return 0;
5422}
5423
5424static int
5425load_binget(UnpicklerObject *self)
5426{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005427 PyObject *value;
5428 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005429 char *s;
5430
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005431 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005432 return -1;
5433
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005434 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005435
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005436 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005437 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005438 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005439 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005440 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005441 Py_DECREF(key);
5442 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005443 return -1;
5444 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005445
5446 PDATA_APPEND(self->stack, value, -1);
5447 return 0;
5448}
5449
5450static int
5451load_long_binget(UnpicklerObject *self)
5452{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005453 PyObject *value;
5454 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005455 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005456
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005457 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005458 return -1;
5459
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005460 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005461
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005462 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005463 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005464 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005465 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005466 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005467 Py_DECREF(key);
5468 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005469 return -1;
5470 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005471
5472 PDATA_APPEND(self->stack, value, -1);
5473 return 0;
5474}
5475
5476/* Push an object from the extension registry (EXT[124]). nbytes is
5477 * the number of bytes following the opcode, holding the index (code) value.
5478 */
5479static int
5480load_extension(UnpicklerObject *self, int nbytes)
5481{
5482 char *codebytes; /* the nbytes bytes after the opcode */
5483 long code; /* calc_binint returns long */
5484 PyObject *py_code; /* code as a Python int */
5485 PyObject *obj; /* the object to push */
5486 PyObject *pair; /* (module_name, class_name) */
5487 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005488 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005489
5490 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005491 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005492 return -1;
5493 code = calc_binint(codebytes, nbytes);
5494 if (code <= 0) { /* note that 0 is forbidden */
5495 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005496 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005497 return -1;
5498 }
5499
5500 /* Look for the code in the cache. */
5501 py_code = PyLong_FromLong(code);
5502 if (py_code == NULL)
5503 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005504 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005505 if (obj != NULL) {
5506 /* Bingo. */
5507 Py_DECREF(py_code);
5508 PDATA_APPEND(self->stack, obj, -1);
5509 return 0;
5510 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005511 if (PyErr_Occurred()) {
5512 Py_DECREF(py_code);
5513 return -1;
5514 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005515
5516 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005517 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005518 if (pair == NULL) {
5519 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005520 if (!PyErr_Occurred()) {
5521 PyErr_Format(PyExc_ValueError, "unregistered extension "
5522 "code %ld", code);
5523 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005524 return -1;
5525 }
5526 /* Since the extension registry is manipulable via Python code,
5527 * confirm that pair is really a 2-tuple of strings.
5528 */
5529 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5530 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5531 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5532 Py_DECREF(py_code);
5533 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5534 "isn't a 2-tuple of strings", code);
5535 return -1;
5536 }
5537 /* Load the object. */
5538 obj = find_class(self, module_name, class_name);
5539 if (obj == NULL) {
5540 Py_DECREF(py_code);
5541 return -1;
5542 }
5543 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005544 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005545 Py_DECREF(py_code);
5546 if (code < 0) {
5547 Py_DECREF(obj);
5548 return -1;
5549 }
5550 PDATA_PUSH(self->stack, obj, -1);
5551 return 0;
5552}
5553
5554static int
5555load_put(UnpicklerObject *self)
5556{
5557 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005558 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005559 Py_ssize_t len;
5560 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005561
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005562 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005563 return -1;
5564 if (len < 2)
5565 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005566 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005567 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005568 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005569
5570 key = PyLong_FromString(s, NULL, 10);
5571 if (key == NULL)
5572 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005573 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005574 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005575 if (idx < 0) {
5576 if (!PyErr_Occurred())
5577 PyErr_SetString(PyExc_ValueError,
5578 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005579 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005580 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005581
5582 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005583}
5584
5585static int
5586load_binput(UnpicklerObject *self)
5587{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005588 PyObject *value;
5589 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005590 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005591
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005592 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005593 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005594
5595 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005596 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005597 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005598
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005599 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005600
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005601 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005602}
5603
5604static int
5605load_long_binput(UnpicklerObject *self)
5606{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005607 PyObject *value;
5608 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005609 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005610
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005611 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005612 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005613
5614 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005615 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005616 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005617
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005618 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005619 if (idx < 0) {
5620 PyErr_SetString(PyExc_ValueError,
5621 "negative LONG_BINPUT argument");
5622 return -1;
5623 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005624
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005625 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005626}
5627
5628static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005629load_memoize(UnpicklerObject *self)
5630{
5631 PyObject *value;
5632
5633 if (Py_SIZE(self->stack) <= 0)
5634 return stack_underflow();
5635 value = self->stack->data[Py_SIZE(self->stack) - 1];
5636
5637 return _Unpickler_MemoPut(self, self->memo_len, value);
5638}
5639
5640static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005641do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005642{
5643 PyObject *value;
5644 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005645 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005646
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005647 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005648 if (x > len || x <= 0)
5649 return stack_underflow();
5650 if (len == x) /* nothing to do */
5651 return 0;
5652
5653 list = self->stack->data[x - 1];
5654
5655 if (PyList_Check(list)) {
5656 PyObject *slice;
5657 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005658 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005659
5660 slice = Pdata_poplist(self->stack, x);
5661 if (!slice)
5662 return -1;
5663 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005664 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005665 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005666 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005667 }
5668 else {
5669 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005670 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005671
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005672 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005673 if (append_func == NULL)
5674 return -1;
5675 for (i = x; i < len; i++) {
5676 PyObject *result;
5677
5678 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005679 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005680 if (result == NULL) {
5681 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005682 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005683 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005684 return -1;
5685 }
5686 Py_DECREF(result);
5687 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005688 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005689 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005690 }
5691
5692 return 0;
5693}
5694
5695static int
5696load_append(UnpicklerObject *self)
5697{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005698 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005699}
5700
5701static int
5702load_appends(UnpicklerObject *self)
5703{
5704 return do_append(self, marker(self));
5705}
5706
5707static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005708do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005709{
5710 PyObject *value, *key;
5711 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005712 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005713 int status = 0;
5714
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005715 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005716 if (x > len || x <= 0)
5717 return stack_underflow();
5718 if (len == x) /* nothing to do */
5719 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005720 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005721 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005722 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005723 PyErr_SetString(st->UnpicklingError,
5724 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005725 return -1;
5726 }
5727
5728 /* Here, dict does not actually need to be a PyDict; it could be anything
5729 that supports the __setitem__ attribute. */
5730 dict = self->stack->data[x - 1];
5731
5732 for (i = x + 1; i < len; i += 2) {
5733 key = self->stack->data[i - 1];
5734 value = self->stack->data[i];
5735 if (PyObject_SetItem(dict, key, value) < 0) {
5736 status = -1;
5737 break;
5738 }
5739 }
5740
5741 Pdata_clear(self->stack, x);
5742 return status;
5743}
5744
5745static int
5746load_setitem(UnpicklerObject *self)
5747{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005748 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005749}
5750
5751static int
5752load_setitems(UnpicklerObject *self)
5753{
5754 return do_setitems(self, marker(self));
5755}
5756
5757static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005758load_additems(UnpicklerObject *self)
5759{
5760 PyObject *set;
5761 Py_ssize_t mark, len, i;
5762
5763 mark = marker(self);
5764 len = Py_SIZE(self->stack);
5765 if (mark > len || mark <= 0)
5766 return stack_underflow();
5767 if (len == mark) /* nothing to do */
5768 return 0;
5769
5770 set = self->stack->data[mark - 1];
5771
5772 if (PySet_Check(set)) {
5773 PyObject *items;
5774 int status;
5775
5776 items = Pdata_poptuple(self->stack, mark);
5777 if (items == NULL)
5778 return -1;
5779
5780 status = _PySet_Update(set, items);
5781 Py_DECREF(items);
5782 return status;
5783 }
5784 else {
5785 PyObject *add_func;
5786 _Py_IDENTIFIER(add);
5787
5788 add_func = _PyObject_GetAttrId(set, &PyId_add);
5789 if (add_func == NULL)
5790 return -1;
5791 for (i = mark; i < len; i++) {
5792 PyObject *result;
5793 PyObject *item;
5794
5795 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005796 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005797 if (result == NULL) {
5798 Pdata_clear(self->stack, i + 1);
5799 Py_SIZE(self->stack) = mark;
5800 return -1;
5801 }
5802 Py_DECREF(result);
5803 }
5804 Py_SIZE(self->stack) = mark;
5805 }
5806
5807 return 0;
5808}
5809
5810static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005811load_build(UnpicklerObject *self)
5812{
5813 PyObject *state, *inst, *slotstate;
5814 PyObject *setstate;
5815 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005816 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005817
5818 /* Stack is ... instance, state. We want to leave instance at
5819 * the stack top, possibly mutated via instance.__setstate__(state).
5820 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005821 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005822 return stack_underflow();
5823
5824 PDATA_POP(self->stack, state);
5825 if (state == NULL)
5826 return -1;
5827
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005828 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005829
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005830 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005831 if (setstate == NULL) {
5832 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5833 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005834 else {
5835 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005836 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005837 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005838 }
5839 else {
5840 PyObject *result;
5841
5842 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005843 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005844 Py_DECREF(setstate);
5845 if (result == NULL)
5846 return -1;
5847 Py_DECREF(result);
5848 return 0;
5849 }
5850
5851 /* A default __setstate__. First see whether state embeds a
5852 * slot state dict too (a proto 2 addition).
5853 */
5854 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5855 PyObject *tmp = state;
5856
5857 state = PyTuple_GET_ITEM(tmp, 0);
5858 slotstate = PyTuple_GET_ITEM(tmp, 1);
5859 Py_INCREF(state);
5860 Py_INCREF(slotstate);
5861 Py_DECREF(tmp);
5862 }
5863 else
5864 slotstate = NULL;
5865
5866 /* Set inst.__dict__ from the state dict (if any). */
5867 if (state != Py_None) {
5868 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005869 PyObject *d_key, *d_value;
5870 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005871 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005872
5873 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005874 PickleState *st = _Pickle_GetGlobalState();
5875 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005876 goto error;
5877 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005878 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005879 if (dict == NULL)
5880 goto error;
5881
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005882 i = 0;
5883 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5884 /* normally the keys for instance attributes are
5885 interned. we should try to do that here. */
5886 Py_INCREF(d_key);
5887 if (PyUnicode_CheckExact(d_key))
5888 PyUnicode_InternInPlace(&d_key);
5889 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5890 Py_DECREF(d_key);
5891 goto error;
5892 }
5893 Py_DECREF(d_key);
5894 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005895 Py_DECREF(dict);
5896 }
5897
5898 /* Also set instance attributes from the slotstate dict (if any). */
5899 if (slotstate != NULL) {
5900 PyObject *d_key, *d_value;
5901 Py_ssize_t i;
5902
5903 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005904 PickleState *st = _Pickle_GetGlobalState();
5905 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005906 "slot state is not a dictionary");
5907 goto error;
5908 }
5909 i = 0;
5910 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
5911 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
5912 goto error;
5913 }
5914 }
5915
5916 if (0) {
5917 error:
5918 status = -1;
5919 }
5920
5921 Py_DECREF(state);
5922 Py_XDECREF(slotstate);
5923 return status;
5924}
5925
5926static int
5927load_mark(UnpicklerObject *self)
5928{
5929
5930 /* Note that we split the (pickle.py) stack into two stacks, an
5931 * object stack and a mark stack. Here we push a mark onto the
5932 * mark stack.
5933 */
5934
5935 if ((self->num_marks + 1) >= self->marks_size) {
5936 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005937 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005938
5939 /* Use the size_t type to check for overflow. */
5940 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005941 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00005942 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005943 PyErr_NoMemory();
5944 return -1;
5945 }
5946
5947 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005948 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005949 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005950 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
5951 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005952 if (marks == NULL) {
5953 PyErr_NoMemory();
5954 return -1;
5955 }
5956 self->marks = marks;
5957 self->marks_size = (Py_ssize_t)alloc;
5958 }
5959
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005960 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005961
5962 return 0;
5963}
5964
5965static int
5966load_reduce(UnpicklerObject *self)
5967{
5968 PyObject *callable = NULL;
5969 PyObject *argtup = NULL;
5970 PyObject *obj = NULL;
5971
5972 PDATA_POP(self->stack, argtup);
5973 if (argtup == NULL)
5974 return -1;
5975 PDATA_POP(self->stack, callable);
5976 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005977 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005978 Py_DECREF(callable);
5979 }
5980 Py_DECREF(argtup);
5981
5982 if (obj == NULL)
5983 return -1;
5984
5985 PDATA_PUSH(self->stack, obj, -1);
5986 return 0;
5987}
5988
5989/* Just raises an error if we don't know the protocol specified. PROTO
5990 * is the first opcode for protocols >= 2.
5991 */
5992static int
5993load_proto(UnpicklerObject *self)
5994{
5995 char *s;
5996 int i;
5997
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005998 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005999 return -1;
6000
6001 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006002 if (i <= HIGHEST_PROTOCOL) {
6003 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006004 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006005 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006006
6007 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6008 return -1;
6009}
6010
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006011static int
6012load_frame(UnpicklerObject *self)
6013{
6014 char *s;
6015 Py_ssize_t frame_len;
6016
6017 if (_Unpickler_Read(self, &s, 8) < 0)
6018 return -1;
6019
6020 frame_len = calc_binsize(s, 8);
6021 if (frame_len < 0) {
6022 PyErr_Format(PyExc_OverflowError,
6023 "FRAME length exceeds system's maximum of %zd bytes",
6024 PY_SSIZE_T_MAX);
6025 return -1;
6026 }
6027
6028 if (_Unpickler_Read(self, &s, frame_len) < 0)
6029 return -1;
6030
6031 /* Rewind to start of frame */
6032 self->next_read_idx -= frame_len;
6033 return 0;
6034}
6035
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006036static PyObject *
6037load(UnpicklerObject *self)
6038{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006039 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006040 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006041
6042 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006043 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006044 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006045 Pdata_clear(self->stack, 0);
6046
6047 /* Convenient macros for the dispatch while-switch loop just below. */
6048#define OP(opcode, load_func) \
6049 case opcode: if (load_func(self) < 0) break; continue;
6050
6051#define OP_ARG(opcode, load_func, arg) \
6052 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6053
6054 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006055 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006056 break;
6057
6058 switch ((enum opcode)s[0]) {
6059 OP(NONE, load_none)
6060 OP(BININT, load_binint)
6061 OP(BININT1, load_binint1)
6062 OP(BININT2, load_binint2)
6063 OP(INT, load_int)
6064 OP(LONG, load_long)
6065 OP_ARG(LONG1, load_counted_long, 1)
6066 OP_ARG(LONG4, load_counted_long, 4)
6067 OP(FLOAT, load_float)
6068 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006069 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6070 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6071 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6072 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6073 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006074 OP(STRING, load_string)
6075 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006076 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6077 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6078 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006079 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6080 OP_ARG(TUPLE1, load_counted_tuple, 1)
6081 OP_ARG(TUPLE2, load_counted_tuple, 2)
6082 OP_ARG(TUPLE3, load_counted_tuple, 3)
6083 OP(TUPLE, load_tuple)
6084 OP(EMPTY_LIST, load_empty_list)
6085 OP(LIST, load_list)
6086 OP(EMPTY_DICT, load_empty_dict)
6087 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006088 OP(EMPTY_SET, load_empty_set)
6089 OP(ADDITEMS, load_additems)
6090 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006091 OP(OBJ, load_obj)
6092 OP(INST, load_inst)
6093 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006094 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006095 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006096 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006097 OP(APPEND, load_append)
6098 OP(APPENDS, load_appends)
6099 OP(BUILD, load_build)
6100 OP(DUP, load_dup)
6101 OP(BINGET, load_binget)
6102 OP(LONG_BINGET, load_long_binget)
6103 OP(GET, load_get)
6104 OP(MARK, load_mark)
6105 OP(BINPUT, load_binput)
6106 OP(LONG_BINPUT, load_long_binput)
6107 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006108 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006109 OP(POP, load_pop)
6110 OP(POP_MARK, load_pop_mark)
6111 OP(SETITEM, load_setitem)
6112 OP(SETITEMS, load_setitems)
6113 OP(PERSID, load_persid)
6114 OP(BINPERSID, load_binpersid)
6115 OP(REDUCE, load_reduce)
6116 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006117 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006118 OP_ARG(EXT1, load_extension, 1)
6119 OP_ARG(EXT2, load_extension, 2)
6120 OP_ARG(EXT4, load_extension, 4)
6121 OP_ARG(NEWTRUE, load_bool, Py_True)
6122 OP_ARG(NEWFALSE, load_bool, Py_False)
6123
6124 case STOP:
6125 break;
6126
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006127 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006128 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006129 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006130 }
6131 else {
6132 PickleState *st = _Pickle_GetGlobalState();
6133 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006134 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006135 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006136 return NULL;
6137 }
6138
6139 break; /* and we are done! */
6140 }
6141
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006142 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006143 return NULL;
6144 }
6145
Victor Stinner2ae57e32013-10-31 13:39:23 +01006146 if (_Unpickler_SkipConsumed(self) < 0)
6147 return NULL;
6148
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006149 PDATA_POP(self->stack, value);
6150 return value;
6151}
6152
Larry Hastings61272b72014-01-07 12:41:53 -08006153/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006154
6155_pickle.Unpickler.load
6156
6157Load a pickle.
6158
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006159Read a pickled object representation from the open file object given
6160in the constructor, and return the reconstituted object hierarchy
6161specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006162[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006163
Larry Hastings3cceb382014-01-04 11:09:09 -08006164static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006165_pickle_Unpickler_load_impl(UnpicklerObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006166/*[clinic end generated code: checksum=fdcc488aad675b1458b5644180d092b99e6e4fe4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006167{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006168 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006169
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006170 /* Check whether the Unpickler was initialized correctly. This prevents
6171 segfaulting if a subclass overridden __init__ with a function that does
6172 not call Unpickler.__init__(). Here, we simply ensure that self->read
6173 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006174 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006175 PickleState *st = _Pickle_GetGlobalState();
6176 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006177 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006178 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006179 return NULL;
6180 }
6181
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006182 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006183}
6184
6185/* The name of find_class() is misleading. In newer pickle protocols, this
6186 function is used for loading any global (i.e., functions), not just
6187 classes. The name is kept only for backward compatibility. */
6188
Larry Hastings61272b72014-01-07 12:41:53 -08006189/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006190
6191_pickle.Unpickler.find_class
6192
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006193 module_name: object
6194 global_name: object
6195 /
6196
6197Return an object from a specified module.
6198
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006199If necessary, the module will be imported. Subclasses may override
6200this method (e.g. to restrict unpickling of arbitrary classes and
6201functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006202
6203This method is called whenever a class or a function object is
6204needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006205[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006206
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006207static PyObject *
6208_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006209/*[clinic end generated code: checksum=64c77437e088e188fa0b022a0402d5b2964da8c9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006210{
6211 PyObject *global;
6212 PyObject *modules_dict;
6213 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006214 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006215
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006216 /* Try to map the old names used in Python 2.x to the new ones used in
6217 Python 3.x. We do this only with old pickle protocols and when the
6218 user has not disabled the feature. */
6219 if (self->proto < 3 && self->fix_imports) {
6220 PyObject *key;
6221 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006222 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006223
6224 /* Check if the global (i.e., a function or a class) was renamed
6225 or moved to another module. */
6226 key = PyTuple_Pack(2, module_name, global_name);
6227 if (key == NULL)
6228 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006229 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006230 Py_DECREF(key);
6231 if (item) {
6232 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6233 PyErr_Format(PyExc_RuntimeError,
6234 "_compat_pickle.NAME_MAPPING values should be "
6235 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6236 return NULL;
6237 }
6238 module_name = PyTuple_GET_ITEM(item, 0);
6239 global_name = PyTuple_GET_ITEM(item, 1);
6240 if (!PyUnicode_Check(module_name) ||
6241 !PyUnicode_Check(global_name)) {
6242 PyErr_Format(PyExc_RuntimeError,
6243 "_compat_pickle.NAME_MAPPING values should be "
6244 "pairs of str, not (%.200s, %.200s)",
6245 Py_TYPE(module_name)->tp_name,
6246 Py_TYPE(global_name)->tp_name);
6247 return NULL;
6248 }
6249 }
6250 else if (PyErr_Occurred()) {
6251 return NULL;
6252 }
6253
6254 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006255 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006256 if (item) {
6257 if (!PyUnicode_Check(item)) {
6258 PyErr_Format(PyExc_RuntimeError,
6259 "_compat_pickle.IMPORT_MAPPING values should be "
6260 "strings, not %.200s", Py_TYPE(item)->tp_name);
6261 return NULL;
6262 }
6263 module_name = item;
6264 }
6265 else if (PyErr_Occurred()) {
6266 return NULL;
6267 }
6268 }
6269
Victor Stinnerbb520202013-11-06 22:40:41 +01006270 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006271 if (modules_dict == NULL) {
6272 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006273 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006274 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006275
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006276 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006277 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006278 if (PyErr_Occurred())
6279 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006280 module = PyImport_Import(module_name);
6281 if (module == NULL)
6282 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006283 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006284 Py_DECREF(module);
6285 }
Victor Stinner121aab42011-09-29 23:40:53 +02006286 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006287 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006288 }
6289 return global;
6290}
6291
6292static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006293 _PICKLE_UNPICKLER_LOAD_METHODDEF
6294 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006295 {NULL, NULL} /* sentinel */
6296};
6297
6298static void
6299Unpickler_dealloc(UnpicklerObject *self)
6300{
6301 PyObject_GC_UnTrack((PyObject *)self);
6302 Py_XDECREF(self->readline);
6303 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006304 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305 Py_XDECREF(self->stack);
6306 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006307 if (self->buffer.buf != NULL) {
6308 PyBuffer_Release(&self->buffer);
6309 self->buffer.buf = NULL;
6310 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006311
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006312 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006313 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006314 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006315 PyMem_Free(self->encoding);
6316 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006317
6318 Py_TYPE(self)->tp_free((PyObject *)self);
6319}
6320
6321static int
6322Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6323{
6324 Py_VISIT(self->readline);
6325 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006326 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006327 Py_VISIT(self->stack);
6328 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006329 return 0;
6330}
6331
6332static int
6333Unpickler_clear(UnpicklerObject *self)
6334{
6335 Py_CLEAR(self->readline);
6336 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006337 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006338 Py_CLEAR(self->stack);
6339 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006340 if (self->buffer.buf != NULL) {
6341 PyBuffer_Release(&self->buffer);
6342 self->buffer.buf = NULL;
6343 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006344
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006345 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006346 PyMem_Free(self->marks);
6347 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006348 PyMem_Free(self->input_line);
6349 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006350 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006351 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006352 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006353 self->errors = NULL;
6354
6355 return 0;
6356}
6357
Larry Hastings61272b72014-01-07 12:41:53 -08006358/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006359
6360_pickle.Unpickler.__init__
6361
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006362 file: object
6363 *
6364 fix_imports: bool = True
6365 encoding: str = 'ASCII'
6366 errors: str = 'strict'
6367
6368This takes a binary file for reading a pickle data stream.
6369
6370The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006371protocol argument is needed. Bytes past the pickled object's
6372representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006373
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006374The argument *file* must have two methods, a read() method that takes
6375an integer argument, and a readline() method that requires no
6376arguments. Both methods should return bytes. Thus *file* can be a
6377binary file object opened for reading, a io.BytesIO object, or any
6378other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006379
6380Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6381which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006382generated by Python 2. If *fix_imports* is True, pickle will try to
6383map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006384*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006385instances pickled by Python 2; these default to 'ASCII' and 'strict',
6386respectively. The *encoding* can be 'bytes' to read these 8-bit
6387string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006388[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006389
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006390static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006391_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006392/*[clinic end generated code: checksum=b9ed1d84d315f3b57f91b878cdd88024ccc2ae89]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006393{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006394 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006395
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006396 /* In case of multiple __init__() calls, clear previous content. */
6397 if (self->read != NULL)
6398 (void)Unpickler_clear(self);
6399
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006400 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006401 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006402
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006403 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006404 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006405
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006406 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006407 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006408 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006409
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006410 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006411 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6412 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006413 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006414 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006415 }
6416 else {
6417 self->pers_func = NULL;
6418 }
6419
6420 self->stack = (Pdata *)Pdata_New();
6421 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006422 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006423
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006424 self->memo_size = 32;
6425 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006426 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006427 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006428
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006429 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006430
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006431 return 0;
6432}
6433
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006434
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006435/* Define a proxy object for the Unpickler's internal memo object. This is to
6436 * avoid breaking code like:
6437 * unpickler.memo.clear()
6438 * and
6439 * unpickler.memo = saved_memo
6440 * Is this a good idea? Not really, but we don't want to break code that uses
6441 * it. Note that we don't implement the entire mapping API here. This is
6442 * intentional, as these should be treated as black-box implementation details.
6443 *
6444 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006445 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006446 */
6447
Larry Hastings61272b72014-01-07 12:41:53 -08006448/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006449_pickle.UnpicklerMemoProxy.clear
6450
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006451Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006452[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006453
Larry Hastings3cceb382014-01-04 11:09:09 -08006454static PyObject *
6455_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006456/*[clinic end generated code: checksum=d20cd43f4ba1fb1f1ba1677fae3ff69b8cc41582]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006457{
6458 _Unpickler_MemoCleanup(self->unpickler);
6459 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6460 if (self->unpickler->memo == NULL)
6461 return NULL;
6462 Py_RETURN_NONE;
6463}
6464
Larry Hastings61272b72014-01-07 12:41:53 -08006465/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006466_pickle.UnpicklerMemoProxy.copy
6467
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006468Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006469[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006470
Larry Hastings3cceb382014-01-04 11:09:09 -08006471static PyObject *
6472_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006473/*[clinic end generated code: checksum=e12af7e9bc1e4c77df97c1e657d6b8e026a022b7]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006474{
6475 Py_ssize_t i;
6476 PyObject *new_memo = PyDict_New();
6477 if (new_memo == NULL)
6478 return NULL;
6479
6480 for (i = 0; i < self->unpickler->memo_size; i++) {
6481 int status;
6482 PyObject *key, *value;
6483
6484 value = self->unpickler->memo[i];
6485 if (value == NULL)
6486 continue;
6487
6488 key = PyLong_FromSsize_t(i);
6489 if (key == NULL)
6490 goto error;
6491 status = PyDict_SetItem(new_memo, key, value);
6492 Py_DECREF(key);
6493 if (status < 0)
6494 goto error;
6495 }
6496 return new_memo;
6497
6498error:
6499 Py_DECREF(new_memo);
6500 return NULL;
6501}
6502
Larry Hastings61272b72014-01-07 12:41:53 -08006503/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006504_pickle.UnpicklerMemoProxy.__reduce__
6505
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006506Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006507[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006508
Larry Hastings3cceb382014-01-04 11:09:09 -08006509static PyObject *
6510_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006511/*[clinic end generated code: checksum=6da34ac048d94cca7604faa72d45992e730882f1]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006512{
6513 PyObject *reduce_value;
6514 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006515 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006516 if (contents == NULL)
6517 return NULL;
6518
6519 reduce_value = PyTuple_New(2);
6520 if (reduce_value == NULL) {
6521 Py_DECREF(contents);
6522 return NULL;
6523 }
6524 constructor_args = PyTuple_New(1);
6525 if (constructor_args == NULL) {
6526 Py_DECREF(contents);
6527 Py_DECREF(reduce_value);
6528 return NULL;
6529 }
6530 PyTuple_SET_ITEM(constructor_args, 0, contents);
6531 Py_INCREF((PyObject *)&PyDict_Type);
6532 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6533 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6534 return reduce_value;
6535}
6536
6537static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006538 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6539 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6540 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006541 {NULL, NULL} /* sentinel */
6542};
6543
6544static void
6545UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6546{
6547 PyObject_GC_UnTrack(self);
6548 Py_XDECREF(self->unpickler);
6549 PyObject_GC_Del((PyObject *)self);
6550}
6551
6552static int
6553UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6554 visitproc visit, void *arg)
6555{
6556 Py_VISIT(self->unpickler);
6557 return 0;
6558}
6559
6560static int
6561UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6562{
6563 Py_CLEAR(self->unpickler);
6564 return 0;
6565}
6566
6567static PyTypeObject UnpicklerMemoProxyType = {
6568 PyVarObject_HEAD_INIT(NULL, 0)
6569 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6570 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6571 0,
6572 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6573 0, /* tp_print */
6574 0, /* tp_getattr */
6575 0, /* tp_setattr */
6576 0, /* tp_compare */
6577 0, /* tp_repr */
6578 0, /* tp_as_number */
6579 0, /* tp_as_sequence */
6580 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006581 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006582 0, /* tp_call */
6583 0, /* tp_str */
6584 PyObject_GenericGetAttr, /* tp_getattro */
6585 PyObject_GenericSetAttr, /* tp_setattro */
6586 0, /* tp_as_buffer */
6587 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6588 0, /* tp_doc */
6589 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6590 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6591 0, /* tp_richcompare */
6592 0, /* tp_weaklistoffset */
6593 0, /* tp_iter */
6594 0, /* tp_iternext */
6595 unpicklerproxy_methods, /* tp_methods */
6596};
6597
6598static PyObject *
6599UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6600{
6601 UnpicklerMemoProxyObject *self;
6602
6603 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6604 &UnpicklerMemoProxyType);
6605 if (self == NULL)
6606 return NULL;
6607 Py_INCREF(unpickler);
6608 self->unpickler = unpickler;
6609 PyObject_GC_Track(self);
6610 return (PyObject *)self;
6611}
6612
6613/*****************************************************************************/
6614
6615
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006616static PyObject *
6617Unpickler_get_memo(UnpicklerObject *self)
6618{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006619 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006620}
6621
6622static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006623Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006624{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006625 PyObject **new_memo;
6626 Py_ssize_t new_memo_size = 0;
6627 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006628
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006629 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006630 PyErr_SetString(PyExc_TypeError,
6631 "attribute deletion is not supported");
6632 return -1;
6633 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006634
6635 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6636 UnpicklerObject *unpickler =
6637 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6638
6639 new_memo_size = unpickler->memo_size;
6640 new_memo = _Unpickler_NewMemo(new_memo_size);
6641 if (new_memo == NULL)
6642 return -1;
6643
6644 for (i = 0; i < new_memo_size; i++) {
6645 Py_XINCREF(unpickler->memo[i]);
6646 new_memo[i] = unpickler->memo[i];
6647 }
6648 }
6649 else if (PyDict_Check(obj)) {
6650 Py_ssize_t i = 0;
6651 PyObject *key, *value;
6652
6653 new_memo_size = PyDict_Size(obj);
6654 new_memo = _Unpickler_NewMemo(new_memo_size);
6655 if (new_memo == NULL)
6656 return -1;
6657
6658 while (PyDict_Next(obj, &i, &key, &value)) {
6659 Py_ssize_t idx;
6660 if (!PyLong_Check(key)) {
6661 PyErr_SetString(PyExc_TypeError,
6662 "memo key must be integers");
6663 goto error;
6664 }
6665 idx = PyLong_AsSsize_t(key);
6666 if (idx == -1 && PyErr_Occurred())
6667 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006668 if (idx < 0) {
6669 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006670 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006671 goto error;
6672 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006673 if (_Unpickler_MemoPut(self, idx, value) < 0)
6674 goto error;
6675 }
6676 }
6677 else {
6678 PyErr_Format(PyExc_TypeError,
6679 "'memo' attribute must be an UnpicklerMemoProxy object"
6680 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006681 return -1;
6682 }
6683
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006684 _Unpickler_MemoCleanup(self);
6685 self->memo_size = new_memo_size;
6686 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006687
6688 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006689
6690 error:
6691 if (new_memo_size) {
6692 i = new_memo_size;
6693 while (--i >= 0) {
6694 Py_XDECREF(new_memo[i]);
6695 }
6696 PyMem_FREE(new_memo);
6697 }
6698 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006699}
6700
6701static PyObject *
6702Unpickler_get_persload(UnpicklerObject *self)
6703{
6704 if (self->pers_func == NULL)
6705 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6706 else
6707 Py_INCREF(self->pers_func);
6708 return self->pers_func;
6709}
6710
6711static int
6712Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6713{
6714 PyObject *tmp;
6715
6716 if (value == NULL) {
6717 PyErr_SetString(PyExc_TypeError,
6718 "attribute deletion is not supported");
6719 return -1;
6720 }
6721 if (!PyCallable_Check(value)) {
6722 PyErr_SetString(PyExc_TypeError,
6723 "persistent_load must be a callable taking "
6724 "one argument");
6725 return -1;
6726 }
6727
6728 tmp = self->pers_func;
6729 Py_INCREF(value);
6730 self->pers_func = value;
6731 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6732
6733 return 0;
6734}
6735
6736static PyGetSetDef Unpickler_getsets[] = {
6737 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6738 {"persistent_load", (getter)Unpickler_get_persload,
6739 (setter)Unpickler_set_persload},
6740 {NULL}
6741};
6742
6743static PyTypeObject Unpickler_Type = {
6744 PyVarObject_HEAD_INIT(NULL, 0)
6745 "_pickle.Unpickler", /*tp_name*/
6746 sizeof(UnpicklerObject), /*tp_basicsize*/
6747 0, /*tp_itemsize*/
6748 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6749 0, /*tp_print*/
6750 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006751 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006752 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006753 0, /*tp_repr*/
6754 0, /*tp_as_number*/
6755 0, /*tp_as_sequence*/
6756 0, /*tp_as_mapping*/
6757 0, /*tp_hash*/
6758 0, /*tp_call*/
6759 0, /*tp_str*/
6760 0, /*tp_getattro*/
6761 0, /*tp_setattro*/
6762 0, /*tp_as_buffer*/
6763 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006764 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006765 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6766 (inquiry)Unpickler_clear, /*tp_clear*/
6767 0, /*tp_richcompare*/
6768 0, /*tp_weaklistoffset*/
6769 0, /*tp_iter*/
6770 0, /*tp_iternext*/
6771 Unpickler_methods, /*tp_methods*/
6772 0, /*tp_members*/
6773 Unpickler_getsets, /*tp_getset*/
6774 0, /*tp_base*/
6775 0, /*tp_dict*/
6776 0, /*tp_descr_get*/
6777 0, /*tp_descr_set*/
6778 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006779 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006780 PyType_GenericAlloc, /*tp_alloc*/
6781 PyType_GenericNew, /*tp_new*/
6782 PyObject_GC_Del, /*tp_free*/
6783 0, /*tp_is_gc*/
6784};
6785
Larry Hastings61272b72014-01-07 12:41:53 -08006786/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006787
6788_pickle.dump
6789
6790 obj: object
6791 file: object
6792 protocol: object = NULL
6793 *
6794 fix_imports: bool = True
6795
6796Write a pickled representation of obj to the open file object file.
6797
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006798This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6799be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006800
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006801The optional *protocol* argument tells the pickler to use the given
6802protocol supported protocols are 0, 1, 2, 3 and 4. The default
6803protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006804
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006805Specifying a negative protocol version selects the highest protocol
6806version supported. The higher the protocol used, the more recent the
6807version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006808
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006809The *file* argument must have a write() method that accepts a single
6810bytes argument. It can thus be a file object opened for binary
6811writing, a io.BytesIO instance, or any other custom object that meets
6812this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006813
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006814If *fix_imports* is True and protocol is less than 3, pickle will try
6815to map the new Python 3 names to the old module names used in Python
68162, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006817[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006818
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006819static PyObject *
6820_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006821/*[clinic end generated code: checksum=a606e626d553850d96c286e909a139552d5d4096]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006822{
6823 PicklerObject *pickler = _Pickler_New();
6824
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006825 if (pickler == NULL)
6826 return NULL;
6827
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006828 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006829 goto error;
6830
6831 if (_Pickler_SetOutputStream(pickler, file) < 0)
6832 goto error;
6833
6834 if (dump(pickler, obj) < 0)
6835 goto error;
6836
6837 if (_Pickler_FlushToFile(pickler) < 0)
6838 goto error;
6839
6840 Py_DECREF(pickler);
6841 Py_RETURN_NONE;
6842
6843 error:
6844 Py_XDECREF(pickler);
6845 return NULL;
6846}
6847
Larry Hastings61272b72014-01-07 12:41:53 -08006848/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006849
6850_pickle.dumps
6851
6852 obj: object
6853 protocol: object = NULL
6854 *
6855 fix_imports: bool = True
6856
6857Return the pickled representation of the object as a bytes object.
6858
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006859The optional *protocol* argument tells the pickler to use the given
6860protocol; supported protocols are 0, 1, 2, 3 and 4. The default
6861protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006862
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006863Specifying a negative protocol version selects the highest protocol
6864version supported. The higher the protocol used, the more recent the
6865version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006866
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006867If *fix_imports* is True and *protocol* is less than 3, pickle will
6868try to map the new Python 3 names to the old module names used in
6869Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006870[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006871
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006872static PyObject *
6873_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006874/*[clinic end generated code: checksum=777f0deefe5b88ee324d43ab31b2579da7bbf22a]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006875{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006876 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006877 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006878
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006879 if (pickler == NULL)
6880 return NULL;
6881
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006882 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006883 goto error;
6884
6885 if (dump(pickler, obj) < 0)
6886 goto error;
6887
6888 result = _Pickler_GetString(pickler);
6889 Py_DECREF(pickler);
6890 return result;
6891
6892 error:
6893 Py_XDECREF(pickler);
6894 return NULL;
6895}
6896
Larry Hastings61272b72014-01-07 12:41:53 -08006897/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006898
6899_pickle.load
6900
6901 file: object
6902 *
6903 fix_imports: bool = True
6904 encoding: str = 'ASCII'
6905 errors: str = 'strict'
6906
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006907Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006908
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006909This is equivalent to ``Unpickler(file).load()``, but may be more
6910efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006911
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006912The protocol version of the pickle is detected automatically, so no
6913protocol argument is needed. Bytes past the pickled object's
6914representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006915
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006916The argument *file* must have two methods, a read() method that takes
6917an integer argument, and a readline() method that requires no
6918arguments. Both methods should return bytes. Thus *file* can be a
6919binary file object opened for reading, a io.BytesIO object, or any
6920other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006921
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006922Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6923which are used to control compatiblity support for pickle stream
6924generated by Python 2. If *fix_imports* is True, pickle will try to
6925map the old Python 2 names to the new names used in Python 3. The
6926*encoding* and *errors* tell pickle how to decode 8-bit string
6927instances pickled by Python 2; these default to 'ASCII' and 'strict',
6928respectively. The *encoding* can be 'bytes' to read these 8-bit
6929string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006930[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006931
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006932static PyObject *
6933_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006934/*[clinic end generated code: checksum=568c61356c172654a23cf4edb4afffa1dc2a55d9]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006935{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006936 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006937 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006938
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006939 if (unpickler == NULL)
6940 return NULL;
6941
6942 if (_Unpickler_SetInputStream(unpickler, file) < 0)
6943 goto error;
6944
6945 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
6946 goto error;
6947
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006948 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006949
6950 result = load(unpickler);
6951 Py_DECREF(unpickler);
6952 return result;
6953
6954 error:
6955 Py_XDECREF(unpickler);
6956 return NULL;
6957}
6958
Larry Hastings61272b72014-01-07 12:41:53 -08006959/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006960
6961_pickle.loads
6962
6963 data: object
6964 *
6965 fix_imports: bool = True
6966 encoding: str = 'ASCII'
6967 errors: str = 'strict'
6968
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006969Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006970
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006971The protocol version of the pickle is detected automatically, so no
6972protocol argument is needed. Bytes past the pickled object's
6973representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006974
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006975Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6976which are used to control compatiblity support for pickle stream
6977generated by Python 2. If *fix_imports* is True, pickle will try to
6978map the old Python 2 names to the new names used in Python 3. The
6979*encoding* and *errors* tell pickle how to decode 8-bit string
6980instances pickled by Python 2; these default to 'ASCII' and 'strict',
6981respectively. The *encoding* can be 'bytes' to read these 8-bit
6982string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006983[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006984
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006985static PyObject *
6986_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02006987/*[clinic end generated code: checksum=0b3845ad110b25220ab613e9a1e573194271a337]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006988{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006989 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006990 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006991
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006992 if (unpickler == NULL)
6993 return NULL;
6994
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006995 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006996 goto error;
6997
6998 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
6999 goto error;
7000
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007001 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007002
7003 result = load(unpickler);
7004 Py_DECREF(unpickler);
7005 return result;
7006
7007 error:
7008 Py_XDECREF(unpickler);
7009 return NULL;
7010}
7011
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007012static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007013 _PICKLE_DUMP_METHODDEF
7014 _PICKLE_DUMPS_METHODDEF
7015 _PICKLE_LOAD_METHODDEF
7016 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007017 {NULL, NULL} /* sentinel */
7018};
7019
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007020static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007021pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007022{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007023 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007024 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007025}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007026
Stefan Krahf483b0f2013-12-14 13:43:10 +01007027static void
7028pickle_free(PyObject *m)
7029{
7030 _Pickle_ClearState(_Pickle_GetState(m));
7031}
7032
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007033static int
7034pickle_traverse(PyObject *m, visitproc visit, void *arg)
7035{
7036 PickleState *st = _Pickle_GetState(m);
7037 Py_VISIT(st->PickleError);
7038 Py_VISIT(st->PicklingError);
7039 Py_VISIT(st->UnpicklingError);
7040 Py_VISIT(st->dispatch_table);
7041 Py_VISIT(st->extension_registry);
7042 Py_VISIT(st->extension_cache);
7043 Py_VISIT(st->inverted_registry);
7044 Py_VISIT(st->name_mapping_2to3);
7045 Py_VISIT(st->import_mapping_2to3);
7046 Py_VISIT(st->name_mapping_3to2);
7047 Py_VISIT(st->import_mapping_3to2);
7048 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007049 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007050}
7051
7052static struct PyModuleDef _picklemodule = {
7053 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007054 "_pickle", /* m_name */
7055 pickle_module_doc, /* m_doc */
7056 sizeof(PickleState), /* m_size */
7057 pickle_methods, /* m_methods */
7058 NULL, /* m_reload */
7059 pickle_traverse, /* m_traverse */
7060 pickle_clear, /* m_clear */
7061 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007062};
7063
7064PyMODINIT_FUNC
7065PyInit__pickle(void)
7066{
7067 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007068 PickleState *st;
7069
7070 m = PyState_FindModule(&_picklemodule);
7071 if (m) {
7072 Py_INCREF(m);
7073 return m;
7074 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007075
7076 if (PyType_Ready(&Unpickler_Type) < 0)
7077 return NULL;
7078 if (PyType_Ready(&Pickler_Type) < 0)
7079 return NULL;
7080 if (PyType_Ready(&Pdata_Type) < 0)
7081 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007082 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7083 return NULL;
7084 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7085 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007086
7087 /* Create the module and add the functions. */
7088 m = PyModule_Create(&_picklemodule);
7089 if (m == NULL)
7090 return NULL;
7091
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007092 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007093 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7094 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007095 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007096 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7097 return NULL;
7098
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007099 st = _Pickle_GetState(m);
7100
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007101 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007102 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7103 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007104 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007105 st->PicklingError = \
7106 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7107 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007108 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007109 st->UnpicklingError = \
7110 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7111 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007112 return NULL;
7113
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007114 Py_INCREF(st->PickleError);
7115 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007116 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007117 Py_INCREF(st->PicklingError);
7118 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007119 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007120 Py_INCREF(st->UnpicklingError);
7121 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007122 return NULL;
7123
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007124 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007125 return NULL;
7126
7127 return m;
7128}