blob: 435cbaea9d2ebef66e2ae84601309894fdd3276d [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]*/
Larry Hastings581ee362014-01-28 05:00:08 -080015/*[clinic end generated code: output=da39a3ee5e6b4b0d input=11c45248a41dd3fc]*/
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*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200378 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000379 (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;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003029 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003030 }
3031 else if (PyErr_Occurred()) {
3032 return -1;
3033 }
3034
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003035 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003036 if (item) {
3037 if (!PyUnicode_Check(item)) {
3038 PyErr_Format(PyExc_RuntimeError,
3039 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3040 "should be strings, not %.200s",
3041 Py_TYPE(item)->tp_name);
3042 return -1;
3043 }
3044 Py_CLEAR(*module_name);
3045 Py_INCREF(item);
3046 *module_name = item;
3047 }
3048 else if (PyErr_Occurred()) {
3049 return -1;
3050 }
3051
3052 return 0;
3053}
3054
3055static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003056save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3057{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003058 PyObject *global_name = NULL;
3059 PyObject *module_name = NULL;
3060 PyObject *module = NULL;
3061 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003062 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003063 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003064 _Py_IDENTIFIER(__name__);
3065 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003066
3067 const char global_op = GLOBAL;
3068
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003069 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003070 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003071 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003072 }
3073 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003074 if (self->proto >= 4) {
3075 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3076 if (global_name == NULL) {
3077 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3078 goto error;
3079 PyErr_Clear();
3080 }
3081 }
3082 if (global_name == NULL) {
3083 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3084 if (global_name == NULL)
3085 goto error;
3086 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003087 }
3088
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003089 module_name = whichmodule(obj, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003090 if (module_name == NULL)
3091 goto error;
3092
3093 /* XXX: Change to use the import C API directly with level=0 to disallow
3094 relative imports.
3095
3096 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3097 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3098 custom import functions (IMHO, this would be a nice security
3099 feature). The import C API would need to be extended to support the
3100 extra parameters of __import__ to fix that. */
3101 module = PyImport_Import(module_name);
3102 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003103 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003104 "Can't pickle %R: import of module %R failed",
3105 obj, module_name);
3106 goto error;
3107 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003108 cls = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003109 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003110 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003111 "Can't pickle %R: attribute lookup %S on %S failed",
3112 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003113 goto error;
3114 }
3115 if (cls != obj) {
3116 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003117 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003118 "Can't pickle %R: it's not the same object as %S.%S",
3119 obj, module_name, global_name);
3120 goto error;
3121 }
3122 Py_DECREF(cls);
3123
3124 if (self->proto >= 2) {
3125 /* See whether this is in the extension registry, and if
3126 * so generate an EXT opcode.
3127 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003128 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003129 PyObject *code_obj; /* extension code as Python object */
3130 long code; /* extension code as C value */
3131 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003132 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003133
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003134 extension_key = PyTuple_Pack(2, module_name, global_name);
3135 if (extension_key == NULL) {
3136 goto error;
3137 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003138 code_obj = PyDict_GetItemWithError(st->extension_registry,
3139 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003140 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003141 /* The object is not registered in the extension registry.
3142 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003143 if (code_obj == NULL) {
3144 if (PyErr_Occurred()) {
3145 goto error;
3146 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003147 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003148 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003149
3150 /* XXX: pickle.py doesn't check neither the type, nor the range
3151 of the value returned by the extension_registry. It should for
3152 consistency. */
3153
3154 /* Verify code_obj has the right type and value. */
3155 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003156 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003157 "Can't pickle %R: extension code %R isn't an integer",
3158 obj, code_obj);
3159 goto error;
3160 }
3161 code = PyLong_AS_LONG(code_obj);
3162 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003163 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003164 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3165 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003166 goto error;
3167 }
3168
3169 /* Generate an EXT opcode. */
3170 if (code <= 0xff) {
3171 pdata[0] = EXT1;
3172 pdata[1] = (unsigned char)code;
3173 n = 2;
3174 }
3175 else if (code <= 0xffff) {
3176 pdata[0] = EXT2;
3177 pdata[1] = (unsigned char)(code & 0xff);
3178 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3179 n = 3;
3180 }
3181 else {
3182 pdata[0] = EXT4;
3183 pdata[1] = (unsigned char)(code & 0xff);
3184 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3185 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3186 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3187 n = 5;
3188 }
3189
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003190 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003191 goto error;
3192 }
3193 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003194 gen_global:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003195 if (self->proto >= 4) {
3196 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003197
Christian Heimese8b1ba12013-11-23 21:13:39 +01003198 if (save(self, module_name, 0) < 0)
3199 goto error;
3200 if (save(self, global_name, 0) < 0)
3201 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003202
3203 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3204 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003205 }
3206 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003207 /* Generate a normal global opcode if we are using a pickle
3208 protocol < 4, or if the object is not registered in the
3209 extension registry. */
3210 PyObject *encoded;
3211 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003212
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003213 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003214 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003215
3216 /* For protocol < 3 and if the user didn't request against doing
3217 so, we convert module names to the old 2.x module names. */
3218 if (self->proto < 3 && self->fix_imports) {
3219 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003220 goto error;
3221 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003222 }
3223
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003224 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3225 both the module name and the global name using UTF-8. We do so
3226 only when we are using the pickle protocol newer than version
3227 3. This is to ensure compatibility with older Unpickler running
3228 on Python 2.x. */
3229 if (self->proto == 3) {
3230 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003231 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003232 else {
3233 unicode_encoder = PyUnicode_AsASCIIString;
3234 }
3235 encoded = unicode_encoder(module_name);
3236 if (encoded == NULL) {
3237 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003238 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003239 "can't pickle module identifier '%S' using "
3240 "pickle protocol %i",
3241 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003242 goto error;
3243 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003244 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3245 PyBytes_GET_SIZE(encoded)) < 0) {
3246 Py_DECREF(encoded);
3247 goto error;
3248 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003249 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003250 if(_Pickler_Write(self, "\n", 1) < 0)
3251 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003252
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003253 /* Save the name of the module. */
3254 encoded = unicode_encoder(global_name);
3255 if (encoded == NULL) {
3256 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003257 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003258 "can't pickle global identifier '%S' using "
3259 "pickle protocol %i",
3260 global_name, self->proto);
3261 goto error;
3262 }
3263 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3264 PyBytes_GET_SIZE(encoded)) < 0) {
3265 Py_DECREF(encoded);
3266 goto error;
3267 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003268 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003269 if (_Pickler_Write(self, "\n", 1) < 0)
3270 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003271 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003272 /* Memoize the object. */
3273 if (memo_put(self, obj) < 0)
3274 goto error;
3275 }
3276
3277 if (0) {
3278 error:
3279 status = -1;
3280 }
3281 Py_XDECREF(module_name);
3282 Py_XDECREF(global_name);
3283 Py_XDECREF(module);
3284
3285 return status;
3286}
3287
3288static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003289save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3290{
3291 PyObject *reduce_value;
3292 int status;
3293
3294 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3295 if (reduce_value == NULL) {
3296 return -1;
3297 }
3298 status = save_reduce(self, reduce_value, obj);
3299 Py_DECREF(reduce_value);
3300 return status;
3301}
3302
3303static int
3304save_type(PicklerObject *self, PyObject *obj)
3305{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003306 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003307 return save_singleton_type(self, obj, Py_None);
3308 }
3309 else if (obj == (PyObject *)&PyEllipsis_Type) {
3310 return save_singleton_type(self, obj, Py_Ellipsis);
3311 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003312 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003313 return save_singleton_type(self, obj, Py_NotImplemented);
3314 }
3315 return save_global(self, obj, NULL);
3316}
3317
3318static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003319save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3320{
3321 PyObject *pid = NULL;
3322 int status = 0;
3323
3324 const char persid_op = PERSID;
3325 const char binpersid_op = BINPERSID;
3326
3327 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003328 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003329 if (pid == NULL)
3330 return -1;
3331
3332 if (pid != Py_None) {
3333 if (self->bin) {
3334 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003335 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003336 goto error;
3337 }
3338 else {
3339 PyObject *pid_str = NULL;
3340 char *pid_ascii_bytes;
3341 Py_ssize_t size;
3342
3343 pid_str = PyObject_Str(pid);
3344 if (pid_str == NULL)
3345 goto error;
3346
3347 /* XXX: Should it check whether the persistent id only contains
3348 ASCII characters? And what if the pid contains embedded
3349 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003350 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003351 Py_DECREF(pid_str);
3352 if (pid_ascii_bytes == NULL)
3353 goto error;
3354
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003355 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3356 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3357 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003358 goto error;
3359 }
3360 status = 1;
3361 }
3362
3363 if (0) {
3364 error:
3365 status = -1;
3366 }
3367 Py_XDECREF(pid);
3368
3369 return status;
3370}
3371
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003372static PyObject *
3373get_class(PyObject *obj)
3374{
3375 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003376 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003377
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003378 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003379 if (cls == NULL) {
3380 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3381 PyErr_Clear();
3382 cls = (PyObject *) Py_TYPE(obj);
3383 Py_INCREF(cls);
3384 }
3385 }
3386 return cls;
3387}
3388
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003389/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3390 * appropriate __reduce__ method for obj.
3391 */
3392static int
3393save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3394{
3395 PyObject *callable;
3396 PyObject *argtup;
3397 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003398 PyObject *listitems = Py_None;
3399 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003400 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003401 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003402 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003403
3404 const char reduce_op = REDUCE;
3405 const char build_op = BUILD;
3406 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003407 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003408
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003409 size = PyTuple_Size(args);
3410 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003411 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003412 "__reduce__ must contain 2 through 5 elements");
3413 return -1;
3414 }
3415
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003416 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3417 &callable, &argtup, &state, &listitems, &dictitems))
3418 return -1;
3419
3420 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003421 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003422 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003423 return -1;
3424 }
3425 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003426 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003427 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003428 return -1;
3429 }
3430
3431 if (state == Py_None)
3432 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003433
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003434 if (listitems == Py_None)
3435 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003436 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003437 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003438 "returned by __reduce__ must be an iterator, not %s",
3439 Py_TYPE(listitems)->tp_name);
3440 return -1;
3441 }
3442
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003443 if (dictitems == Py_None)
3444 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003445 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003446 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003447 "returned by __reduce__ must be an iterator, not %s",
3448 Py_TYPE(dictitems)->tp_name);
3449 return -1;
3450 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003451
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003452 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003453 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003454 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003455
Victor Stinner804e05e2013-11-14 01:26:17 +01003456 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003457 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003458 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003459 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003460 }
3461 PyErr_Clear();
3462 }
3463 else if (self->proto >= 4) {
3464 _Py_IDENTIFIER(__newobj_ex__);
3465 use_newobj_ex = PyUnicode_Check(name) &&
3466 PyUnicode_Compare(
3467 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3468 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003469 }
3470 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003471 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003472 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003473 PyUnicode_Compare(
3474 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003475 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003476 }
3477 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003478
3479 if (use_newobj_ex) {
3480 PyObject *cls;
3481 PyObject *args;
3482 PyObject *kwargs;
3483
3484 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003485 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003486 "length of the NEWOBJ_EX argument tuple must be "
3487 "exactly 3, not %zd", Py_SIZE(argtup));
3488 return -1;
3489 }
3490
3491 cls = PyTuple_GET_ITEM(argtup, 0);
3492 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003493 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003494 "first item from NEWOBJ_EX argument tuple must "
3495 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3496 return -1;
3497 }
3498 args = PyTuple_GET_ITEM(argtup, 1);
3499 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003500 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003501 "second item from NEWOBJ_EX argument tuple must "
3502 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3503 return -1;
3504 }
3505 kwargs = PyTuple_GET_ITEM(argtup, 2);
3506 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003507 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003508 "third item from NEWOBJ_EX argument tuple must "
3509 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3510 return -1;
3511 }
3512
3513 if (save(self, cls, 0) < 0 ||
3514 save(self, args, 0) < 0 ||
3515 save(self, kwargs, 0) < 0 ||
3516 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3517 return -1;
3518 }
3519 }
3520 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003521 PyObject *cls;
3522 PyObject *newargtup;
3523 PyObject *obj_class;
3524 int p;
3525
3526 /* Sanity checks. */
3527 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003528 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003529 return -1;
3530 }
3531
3532 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003533 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003534 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003535 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003536 return -1;
3537 }
3538
3539 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003540 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003541 p = obj_class != cls; /* true iff a problem */
3542 Py_DECREF(obj_class);
3543 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003544 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003545 "__newobj__ args has the wrong class");
3546 return -1;
3547 }
3548 }
3549 /* XXX: These calls save() are prone to infinite recursion. Imagine
3550 what happen if the value returned by the __reduce__() method of
3551 some extension type contains another object of the same type. Ouch!
3552
3553 Here is a quick example, that I ran into, to illustrate what I
3554 mean:
3555
3556 >>> import pickle, copyreg
3557 >>> copyreg.dispatch_table.pop(complex)
3558 >>> pickle.dumps(1+2j)
3559 Traceback (most recent call last):
3560 ...
3561 RuntimeError: maximum recursion depth exceeded
3562
3563 Removing the complex class from copyreg.dispatch_table made the
3564 __reduce_ex__() method emit another complex object:
3565
3566 >>> (1+1j).__reduce_ex__(2)
3567 (<function __newobj__ at 0xb7b71c3c>,
3568 (<class 'complex'>, (1+1j)), None, None, None)
3569
3570 Thus when save() was called on newargstup (the 2nd item) recursion
3571 ensued. Of course, the bug was in the complex class which had a
3572 broken __getnewargs__() that emitted another complex object. But,
3573 the point, here, is it is quite easy to end up with a broken reduce
3574 function. */
3575
3576 /* Save the class and its __new__ arguments. */
3577 if (save(self, cls, 0) < 0)
3578 return -1;
3579
3580 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3581 if (newargtup == NULL)
3582 return -1;
3583
3584 p = save(self, newargtup, 0);
3585 Py_DECREF(newargtup);
3586 if (p < 0)
3587 return -1;
3588
3589 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003590 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003591 return -1;
3592 }
3593 else { /* Not using NEWOBJ. */
3594 if (save(self, callable, 0) < 0 ||
3595 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003596 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003597 return -1;
3598 }
3599
3600 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3601 the caller do not want to memoize the object. Not particularly useful,
3602 but that is to mimic the behavior save_reduce() in pickle.py when
3603 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003604 if (obj != NULL) {
3605 /* If the object is already in the memo, this means it is
3606 recursive. In this case, throw away everything we put on the
3607 stack, and fetch the object back from the memo. */
3608 if (PyMemoTable_Get(self->memo, obj)) {
3609 const char pop_op = POP;
3610
3611 if (_Pickler_Write(self, &pop_op, 1) < 0)
3612 return -1;
3613 if (memo_get(self, obj) < 0)
3614 return -1;
3615
3616 return 0;
3617 }
3618 else if (memo_put(self, obj) < 0)
3619 return -1;
3620 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003621
3622 if (listitems && batch_list(self, listitems) < 0)
3623 return -1;
3624
3625 if (dictitems && batch_dict(self, dictitems) < 0)
3626 return -1;
3627
3628 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003629 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003630 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003631 return -1;
3632 }
3633
3634 return 0;
3635}
3636
3637static int
3638save(PicklerObject *self, PyObject *obj, int pers_save)
3639{
3640 PyTypeObject *type;
3641 PyObject *reduce_func = NULL;
3642 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003643 int status = 0;
3644
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003645 if (_Pickler_OpcodeBoundary(self) < 0)
3646 return -1;
3647
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003648 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003649 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003650
3651 /* The extra pers_save argument is necessary to avoid calling save_pers()
3652 on its returned object. */
3653 if (!pers_save && self->pers_func) {
3654 /* save_pers() returns:
3655 -1 to signal an error;
3656 0 if it did nothing successfully;
3657 1 if a persistent id was saved.
3658 */
3659 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3660 goto done;
3661 }
3662
3663 type = Py_TYPE(obj);
3664
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003665 /* The old cPickle had an optimization that used switch-case statement
3666 dispatching on the first letter of the type name. This has was removed
3667 since benchmarks shown that this optimization was actually slowing
3668 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003669
3670 /* Atom types; these aren't memoized, so don't check the memo. */
3671
3672 if (obj == Py_None) {
3673 status = save_none(self, obj);
3674 goto done;
3675 }
3676 else if (obj == Py_False || obj == Py_True) {
3677 status = save_bool(self, obj);
3678 goto done;
3679 }
3680 else if (type == &PyLong_Type) {
3681 status = save_long(self, obj);
3682 goto done;
3683 }
3684 else if (type == &PyFloat_Type) {
3685 status = save_float(self, obj);
3686 goto done;
3687 }
3688
3689 /* Check the memo to see if it has the object. If so, generate
3690 a GET (or BINGET) opcode, instead of pickling the object
3691 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003692 if (PyMemoTable_Get(self->memo, obj)) {
3693 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003694 goto error;
3695 goto done;
3696 }
3697
3698 if (type == &PyBytes_Type) {
3699 status = save_bytes(self, obj);
3700 goto done;
3701 }
3702 else if (type == &PyUnicode_Type) {
3703 status = save_unicode(self, obj);
3704 goto done;
3705 }
3706 else if (type == &PyDict_Type) {
3707 status = save_dict(self, obj);
3708 goto done;
3709 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003710 else if (type == &PySet_Type) {
3711 status = save_set(self, obj);
3712 goto done;
3713 }
3714 else if (type == &PyFrozenSet_Type) {
3715 status = save_frozenset(self, obj);
3716 goto done;
3717 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003718 else if (type == &PyList_Type) {
3719 status = save_list(self, obj);
3720 goto done;
3721 }
3722 else if (type == &PyTuple_Type) {
3723 status = save_tuple(self, obj);
3724 goto done;
3725 }
3726 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003727 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003728 goto done;
3729 }
3730 else if (type == &PyFunction_Type) {
3731 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003732 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003733 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003734
3735 /* XXX: This part needs some unit tests. */
3736
3737 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003738 * self.dispatch_table, copyreg.dispatch_table, the object's
3739 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003740 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003741 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003742 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003743 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3744 (PyObject *)type);
3745 if (reduce_func == NULL) {
3746 if (PyErr_Occurred()) {
3747 goto error;
3748 }
3749 } else {
3750 /* PyDict_GetItemWithError() returns a borrowed reference.
3751 Increase the reference count to be consistent with
3752 PyObject_GetItem and _PyObject_GetAttrId used below. */
3753 Py_INCREF(reduce_func);
3754 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003755 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003756 reduce_func = PyObject_GetItem(self->dispatch_table,
3757 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003758 if (reduce_func == NULL) {
3759 if (PyErr_ExceptionMatches(PyExc_KeyError))
3760 PyErr_Clear();
3761 else
3762 goto error;
3763 }
3764 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003766 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003767 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003768 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003769 else if (PyType_IsSubtype(type, &PyType_Type)) {
3770 status = save_global(self, obj, NULL);
3771 goto done;
3772 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003773 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003774 _Py_IDENTIFIER(__reduce__);
3775 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003776
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003777
3778 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3779 automatically defined as __reduce__. While this is convenient, this
3780 make it impossible to know which method was actually called. Of
3781 course, this is not a big deal. But still, it would be nice to let
3782 the user know which method was called when something go
3783 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3784 don't actually have to check for a __reduce__ method. */
3785
3786 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003787 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003788 if (reduce_func != NULL) {
3789 PyObject *proto;
3790 proto = PyLong_FromLong(self->proto);
3791 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003792 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003793 }
3794 }
3795 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003796 PickleState *st = _Pickle_GetGlobalState();
3797
3798 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003799 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003800 }
3801 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003802 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003803 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003804 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003805 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003806 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003807 PyObject *empty_tuple = PyTuple_New(0);
3808 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003809 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003810 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003811 }
3812 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003813 PyErr_Format(st->PicklingError,
3814 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003815 type->tp_name, obj);
3816 goto error;
3817 }
3818 }
3819 }
3820
3821 if (reduce_value == NULL)
3822 goto error;
3823
3824 if (PyUnicode_Check(reduce_value)) {
3825 status = save_global(self, obj, reduce_value);
3826 goto done;
3827 }
3828
3829 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003830 PickleState *st = _Pickle_GetGlobalState();
3831 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003832 "__reduce__ must return a string or tuple");
3833 goto error;
3834 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003835
3836 status = save_reduce(self, reduce_value, obj);
3837
3838 if (0) {
3839 error:
3840 status = -1;
3841 }
3842 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003843
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003844 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003845 Py_XDECREF(reduce_func);
3846 Py_XDECREF(reduce_value);
3847
3848 return status;
3849}
3850
3851static int
3852dump(PicklerObject *self, PyObject *obj)
3853{
3854 const char stop_op = STOP;
3855
3856 if (self->proto >= 2) {
3857 char header[2];
3858
3859 header[0] = PROTO;
3860 assert(self->proto >= 0 && self->proto < 256);
3861 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003862 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003863 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003864 if (self->proto >= 4)
3865 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003866 }
3867
3868 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003869 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003870 return -1;
3871
3872 return 0;
3873}
3874
Larry Hastings61272b72014-01-07 12:41:53 -08003875/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003876
3877_pickle.Pickler.clear_memo
3878
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003879Clears the pickler's "memo".
3880
3881The memo is the data structure that remembers which objects the
3882pickler has already seen, so that shared or recursive objects are
3883pickled by reference and not by value. This method is useful when
3884re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003885[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003886
Larry Hastings3cceb382014-01-04 11:09:09 -08003887static PyObject *
3888_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08003889/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003890{
3891 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003892 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003893
3894 Py_RETURN_NONE;
3895}
3896
Larry Hastings61272b72014-01-07 12:41:53 -08003897/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003898
3899_pickle.Pickler.dump
3900
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003901 obj: object
3902 /
3903
3904Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003905[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003906
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003907static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003908_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08003909/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003910{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003911 /* Check whether the Pickler was initialized correctly (issue3664).
3912 Developers often forget to call __init__() in their subclasses, which
3913 would trigger a segfault without this check. */
3914 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003915 PickleState *st = _Pickle_GetGlobalState();
3916 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003917 "Pickler.__init__() was not called by %s.__init__()",
3918 Py_TYPE(self)->tp_name);
3919 return NULL;
3920 }
3921
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003922 if (_Pickler_ClearBuffer(self) < 0)
3923 return NULL;
3924
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003925 if (dump(self, obj) < 0)
3926 return NULL;
3927
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003928 if (_Pickler_FlushToFile(self) < 0)
3929 return NULL;
3930
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003931 Py_RETURN_NONE;
3932}
3933
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02003934/*[clinic input]
3935
3936_pickle.Pickler.__sizeof__ -> Py_ssize_t
3937
3938Returns size in memory, in bytes.
3939[clinic start generated code]*/
3940
3941static Py_ssize_t
3942_pickle_Pickler___sizeof___impl(PicklerObject *self)
3943/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
3944{
3945 Py_ssize_t res, s;
3946
3947 res = sizeof(PicklerObject);
3948 if (self->memo != NULL) {
3949 res += sizeof(PyMemoTable);
3950 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
3951 }
3952 if (self->output_buffer != NULL) {
3953 s = _PySys_GetSizeOf(self->output_buffer);
3954 if (s == -1)
3955 return -1;
3956 res += s;
3957 }
3958 return res;
3959}
3960
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003961static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003962 _PICKLE_PICKLER_DUMP_METHODDEF
3963 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02003964 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003965 {NULL, NULL} /* sentinel */
3966};
3967
3968static void
3969Pickler_dealloc(PicklerObject *self)
3970{
3971 PyObject_GC_UnTrack(self);
3972
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003973 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003974 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003975 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003976 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003977 Py_XDECREF(self->fast_memo);
3978
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003979 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003980
3981 Py_TYPE(self)->tp_free((PyObject *)self);
3982}
3983
3984static int
3985Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
3986{
3987 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003988 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003989 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003990 Py_VISIT(self->fast_memo);
3991 return 0;
3992}
3993
3994static int
3995Pickler_clear(PicklerObject *self)
3996{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003997 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003998 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003999 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004000 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004001 Py_CLEAR(self->fast_memo);
4002
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004003 if (self->memo != NULL) {
4004 PyMemoTable *memo = self->memo;
4005 self->memo = NULL;
4006 PyMemoTable_Del(memo);
4007 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004008 return 0;
4009}
4010
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004011
Larry Hastings61272b72014-01-07 12:41:53 -08004012/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004013
4014_pickle.Pickler.__init__
4015
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004016 file: object
4017 protocol: object = NULL
4018 fix_imports: bool = True
4019
4020This takes a binary file for writing a pickle data stream.
4021
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004022The optional *protocol* argument tells the pickler to use the given
4023protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4024protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004025
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004026Specifying a negative protocol version selects the highest protocol
4027version supported. The higher the protocol used, the more recent the
4028version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004029
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004030The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004031bytes argument. It can thus be a file object opened for binary
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004032writing, a io.BytesIO instance, or any other custom object that meets
4033this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004034
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004035If *fix_imports* is True and protocol is less than 3, pickle will try
4036to map the new Python 3 names to the old module names used in Python
40372, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004038[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004039
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004040static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004041_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08004042/*[clinic end generated code: output=56e229f3b1f4332f input=b8cdeb7e3f5ee674]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004043{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004044 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004045 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004046
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004047 /* In case of multiple __init__() calls, clear previous content. */
4048 if (self->write != NULL)
4049 (void)Pickler_clear(self);
4050
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004051 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004052 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004053
4054 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004055 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004056
4057 /* memo and output_buffer may have already been created in _Pickler_New */
4058 if (self->memo == NULL) {
4059 self->memo = PyMemoTable_New();
4060 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004061 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004062 }
4063 self->output_len = 0;
4064 if (self->output_buffer == NULL) {
4065 self->max_output_len = WRITE_BUF_SIZE;
4066 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4067 self->max_output_len);
4068 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004069 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004070 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004071
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004072 self->fast = 0;
4073 self->fast_nesting = 0;
4074 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004075 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004076 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4077 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4078 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004079 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004080 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004081 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004082 self->dispatch_table = NULL;
4083 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4084 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4085 &PyId_dispatch_table);
4086 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004087 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004088 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004089
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004090 return 0;
4091}
4092
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004093
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004094/* Define a proxy object for the Pickler's internal memo object. This is to
4095 * avoid breaking code like:
4096 * pickler.memo.clear()
4097 * and
4098 * pickler.memo = saved_memo
4099 * Is this a good idea? Not really, but we don't want to break code that uses
4100 * it. Note that we don't implement the entire mapping API here. This is
4101 * intentional, as these should be treated as black-box implementation details.
4102 */
4103
Larry Hastings61272b72014-01-07 12:41:53 -08004104/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004105_pickle.PicklerMemoProxy.clear
4106
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004107Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004108[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004109
Larry Hastings3cceb382014-01-04 11:09:09 -08004110static PyObject *
4111_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004112/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004113{
4114 if (self->pickler->memo)
4115 PyMemoTable_Clear(self->pickler->memo);
4116 Py_RETURN_NONE;
4117}
4118
Larry Hastings61272b72014-01-07 12:41:53 -08004119/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004120_pickle.PicklerMemoProxy.copy
4121
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004122Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004123[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004124
Larry Hastings3cceb382014-01-04 11:09:09 -08004125static PyObject *
4126_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004127/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004128{
4129 Py_ssize_t i;
4130 PyMemoTable *memo;
4131 PyObject *new_memo = PyDict_New();
4132 if (new_memo == NULL)
4133 return NULL;
4134
4135 memo = self->pickler->memo;
4136 for (i = 0; i < memo->mt_allocated; ++i) {
4137 PyMemoEntry entry = memo->mt_table[i];
4138 if (entry.me_key != NULL) {
4139 int status;
4140 PyObject *key, *value;
4141
4142 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004143 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004144
4145 if (key == NULL || value == NULL) {
4146 Py_XDECREF(key);
4147 Py_XDECREF(value);
4148 goto error;
4149 }
4150 status = PyDict_SetItem(new_memo, key, value);
4151 Py_DECREF(key);
4152 Py_DECREF(value);
4153 if (status < 0)
4154 goto error;
4155 }
4156 }
4157 return new_memo;
4158
4159 error:
4160 Py_XDECREF(new_memo);
4161 return NULL;
4162}
4163
Larry Hastings61272b72014-01-07 12:41:53 -08004164/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004165_pickle.PicklerMemoProxy.__reduce__
4166
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004167Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004168[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004169
Larry Hastings3cceb382014-01-04 11:09:09 -08004170static PyObject *
4171_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004172/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004173{
4174 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004175 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004176 if (contents == NULL)
4177 return NULL;
4178
4179 reduce_value = PyTuple_New(2);
4180 if (reduce_value == NULL) {
4181 Py_DECREF(contents);
4182 return NULL;
4183 }
4184 dict_args = PyTuple_New(1);
4185 if (dict_args == NULL) {
4186 Py_DECREF(contents);
4187 Py_DECREF(reduce_value);
4188 return NULL;
4189 }
4190 PyTuple_SET_ITEM(dict_args, 0, contents);
4191 Py_INCREF((PyObject *)&PyDict_Type);
4192 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4193 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4194 return reduce_value;
4195}
4196
4197static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004198 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4199 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4200 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004201 {NULL, NULL} /* sentinel */
4202};
4203
4204static void
4205PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4206{
4207 PyObject_GC_UnTrack(self);
4208 Py_XDECREF(self->pickler);
4209 PyObject_GC_Del((PyObject *)self);
4210}
4211
4212static int
4213PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4214 visitproc visit, void *arg)
4215{
4216 Py_VISIT(self->pickler);
4217 return 0;
4218}
4219
4220static int
4221PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4222{
4223 Py_CLEAR(self->pickler);
4224 return 0;
4225}
4226
4227static PyTypeObject PicklerMemoProxyType = {
4228 PyVarObject_HEAD_INIT(NULL, 0)
4229 "_pickle.PicklerMemoProxy", /*tp_name*/
4230 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4231 0,
4232 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4233 0, /* tp_print */
4234 0, /* tp_getattr */
4235 0, /* tp_setattr */
4236 0, /* tp_compare */
4237 0, /* tp_repr */
4238 0, /* tp_as_number */
4239 0, /* tp_as_sequence */
4240 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004241 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004242 0, /* tp_call */
4243 0, /* tp_str */
4244 PyObject_GenericGetAttr, /* tp_getattro */
4245 PyObject_GenericSetAttr, /* tp_setattro */
4246 0, /* tp_as_buffer */
4247 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4248 0, /* tp_doc */
4249 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4250 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4251 0, /* tp_richcompare */
4252 0, /* tp_weaklistoffset */
4253 0, /* tp_iter */
4254 0, /* tp_iternext */
4255 picklerproxy_methods, /* tp_methods */
4256};
4257
4258static PyObject *
4259PicklerMemoProxy_New(PicklerObject *pickler)
4260{
4261 PicklerMemoProxyObject *self;
4262
4263 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4264 if (self == NULL)
4265 return NULL;
4266 Py_INCREF(pickler);
4267 self->pickler = pickler;
4268 PyObject_GC_Track(self);
4269 return (PyObject *)self;
4270}
4271
4272/*****************************************************************************/
4273
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004274static PyObject *
4275Pickler_get_memo(PicklerObject *self)
4276{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004277 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004278}
4279
4280static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004281Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004282{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004283 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004284
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004285 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004286 PyErr_SetString(PyExc_TypeError,
4287 "attribute deletion is not supported");
4288 return -1;
4289 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004290
4291 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4292 PicklerObject *pickler =
4293 ((PicklerMemoProxyObject *)obj)->pickler;
4294
4295 new_memo = PyMemoTable_Copy(pickler->memo);
4296 if (new_memo == NULL)
4297 return -1;
4298 }
4299 else if (PyDict_Check(obj)) {
4300 Py_ssize_t i = 0;
4301 PyObject *key, *value;
4302
4303 new_memo = PyMemoTable_New();
4304 if (new_memo == NULL)
4305 return -1;
4306
4307 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004308 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004309 PyObject *memo_obj;
4310
4311 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4312 PyErr_SetString(PyExc_TypeError,
4313 "'memo' values must be 2-item tuples");
4314 goto error;
4315 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004316 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004317 if (memo_id == -1 && PyErr_Occurred())
4318 goto error;
4319 memo_obj = PyTuple_GET_ITEM(value, 1);
4320 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4321 goto error;
4322 }
4323 }
4324 else {
4325 PyErr_Format(PyExc_TypeError,
4326 "'memo' attribute must be an PicklerMemoProxy object"
4327 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004328 return -1;
4329 }
4330
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004331 PyMemoTable_Del(self->memo);
4332 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004333
4334 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004335
4336 error:
4337 if (new_memo)
4338 PyMemoTable_Del(new_memo);
4339 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004340}
4341
4342static PyObject *
4343Pickler_get_persid(PicklerObject *self)
4344{
4345 if (self->pers_func == NULL)
4346 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4347 else
4348 Py_INCREF(self->pers_func);
4349 return self->pers_func;
4350}
4351
4352static int
4353Pickler_set_persid(PicklerObject *self, PyObject *value)
4354{
4355 PyObject *tmp;
4356
4357 if (value == NULL) {
4358 PyErr_SetString(PyExc_TypeError,
4359 "attribute deletion is not supported");
4360 return -1;
4361 }
4362 if (!PyCallable_Check(value)) {
4363 PyErr_SetString(PyExc_TypeError,
4364 "persistent_id must be a callable taking one argument");
4365 return -1;
4366 }
4367
4368 tmp = self->pers_func;
4369 Py_INCREF(value);
4370 self->pers_func = value;
4371 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4372
4373 return 0;
4374}
4375
4376static PyMemberDef Pickler_members[] = {
4377 {"bin", T_INT, offsetof(PicklerObject, bin)},
4378 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004379 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004380 {NULL}
4381};
4382
4383static PyGetSetDef Pickler_getsets[] = {
4384 {"memo", (getter)Pickler_get_memo,
4385 (setter)Pickler_set_memo},
4386 {"persistent_id", (getter)Pickler_get_persid,
4387 (setter)Pickler_set_persid},
4388 {NULL}
4389};
4390
4391static PyTypeObject Pickler_Type = {
4392 PyVarObject_HEAD_INIT(NULL, 0)
4393 "_pickle.Pickler" , /*tp_name*/
4394 sizeof(PicklerObject), /*tp_basicsize*/
4395 0, /*tp_itemsize*/
4396 (destructor)Pickler_dealloc, /*tp_dealloc*/
4397 0, /*tp_print*/
4398 0, /*tp_getattr*/
4399 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004400 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004401 0, /*tp_repr*/
4402 0, /*tp_as_number*/
4403 0, /*tp_as_sequence*/
4404 0, /*tp_as_mapping*/
4405 0, /*tp_hash*/
4406 0, /*tp_call*/
4407 0, /*tp_str*/
4408 0, /*tp_getattro*/
4409 0, /*tp_setattro*/
4410 0, /*tp_as_buffer*/
4411 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004412 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004413 (traverseproc)Pickler_traverse, /*tp_traverse*/
4414 (inquiry)Pickler_clear, /*tp_clear*/
4415 0, /*tp_richcompare*/
4416 0, /*tp_weaklistoffset*/
4417 0, /*tp_iter*/
4418 0, /*tp_iternext*/
4419 Pickler_methods, /*tp_methods*/
4420 Pickler_members, /*tp_members*/
4421 Pickler_getsets, /*tp_getset*/
4422 0, /*tp_base*/
4423 0, /*tp_dict*/
4424 0, /*tp_descr_get*/
4425 0, /*tp_descr_set*/
4426 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004427 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004428 PyType_GenericAlloc, /*tp_alloc*/
4429 PyType_GenericNew, /*tp_new*/
4430 PyObject_GC_Del, /*tp_free*/
4431 0, /*tp_is_gc*/
4432};
4433
Victor Stinner121aab42011-09-29 23:40:53 +02004434/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004435
4436 XXX: It would be nice to able to avoid Python function call overhead, by
4437 using directly the C version of find_class(), when find_class() is not
4438 overridden by a subclass. Although, this could become rather hackish. A
4439 simpler optimization would be to call the C function when self is not a
4440 subclass instance. */
4441static PyObject *
4442find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4443{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004444 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004445
4446 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4447 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004448}
4449
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004450static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004451marker(UnpicklerObject *self)
4452{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004453 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004454 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004455 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004456 return -1;
4457 }
4458
4459 return self->marks[--self->num_marks];
4460}
4461
4462static int
4463load_none(UnpicklerObject *self)
4464{
4465 PDATA_APPEND(self->stack, Py_None, -1);
4466 return 0;
4467}
4468
4469static int
4470bad_readline(void)
4471{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004472 PickleState *st = _Pickle_GetGlobalState();
4473 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004474 return -1;
4475}
4476
4477static int
4478load_int(UnpicklerObject *self)
4479{
4480 PyObject *value;
4481 char *endptr, *s;
4482 Py_ssize_t len;
4483 long x;
4484
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004485 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004486 return -1;
4487 if (len < 2)
4488 return bad_readline();
4489
4490 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004491 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004492 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004493 x = strtol(s, &endptr, 0);
4494
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004495 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004496 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004497 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004498 errno = 0;
4499 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004500 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004501 if (value == NULL) {
4502 PyErr_SetString(PyExc_ValueError,
4503 "could not convert string to int");
4504 return -1;
4505 }
4506 }
4507 else {
4508 if (len == 3 && (x == 0 || x == 1)) {
4509 if ((value = PyBool_FromLong(x)) == NULL)
4510 return -1;
4511 }
4512 else {
4513 if ((value = PyLong_FromLong(x)) == NULL)
4514 return -1;
4515 }
4516 }
4517
4518 PDATA_PUSH(self->stack, value, -1);
4519 return 0;
4520}
4521
4522static int
4523load_bool(UnpicklerObject *self, PyObject *boolean)
4524{
4525 assert(boolean == Py_True || boolean == Py_False);
4526 PDATA_APPEND(self->stack, boolean, -1);
4527 return 0;
4528}
4529
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004530/* s contains x bytes of an unsigned little-endian integer. Return its value
4531 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4532 */
4533static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004534calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004535{
4536 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004537 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004538 size_t x = 0;
4539
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004540 for (i = 0; i < nbytes && i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004541 x |= (size_t) s[i] << (8 * i);
4542 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004543
4544 if (x > PY_SSIZE_T_MAX)
4545 return -1;
4546 else
4547 return (Py_ssize_t) x;
4548}
4549
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004550/* s contains x bytes of a little-endian integer. Return its value as a
4551 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4552 * int, but when x is 4 it's a signed one. This is an historical source
4553 * of x-platform bugs.
4554 */
4555static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004556calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004557{
4558 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004559 int i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004560 long x = 0;
4561
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004562 for (i = 0; i < nbytes; i++) {
4563 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004564 }
4565
4566 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4567 * is signed, so on a box with longs bigger than 4 bytes we need
4568 * to extend a BININT's sign bit to the full width.
4569 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004570 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004571 x |= -(x & (1L << 31));
4572 }
4573
4574 return x;
4575}
4576
4577static int
4578load_binintx(UnpicklerObject *self, char *s, int size)
4579{
4580 PyObject *value;
4581 long x;
4582
4583 x = calc_binint(s, size);
4584
4585 if ((value = PyLong_FromLong(x)) == NULL)
4586 return -1;
4587
4588 PDATA_PUSH(self->stack, value, -1);
4589 return 0;
4590}
4591
4592static int
4593load_binint(UnpicklerObject *self)
4594{
4595 char *s;
4596
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004597 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004598 return -1;
4599
4600 return load_binintx(self, s, 4);
4601}
4602
4603static int
4604load_binint1(UnpicklerObject *self)
4605{
4606 char *s;
4607
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004608 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004609 return -1;
4610
4611 return load_binintx(self, s, 1);
4612}
4613
4614static int
4615load_binint2(UnpicklerObject *self)
4616{
4617 char *s;
4618
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004619 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004620 return -1;
4621
4622 return load_binintx(self, s, 2);
4623}
4624
4625static int
4626load_long(UnpicklerObject *self)
4627{
4628 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004629 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004630 Py_ssize_t len;
4631
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004632 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004633 return -1;
4634 if (len < 2)
4635 return bad_readline();
4636
Mark Dickinson8dd05142009-01-20 20:43:58 +00004637 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4638 the 'L' before calling PyLong_FromString. In order to maintain
4639 compatibility with Python 3.0.0, we don't actually *require*
4640 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004641 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004642 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004643 /* XXX: Should the base argument explicitly set to 10? */
4644 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004645 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004646 return -1;
4647
4648 PDATA_PUSH(self->stack, value, -1);
4649 return 0;
4650}
4651
4652/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4653 * data following.
4654 */
4655static int
4656load_counted_long(UnpicklerObject *self, int size)
4657{
4658 PyObject *value;
4659 char *nbytes;
4660 char *pdata;
4661
4662 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004663 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004664 return -1;
4665
4666 size = calc_binint(nbytes, size);
4667 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004668 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004669 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004670 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004671 "LONG pickle has negative byte count");
4672 return -1;
4673 }
4674
4675 if (size == 0)
4676 value = PyLong_FromLong(0L);
4677 else {
4678 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004679 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004680 return -1;
4681 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4682 1 /* little endian */ , 1 /* signed */ );
4683 }
4684 if (value == NULL)
4685 return -1;
4686 PDATA_PUSH(self->stack, value, -1);
4687 return 0;
4688}
4689
4690static int
4691load_float(UnpicklerObject *self)
4692{
4693 PyObject *value;
4694 char *endptr, *s;
4695 Py_ssize_t len;
4696 double d;
4697
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004698 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004699 return -1;
4700 if (len < 2)
4701 return bad_readline();
4702
4703 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004704 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4705 if (d == -1.0 && PyErr_Occurred())
4706 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004707 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004708 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4709 return -1;
4710 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004711 value = PyFloat_FromDouble(d);
4712 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004713 return -1;
4714
4715 PDATA_PUSH(self->stack, value, -1);
4716 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004717}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004718
4719static int
4720load_binfloat(UnpicklerObject *self)
4721{
4722 PyObject *value;
4723 double x;
4724 char *s;
4725
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004726 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004727 return -1;
4728
4729 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4730 if (x == -1.0 && PyErr_Occurred())
4731 return -1;
4732
4733 if ((value = PyFloat_FromDouble(x)) == NULL)
4734 return -1;
4735
4736 PDATA_PUSH(self->stack, value, -1);
4737 return 0;
4738}
4739
4740static int
4741load_string(UnpicklerObject *self)
4742{
4743 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004744 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004745 Py_ssize_t len;
4746 char *s, *p;
4747
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004748 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004749 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004750 /* Strip the newline */
4751 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004752 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004753 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004754 p = s + 1;
4755 len -= 2;
4756 }
4757 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004758 PickleState *st = _Pickle_GetGlobalState();
4759 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004760 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004761 return -1;
4762 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004763 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004764
4765 /* Use the PyBytes API to decode the string, since that is what is used
4766 to encode, and then coerce the result to Unicode. */
4767 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004768 if (bytes == NULL)
4769 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004770
4771 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4772 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4773 if (strcmp(self->encoding, "bytes") == 0) {
4774 obj = bytes;
4775 }
4776 else {
4777 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4778 Py_DECREF(bytes);
4779 if (obj == NULL) {
4780 return -1;
4781 }
4782 }
4783
4784 PDATA_PUSH(self->stack, obj, -1);
4785 return 0;
4786}
4787
4788static int
4789load_counted_binstring(UnpicklerObject *self, int nbytes)
4790{
4791 PyObject *obj;
4792 Py_ssize_t size;
4793 char *s;
4794
4795 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004796 return -1;
4797
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004798 size = calc_binsize(s, nbytes);
4799 if (size < 0) {
4800 PickleState *st = _Pickle_GetGlobalState();
4801 PyErr_Format(st->UnpicklingError,
4802 "BINSTRING exceeds system's maximum size of %zd bytes",
4803 PY_SSIZE_T_MAX);
4804 return -1;
4805 }
4806
4807 if (_Unpickler_Read(self, &s, size) < 0)
4808 return -1;
4809
4810 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4811 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4812 if (strcmp(self->encoding, "bytes") == 0) {
4813 obj = PyBytes_FromStringAndSize(s, size);
4814 }
4815 else {
4816 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4817 }
4818 if (obj == NULL) {
4819 return -1;
4820 }
4821
4822 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004823 return 0;
4824}
4825
4826static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004827load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004828{
4829 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004830 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004831 char *s;
4832
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004833 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004834 return -1;
4835
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004836 size = calc_binsize(s, nbytes);
4837 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004838 PyErr_Format(PyExc_OverflowError,
4839 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004840 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004841 return -1;
4842 }
4843
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004844 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004845 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004846
4847 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004848 if (bytes == NULL)
4849 return -1;
4850
4851 PDATA_PUSH(self->stack, bytes, -1);
4852 return 0;
4853}
4854
4855static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004856load_unicode(UnpicklerObject *self)
4857{
4858 PyObject *str;
4859 Py_ssize_t len;
4860 char *s;
4861
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004862 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004863 return -1;
4864 if (len < 1)
4865 return bad_readline();
4866
4867 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4868 if (str == NULL)
4869 return -1;
4870
4871 PDATA_PUSH(self->stack, str, -1);
4872 return 0;
4873}
4874
4875static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004876load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004877{
4878 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004879 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004880 char *s;
4881
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004882 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004883 return -1;
4884
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004885 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004886 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004887 PyErr_Format(PyExc_OverflowError,
4888 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004889 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004890 return -1;
4891 }
4892
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004893 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004894 return -1;
4895
Victor Stinner485fb562010-04-13 11:07:24 +00004896 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004897 if (str == NULL)
4898 return -1;
4899
4900 PDATA_PUSH(self->stack, str, -1);
4901 return 0;
4902}
4903
4904static int
4905load_tuple(UnpicklerObject *self)
4906{
4907 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004908 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004909
4910 if ((i = marker(self)) < 0)
4911 return -1;
4912
4913 tuple = Pdata_poptuple(self->stack, i);
4914 if (tuple == NULL)
4915 return -1;
4916 PDATA_PUSH(self->stack, tuple, -1);
4917 return 0;
4918}
4919
4920static int
4921load_counted_tuple(UnpicklerObject *self, int len)
4922{
4923 PyObject *tuple;
4924
4925 tuple = PyTuple_New(len);
4926 if (tuple == NULL)
4927 return -1;
4928
4929 while (--len >= 0) {
4930 PyObject *item;
4931
4932 PDATA_POP(self->stack, item);
4933 if (item == NULL)
4934 return -1;
4935 PyTuple_SET_ITEM(tuple, len, item);
4936 }
4937 PDATA_PUSH(self->stack, tuple, -1);
4938 return 0;
4939}
4940
4941static int
4942load_empty_list(UnpicklerObject *self)
4943{
4944 PyObject *list;
4945
4946 if ((list = PyList_New(0)) == NULL)
4947 return -1;
4948 PDATA_PUSH(self->stack, list, -1);
4949 return 0;
4950}
4951
4952static int
4953load_empty_dict(UnpicklerObject *self)
4954{
4955 PyObject *dict;
4956
4957 if ((dict = PyDict_New()) == NULL)
4958 return -1;
4959 PDATA_PUSH(self->stack, dict, -1);
4960 return 0;
4961}
4962
4963static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004964load_empty_set(UnpicklerObject *self)
4965{
4966 PyObject *set;
4967
4968 if ((set = PySet_New(NULL)) == NULL)
4969 return -1;
4970 PDATA_PUSH(self->stack, set, -1);
4971 return 0;
4972}
4973
4974static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004975load_list(UnpicklerObject *self)
4976{
4977 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004978 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004979
4980 if ((i = marker(self)) < 0)
4981 return -1;
4982
4983 list = Pdata_poplist(self->stack, i);
4984 if (list == NULL)
4985 return -1;
4986 PDATA_PUSH(self->stack, list, -1);
4987 return 0;
4988}
4989
4990static int
4991load_dict(UnpicklerObject *self)
4992{
4993 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004994 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004995
4996 if ((i = marker(self)) < 0)
4997 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004998 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004999
5000 if ((dict = PyDict_New()) == NULL)
5001 return -1;
5002
5003 for (k = i + 1; k < j; k += 2) {
5004 key = self->stack->data[k - 1];
5005 value = self->stack->data[k];
5006 if (PyDict_SetItem(dict, key, value) < 0) {
5007 Py_DECREF(dict);
5008 return -1;
5009 }
5010 }
5011 Pdata_clear(self->stack, i);
5012 PDATA_PUSH(self->stack, dict, -1);
5013 return 0;
5014}
5015
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005016static int
5017load_frozenset(UnpicklerObject *self)
5018{
5019 PyObject *items;
5020 PyObject *frozenset;
5021 Py_ssize_t i;
5022
5023 if ((i = marker(self)) < 0)
5024 return -1;
5025
5026 items = Pdata_poptuple(self->stack, i);
5027 if (items == NULL)
5028 return -1;
5029
5030 frozenset = PyFrozenSet_New(items);
5031 Py_DECREF(items);
5032 if (frozenset == NULL)
5033 return -1;
5034
5035 PDATA_PUSH(self->stack, frozenset, -1);
5036 return 0;
5037}
5038
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005039static PyObject *
5040instantiate(PyObject *cls, PyObject *args)
5041{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005042 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005043 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005044 /* Caller must assure args are a tuple. Normally, args come from
5045 Pdata_poptuple which packs objects from the top of the stack
5046 into a newly created tuple. */
5047 assert(PyTuple_Check(args));
5048 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005049 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005050 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005051 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005052 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005053 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005054
5055 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005056 }
5057 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005058}
5059
5060static int
5061load_obj(UnpicklerObject *self)
5062{
5063 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005064 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005065
5066 if ((i = marker(self)) < 0)
5067 return -1;
5068
5069 args = Pdata_poptuple(self->stack, i + 1);
5070 if (args == NULL)
5071 return -1;
5072
5073 PDATA_POP(self->stack, cls);
5074 if (cls) {
5075 obj = instantiate(cls, args);
5076 Py_DECREF(cls);
5077 }
5078 Py_DECREF(args);
5079 if (obj == NULL)
5080 return -1;
5081
5082 PDATA_PUSH(self->stack, obj, -1);
5083 return 0;
5084}
5085
5086static int
5087load_inst(UnpicklerObject *self)
5088{
5089 PyObject *cls = NULL;
5090 PyObject *args = NULL;
5091 PyObject *obj = NULL;
5092 PyObject *module_name;
5093 PyObject *class_name;
5094 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005095 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005096 char *s;
5097
5098 if ((i = marker(self)) < 0)
5099 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005100 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005101 return -1;
5102 if (len < 2)
5103 return bad_readline();
5104
5105 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5106 identifiers are permitted in Python 3.0, since the INST opcode is only
5107 supported by older protocols on Python 2.x. */
5108 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5109 if (module_name == NULL)
5110 return -1;
5111
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005112 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005113 if (len < 2)
5114 return bad_readline();
5115 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005116 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005117 cls = find_class(self, module_name, class_name);
5118 Py_DECREF(class_name);
5119 }
5120 }
5121 Py_DECREF(module_name);
5122
5123 if (cls == NULL)
5124 return -1;
5125
5126 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5127 obj = instantiate(cls, args);
5128 Py_DECREF(args);
5129 }
5130 Py_DECREF(cls);
5131
5132 if (obj == NULL)
5133 return -1;
5134
5135 PDATA_PUSH(self->stack, obj, -1);
5136 return 0;
5137}
5138
5139static int
5140load_newobj(UnpicklerObject *self)
5141{
5142 PyObject *args = NULL;
5143 PyObject *clsraw = NULL;
5144 PyTypeObject *cls; /* clsraw cast to its true type */
5145 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005146 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005147
5148 /* Stack is ... cls argtuple, and we want to call
5149 * cls.__new__(cls, *argtuple).
5150 */
5151 PDATA_POP(self->stack, args);
5152 if (args == NULL)
5153 goto error;
5154 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005155 PyErr_SetString(st->UnpicklingError,
5156 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005157 goto error;
5158 }
5159
5160 PDATA_POP(self->stack, clsraw);
5161 cls = (PyTypeObject *)clsraw;
5162 if (cls == NULL)
5163 goto error;
5164 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005165 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005166 "isn't a type object");
5167 goto error;
5168 }
5169 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005170 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005171 "has NULL tp_new");
5172 goto error;
5173 }
5174
5175 /* Call __new__. */
5176 obj = cls->tp_new(cls, args, NULL);
5177 if (obj == NULL)
5178 goto error;
5179
5180 Py_DECREF(args);
5181 Py_DECREF(clsraw);
5182 PDATA_PUSH(self->stack, obj, -1);
5183 return 0;
5184
5185 error:
5186 Py_XDECREF(args);
5187 Py_XDECREF(clsraw);
5188 return -1;
5189}
5190
5191static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005192load_newobj_ex(UnpicklerObject *self)
5193{
5194 PyObject *cls, *args, *kwargs;
5195 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005196 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005197
5198 PDATA_POP(self->stack, kwargs);
5199 if (kwargs == NULL) {
5200 return -1;
5201 }
5202 PDATA_POP(self->stack, args);
5203 if (args == NULL) {
5204 Py_DECREF(kwargs);
5205 return -1;
5206 }
5207 PDATA_POP(self->stack, cls);
5208 if (cls == NULL) {
5209 Py_DECREF(kwargs);
5210 Py_DECREF(args);
5211 return -1;
5212 }
Larry Hastings61272b72014-01-07 12:41:53 -08005213
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005214 if (!PyType_Check(cls)) {
5215 Py_DECREF(kwargs);
5216 Py_DECREF(args);
5217 Py_DECREF(cls);
Larry Hastings61272b72014-01-07 12:41:53 -08005218 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005219 "NEWOBJ_EX class argument must be a type, not %.200s",
5220 Py_TYPE(cls)->tp_name);
5221 return -1;
5222 }
5223
5224 if (((PyTypeObject *)cls)->tp_new == NULL) {
5225 Py_DECREF(kwargs);
5226 Py_DECREF(args);
5227 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005228 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005229 "NEWOBJ_EX class argument doesn't have __new__");
5230 return -1;
5231 }
5232 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5233 Py_DECREF(kwargs);
5234 Py_DECREF(args);
5235 Py_DECREF(cls);
5236 if (obj == NULL) {
5237 return -1;
5238 }
5239 PDATA_PUSH(self->stack, obj, -1);
5240 return 0;
5241}
5242
5243static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005244load_global(UnpicklerObject *self)
5245{
5246 PyObject *global = NULL;
5247 PyObject *module_name;
5248 PyObject *global_name;
5249 Py_ssize_t len;
5250 char *s;
5251
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005252 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005253 return -1;
5254 if (len < 2)
5255 return bad_readline();
5256 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5257 if (!module_name)
5258 return -1;
5259
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005260 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005261 if (len < 2) {
5262 Py_DECREF(module_name);
5263 return bad_readline();
5264 }
5265 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5266 if (global_name) {
5267 global = find_class(self, module_name, global_name);
5268 Py_DECREF(global_name);
5269 }
5270 }
5271 Py_DECREF(module_name);
5272
5273 if (global == NULL)
5274 return -1;
5275 PDATA_PUSH(self->stack, global, -1);
5276 return 0;
5277}
5278
5279static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005280load_stack_global(UnpicklerObject *self)
5281{
5282 PyObject *global;
5283 PyObject *module_name;
5284 PyObject *global_name;
5285
5286 PDATA_POP(self->stack, global_name);
5287 PDATA_POP(self->stack, module_name);
5288 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5289 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005290 PickleState *st = _Pickle_GetGlobalState();
5291 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005292 Py_XDECREF(global_name);
5293 Py_XDECREF(module_name);
5294 return -1;
5295 }
5296 global = find_class(self, module_name, global_name);
5297 Py_DECREF(global_name);
5298 Py_DECREF(module_name);
5299 if (global == NULL)
5300 return -1;
5301 PDATA_PUSH(self->stack, global, -1);
5302 return 0;
5303}
5304
5305static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005306load_persid(UnpicklerObject *self)
5307{
5308 PyObject *pid;
5309 Py_ssize_t len;
5310 char *s;
5311
5312 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005313 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005314 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005315 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005316 return bad_readline();
5317
5318 pid = PyBytes_FromStringAndSize(s, len - 1);
5319 if (pid == NULL)
5320 return -1;
5321
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005322 /* This does not leak since _Pickle_FastCall() steals the reference
5323 to pid first. */
5324 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005325 if (pid == NULL)
5326 return -1;
5327
5328 PDATA_PUSH(self->stack, pid, -1);
5329 return 0;
5330 }
5331 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005332 PickleState *st = _Pickle_GetGlobalState();
5333 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005334 "A load persistent id instruction was encountered,\n"
5335 "but no persistent_load function was specified.");
5336 return -1;
5337 }
5338}
5339
5340static int
5341load_binpersid(UnpicklerObject *self)
5342{
5343 PyObject *pid;
5344
5345 if (self->pers_func) {
5346 PDATA_POP(self->stack, pid);
5347 if (pid == NULL)
5348 return -1;
5349
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005350 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005351 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005352 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005353 if (pid == NULL)
5354 return -1;
5355
5356 PDATA_PUSH(self->stack, pid, -1);
5357 return 0;
5358 }
5359 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005360 PickleState *st = _Pickle_GetGlobalState();
5361 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005362 "A load persistent id instruction was encountered,\n"
5363 "but no persistent_load function was specified.");
5364 return -1;
5365 }
5366}
5367
5368static int
5369load_pop(UnpicklerObject *self)
5370{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005371 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005372
5373 /* Note that we split the (pickle.py) stack into two stacks,
5374 * an object stack and a mark stack. We have to be clever and
5375 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005376 * mark stack first, and only signalling a stack underflow if
5377 * the object stack is empty and the mark stack doesn't match
5378 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005379 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005380 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005381 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005382 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005383 len--;
5384 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005385 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005386 } else {
5387 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005388 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005389 return 0;
5390}
5391
5392static int
5393load_pop_mark(UnpicklerObject *self)
5394{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005395 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005396
5397 if ((i = marker(self)) < 0)
5398 return -1;
5399
5400 Pdata_clear(self->stack, i);
5401
5402 return 0;
5403}
5404
5405static int
5406load_dup(UnpicklerObject *self)
5407{
5408 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005409 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005410
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005411 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005412 return stack_underflow();
5413 last = self->stack->data[len - 1];
5414 PDATA_APPEND(self->stack, last, -1);
5415 return 0;
5416}
5417
5418static int
5419load_get(UnpicklerObject *self)
5420{
5421 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005422 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005423 Py_ssize_t len;
5424 char *s;
5425
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005426 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005427 return -1;
5428 if (len < 2)
5429 return bad_readline();
5430
5431 key = PyLong_FromString(s, NULL, 10);
5432 if (key == NULL)
5433 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005434 idx = PyLong_AsSsize_t(key);
5435 if (idx == -1 && PyErr_Occurred()) {
5436 Py_DECREF(key);
5437 return -1;
5438 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005439
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005440 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005441 if (value == NULL) {
5442 if (!PyErr_Occurred())
5443 PyErr_SetObject(PyExc_KeyError, key);
5444 Py_DECREF(key);
5445 return -1;
5446 }
5447 Py_DECREF(key);
5448
5449 PDATA_APPEND(self->stack, value, -1);
5450 return 0;
5451}
5452
5453static int
5454load_binget(UnpicklerObject *self)
5455{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005456 PyObject *value;
5457 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005458 char *s;
5459
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005460 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005461 return -1;
5462
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005463 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005464
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005465 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005466 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005467 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005468 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005469 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005470 Py_DECREF(key);
5471 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005472 return -1;
5473 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005474
5475 PDATA_APPEND(self->stack, value, -1);
5476 return 0;
5477}
5478
5479static int
5480load_long_binget(UnpicklerObject *self)
5481{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005482 PyObject *value;
5483 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005484 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005485
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005486 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005487 return -1;
5488
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005489 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005490
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005491 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005492 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005493 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005494 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005495 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005496 Py_DECREF(key);
5497 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005498 return -1;
5499 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005500
5501 PDATA_APPEND(self->stack, value, -1);
5502 return 0;
5503}
5504
5505/* Push an object from the extension registry (EXT[124]). nbytes is
5506 * the number of bytes following the opcode, holding the index (code) value.
5507 */
5508static int
5509load_extension(UnpicklerObject *self, int nbytes)
5510{
5511 char *codebytes; /* the nbytes bytes after the opcode */
5512 long code; /* calc_binint returns long */
5513 PyObject *py_code; /* code as a Python int */
5514 PyObject *obj; /* the object to push */
5515 PyObject *pair; /* (module_name, class_name) */
5516 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005517 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005518
5519 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005520 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005521 return -1;
5522 code = calc_binint(codebytes, nbytes);
5523 if (code <= 0) { /* note that 0 is forbidden */
5524 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005525 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005526 return -1;
5527 }
5528
5529 /* Look for the code in the cache. */
5530 py_code = PyLong_FromLong(code);
5531 if (py_code == NULL)
5532 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005533 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005534 if (obj != NULL) {
5535 /* Bingo. */
5536 Py_DECREF(py_code);
5537 PDATA_APPEND(self->stack, obj, -1);
5538 return 0;
5539 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005540 if (PyErr_Occurred()) {
5541 Py_DECREF(py_code);
5542 return -1;
5543 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005544
5545 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005546 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005547 if (pair == NULL) {
5548 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005549 if (!PyErr_Occurred()) {
5550 PyErr_Format(PyExc_ValueError, "unregistered extension "
5551 "code %ld", code);
5552 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005553 return -1;
5554 }
5555 /* Since the extension registry is manipulable via Python code,
5556 * confirm that pair is really a 2-tuple of strings.
5557 */
5558 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5559 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5560 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5561 Py_DECREF(py_code);
5562 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5563 "isn't a 2-tuple of strings", code);
5564 return -1;
5565 }
5566 /* Load the object. */
5567 obj = find_class(self, module_name, class_name);
5568 if (obj == NULL) {
5569 Py_DECREF(py_code);
5570 return -1;
5571 }
5572 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005573 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005574 Py_DECREF(py_code);
5575 if (code < 0) {
5576 Py_DECREF(obj);
5577 return -1;
5578 }
5579 PDATA_PUSH(self->stack, obj, -1);
5580 return 0;
5581}
5582
5583static int
5584load_put(UnpicklerObject *self)
5585{
5586 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005587 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005588 Py_ssize_t len;
5589 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005590
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005591 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005592 return -1;
5593 if (len < 2)
5594 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005595 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
5599 key = PyLong_FromString(s, NULL, 10);
5600 if (key == NULL)
5601 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005602 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005603 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005604 if (idx < 0) {
5605 if (!PyErr_Occurred())
5606 PyErr_SetString(PyExc_ValueError,
5607 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005608 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005609 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005610
5611 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005612}
5613
5614static int
5615load_binput(UnpicklerObject *self)
5616{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005617 PyObject *value;
5618 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005619 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005620
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005621 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005622 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005623
5624 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005625 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005626 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005627
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005628 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005629
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005630 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005631}
5632
5633static int
5634load_long_binput(UnpicklerObject *self)
5635{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005636 PyObject *value;
5637 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005638 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005639
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005640 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005641 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005642
5643 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005644 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005645 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005646
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005647 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005648 if (idx < 0) {
5649 PyErr_SetString(PyExc_ValueError,
5650 "negative LONG_BINPUT argument");
5651 return -1;
5652 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005653
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005654 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005655}
5656
5657static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005658load_memoize(UnpicklerObject *self)
5659{
5660 PyObject *value;
5661
5662 if (Py_SIZE(self->stack) <= 0)
5663 return stack_underflow();
5664 value = self->stack->data[Py_SIZE(self->stack) - 1];
5665
5666 return _Unpickler_MemoPut(self, self->memo_len, value);
5667}
5668
5669static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005670do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005671{
5672 PyObject *value;
5673 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005674 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005675
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005676 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005677 if (x > len || x <= 0)
5678 return stack_underflow();
5679 if (len == x) /* nothing to do */
5680 return 0;
5681
5682 list = self->stack->data[x - 1];
5683
5684 if (PyList_Check(list)) {
5685 PyObject *slice;
5686 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005687 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005688
5689 slice = Pdata_poplist(self->stack, x);
5690 if (!slice)
5691 return -1;
5692 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005693 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005694 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005695 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005696 }
5697 else {
5698 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005699 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005700
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005701 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005702 if (append_func == NULL)
5703 return -1;
5704 for (i = x; i < len; i++) {
5705 PyObject *result;
5706
5707 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005708 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005709 if (result == NULL) {
5710 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005711 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005712 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005713 return -1;
5714 }
5715 Py_DECREF(result);
5716 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005717 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005718 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005719 }
5720
5721 return 0;
5722}
5723
5724static int
5725load_append(UnpicklerObject *self)
5726{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005727 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005728}
5729
5730static int
5731load_appends(UnpicklerObject *self)
5732{
5733 return do_append(self, marker(self));
5734}
5735
5736static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005737do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005738{
5739 PyObject *value, *key;
5740 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005741 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005742 int status = 0;
5743
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005744 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005745 if (x > len || x <= 0)
5746 return stack_underflow();
5747 if (len == x) /* nothing to do */
5748 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005749 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005750 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005751 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005752 PyErr_SetString(st->UnpicklingError,
5753 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005754 return -1;
5755 }
5756
5757 /* Here, dict does not actually need to be a PyDict; it could be anything
5758 that supports the __setitem__ attribute. */
5759 dict = self->stack->data[x - 1];
5760
5761 for (i = x + 1; i < len; i += 2) {
5762 key = self->stack->data[i - 1];
5763 value = self->stack->data[i];
5764 if (PyObject_SetItem(dict, key, value) < 0) {
5765 status = -1;
5766 break;
5767 }
5768 }
5769
5770 Pdata_clear(self->stack, x);
5771 return status;
5772}
5773
5774static int
5775load_setitem(UnpicklerObject *self)
5776{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005777 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005778}
5779
5780static int
5781load_setitems(UnpicklerObject *self)
5782{
5783 return do_setitems(self, marker(self));
5784}
5785
5786static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005787load_additems(UnpicklerObject *self)
5788{
5789 PyObject *set;
5790 Py_ssize_t mark, len, i;
5791
5792 mark = marker(self);
5793 len = Py_SIZE(self->stack);
5794 if (mark > len || mark <= 0)
5795 return stack_underflow();
5796 if (len == mark) /* nothing to do */
5797 return 0;
5798
5799 set = self->stack->data[mark - 1];
5800
5801 if (PySet_Check(set)) {
5802 PyObject *items;
5803 int status;
5804
5805 items = Pdata_poptuple(self->stack, mark);
5806 if (items == NULL)
5807 return -1;
5808
5809 status = _PySet_Update(set, items);
5810 Py_DECREF(items);
5811 return status;
5812 }
5813 else {
5814 PyObject *add_func;
5815 _Py_IDENTIFIER(add);
5816
5817 add_func = _PyObject_GetAttrId(set, &PyId_add);
5818 if (add_func == NULL)
5819 return -1;
5820 for (i = mark; i < len; i++) {
5821 PyObject *result;
5822 PyObject *item;
5823
5824 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005825 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005826 if (result == NULL) {
5827 Pdata_clear(self->stack, i + 1);
5828 Py_SIZE(self->stack) = mark;
5829 return -1;
5830 }
5831 Py_DECREF(result);
5832 }
5833 Py_SIZE(self->stack) = mark;
5834 }
5835
5836 return 0;
5837}
5838
5839static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005840load_build(UnpicklerObject *self)
5841{
5842 PyObject *state, *inst, *slotstate;
5843 PyObject *setstate;
5844 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005845 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005846
5847 /* Stack is ... instance, state. We want to leave instance at
5848 * the stack top, possibly mutated via instance.__setstate__(state).
5849 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005850 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005851 return stack_underflow();
5852
5853 PDATA_POP(self->stack, state);
5854 if (state == NULL)
5855 return -1;
5856
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005857 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005858
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005859 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005860 if (setstate == NULL) {
5861 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5862 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005863 else {
5864 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005865 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005866 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005867 }
5868 else {
5869 PyObject *result;
5870
5871 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005872 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005873 Py_DECREF(setstate);
5874 if (result == NULL)
5875 return -1;
5876 Py_DECREF(result);
5877 return 0;
5878 }
5879
5880 /* A default __setstate__. First see whether state embeds a
5881 * slot state dict too (a proto 2 addition).
5882 */
5883 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5884 PyObject *tmp = state;
5885
5886 state = PyTuple_GET_ITEM(tmp, 0);
5887 slotstate = PyTuple_GET_ITEM(tmp, 1);
5888 Py_INCREF(state);
5889 Py_INCREF(slotstate);
5890 Py_DECREF(tmp);
5891 }
5892 else
5893 slotstate = NULL;
5894
5895 /* Set inst.__dict__ from the state dict (if any). */
5896 if (state != Py_None) {
5897 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005898 PyObject *d_key, *d_value;
5899 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005900 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005901
5902 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005903 PickleState *st = _Pickle_GetGlobalState();
5904 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005905 goto error;
5906 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005907 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005908 if (dict == NULL)
5909 goto error;
5910
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005911 i = 0;
5912 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5913 /* normally the keys for instance attributes are
5914 interned. we should try to do that here. */
5915 Py_INCREF(d_key);
5916 if (PyUnicode_CheckExact(d_key))
5917 PyUnicode_InternInPlace(&d_key);
5918 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5919 Py_DECREF(d_key);
5920 goto error;
5921 }
5922 Py_DECREF(d_key);
5923 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005924 Py_DECREF(dict);
5925 }
5926
5927 /* Also set instance attributes from the slotstate dict (if any). */
5928 if (slotstate != NULL) {
5929 PyObject *d_key, *d_value;
5930 Py_ssize_t i;
5931
5932 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005933 PickleState *st = _Pickle_GetGlobalState();
5934 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005935 "slot state is not a dictionary");
5936 goto error;
5937 }
5938 i = 0;
5939 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
5940 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
5941 goto error;
5942 }
5943 }
5944
5945 if (0) {
5946 error:
5947 status = -1;
5948 }
5949
5950 Py_DECREF(state);
5951 Py_XDECREF(slotstate);
5952 return status;
5953}
5954
5955static int
5956load_mark(UnpicklerObject *self)
5957{
5958
5959 /* Note that we split the (pickle.py) stack into two stacks, an
5960 * object stack and a mark stack. Here we push a mark onto the
5961 * mark stack.
5962 */
5963
5964 if ((self->num_marks + 1) >= self->marks_size) {
5965 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005966 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005967
5968 /* Use the size_t type to check for overflow. */
5969 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005970 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00005971 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005972 PyErr_NoMemory();
5973 return -1;
5974 }
5975
5976 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005977 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005978 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005979 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
5980 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005981 if (marks == NULL) {
5982 PyErr_NoMemory();
5983 return -1;
5984 }
5985 self->marks = marks;
5986 self->marks_size = (Py_ssize_t)alloc;
5987 }
5988
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005989 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005990
5991 return 0;
5992}
5993
5994static int
5995load_reduce(UnpicklerObject *self)
5996{
5997 PyObject *callable = NULL;
5998 PyObject *argtup = NULL;
5999 PyObject *obj = NULL;
6000
6001 PDATA_POP(self->stack, argtup);
6002 if (argtup == NULL)
6003 return -1;
6004 PDATA_POP(self->stack, callable);
6005 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006006 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006007 Py_DECREF(callable);
6008 }
6009 Py_DECREF(argtup);
6010
6011 if (obj == NULL)
6012 return -1;
6013
6014 PDATA_PUSH(self->stack, obj, -1);
6015 return 0;
6016}
6017
6018/* Just raises an error if we don't know the protocol specified. PROTO
6019 * is the first opcode for protocols >= 2.
6020 */
6021static int
6022load_proto(UnpicklerObject *self)
6023{
6024 char *s;
6025 int i;
6026
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006027 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006028 return -1;
6029
6030 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006031 if (i <= HIGHEST_PROTOCOL) {
6032 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006033 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006034 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006035
6036 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6037 return -1;
6038}
6039
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006040static int
6041load_frame(UnpicklerObject *self)
6042{
6043 char *s;
6044 Py_ssize_t frame_len;
6045
6046 if (_Unpickler_Read(self, &s, 8) < 0)
6047 return -1;
6048
6049 frame_len = calc_binsize(s, 8);
6050 if (frame_len < 0) {
6051 PyErr_Format(PyExc_OverflowError,
6052 "FRAME length exceeds system's maximum of %zd bytes",
6053 PY_SSIZE_T_MAX);
6054 return -1;
6055 }
6056
6057 if (_Unpickler_Read(self, &s, frame_len) < 0)
6058 return -1;
6059
6060 /* Rewind to start of frame */
6061 self->next_read_idx -= frame_len;
6062 return 0;
6063}
6064
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006065static PyObject *
6066load(UnpicklerObject *self)
6067{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006068 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006069 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006070
6071 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006072 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006073 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006074 Pdata_clear(self->stack, 0);
6075
6076 /* Convenient macros for the dispatch while-switch loop just below. */
6077#define OP(opcode, load_func) \
6078 case opcode: if (load_func(self) < 0) break; continue;
6079
6080#define OP_ARG(opcode, load_func, arg) \
6081 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6082
6083 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006084 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006085 break;
6086
6087 switch ((enum opcode)s[0]) {
6088 OP(NONE, load_none)
6089 OP(BININT, load_binint)
6090 OP(BININT1, load_binint1)
6091 OP(BININT2, load_binint2)
6092 OP(INT, load_int)
6093 OP(LONG, load_long)
6094 OP_ARG(LONG1, load_counted_long, 1)
6095 OP_ARG(LONG4, load_counted_long, 4)
6096 OP(FLOAT, load_float)
6097 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006098 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6099 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6100 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6101 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6102 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006103 OP(STRING, load_string)
6104 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006105 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6106 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6107 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006108 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6109 OP_ARG(TUPLE1, load_counted_tuple, 1)
6110 OP_ARG(TUPLE2, load_counted_tuple, 2)
6111 OP_ARG(TUPLE3, load_counted_tuple, 3)
6112 OP(TUPLE, load_tuple)
6113 OP(EMPTY_LIST, load_empty_list)
6114 OP(LIST, load_list)
6115 OP(EMPTY_DICT, load_empty_dict)
6116 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006117 OP(EMPTY_SET, load_empty_set)
6118 OP(ADDITEMS, load_additems)
6119 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006120 OP(OBJ, load_obj)
6121 OP(INST, load_inst)
6122 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006123 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006124 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006125 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006126 OP(APPEND, load_append)
6127 OP(APPENDS, load_appends)
6128 OP(BUILD, load_build)
6129 OP(DUP, load_dup)
6130 OP(BINGET, load_binget)
6131 OP(LONG_BINGET, load_long_binget)
6132 OP(GET, load_get)
6133 OP(MARK, load_mark)
6134 OP(BINPUT, load_binput)
6135 OP(LONG_BINPUT, load_long_binput)
6136 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006137 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006138 OP(POP, load_pop)
6139 OP(POP_MARK, load_pop_mark)
6140 OP(SETITEM, load_setitem)
6141 OP(SETITEMS, load_setitems)
6142 OP(PERSID, load_persid)
6143 OP(BINPERSID, load_binpersid)
6144 OP(REDUCE, load_reduce)
6145 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006146 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006147 OP_ARG(EXT1, load_extension, 1)
6148 OP_ARG(EXT2, load_extension, 2)
6149 OP_ARG(EXT4, load_extension, 4)
6150 OP_ARG(NEWTRUE, load_bool, Py_True)
6151 OP_ARG(NEWFALSE, load_bool, Py_False)
6152
6153 case STOP:
6154 break;
6155
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006156 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006157 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006158 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006159 }
6160 else {
6161 PickleState *st = _Pickle_GetGlobalState();
6162 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006163 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006164 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006165 return NULL;
6166 }
6167
6168 break; /* and we are done! */
6169 }
6170
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006171 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006172 return NULL;
6173 }
6174
Victor Stinner2ae57e32013-10-31 13:39:23 +01006175 if (_Unpickler_SkipConsumed(self) < 0)
6176 return NULL;
6177
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006178 PDATA_POP(self->stack, value);
6179 return value;
6180}
6181
Larry Hastings61272b72014-01-07 12:41:53 -08006182/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006183
6184_pickle.Unpickler.load
6185
6186Load a pickle.
6187
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006188Read a pickled object representation from the open file object given
6189in the constructor, and return the reconstituted object hierarchy
6190specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006191[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006192
Larry Hastings3cceb382014-01-04 11:09:09 -08006193static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006194_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006195/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006196{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006197 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006198
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006199 /* Check whether the Unpickler was initialized correctly. This prevents
6200 segfaulting if a subclass overridden __init__ with a function that does
6201 not call Unpickler.__init__(). Here, we simply ensure that self->read
6202 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006203 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006204 PickleState *st = _Pickle_GetGlobalState();
6205 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006206 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006207 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006208 return NULL;
6209 }
6210
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006211 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006212}
6213
6214/* The name of find_class() is misleading. In newer pickle protocols, this
6215 function is used for loading any global (i.e., functions), not just
6216 classes. The name is kept only for backward compatibility. */
6217
Larry Hastings61272b72014-01-07 12:41:53 -08006218/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006219
6220_pickle.Unpickler.find_class
6221
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006222 module_name: object
6223 global_name: object
6224 /
6225
6226Return an object from a specified module.
6227
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006228If necessary, the module will be imported. Subclasses may override
6229this method (e.g. to restrict unpickling of arbitrary classes and
6230functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006231
6232This method is called whenever a class or a function object is
6233needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006234[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006235
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006236static PyObject *
6237_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
Larry Hastings581ee362014-01-28 05:00:08 -08006238/*[clinic end generated code: output=64c77437e088e188 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006239{
6240 PyObject *global;
6241 PyObject *modules_dict;
6242 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006243 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006244
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006245 /* Try to map the old names used in Python 2.x to the new ones used in
6246 Python 3.x. We do this only with old pickle protocols and when the
6247 user has not disabled the feature. */
6248 if (self->proto < 3 && self->fix_imports) {
6249 PyObject *key;
6250 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006251 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006252
6253 /* Check if the global (i.e., a function or a class) was renamed
6254 or moved to another module. */
6255 key = PyTuple_Pack(2, module_name, global_name);
6256 if (key == NULL)
6257 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006258 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006259 Py_DECREF(key);
6260 if (item) {
6261 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6262 PyErr_Format(PyExc_RuntimeError,
6263 "_compat_pickle.NAME_MAPPING values should be "
6264 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6265 return NULL;
6266 }
6267 module_name = PyTuple_GET_ITEM(item, 0);
6268 global_name = PyTuple_GET_ITEM(item, 1);
6269 if (!PyUnicode_Check(module_name) ||
6270 !PyUnicode_Check(global_name)) {
6271 PyErr_Format(PyExc_RuntimeError,
6272 "_compat_pickle.NAME_MAPPING values should be "
6273 "pairs of str, not (%.200s, %.200s)",
6274 Py_TYPE(module_name)->tp_name,
6275 Py_TYPE(global_name)->tp_name);
6276 return NULL;
6277 }
6278 }
6279 else if (PyErr_Occurred()) {
6280 return NULL;
6281 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03006282 else {
6283 /* Check if the module was renamed. */
6284 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
6285 if (item) {
6286 if (!PyUnicode_Check(item)) {
6287 PyErr_Format(PyExc_RuntimeError,
6288 "_compat_pickle.IMPORT_MAPPING values should be "
6289 "strings, not %.200s", Py_TYPE(item)->tp_name);
6290 return NULL;
6291 }
6292 module_name = item;
6293 }
6294 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006295 return NULL;
6296 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006297 }
6298 }
6299
Victor Stinnerbb520202013-11-06 22:40:41 +01006300 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006301 if (modules_dict == NULL) {
6302 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006303 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006304 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006306 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006307 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006308 if (PyErr_Occurred())
6309 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006310 module = PyImport_Import(module_name);
6311 if (module == NULL)
6312 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006313 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006314 Py_DECREF(module);
6315 }
Victor Stinner121aab42011-09-29 23:40:53 +02006316 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006317 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006318 }
6319 return global;
6320}
6321
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006322/*[clinic input]
6323
6324_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6325
6326Returns size in memory, in bytes.
6327[clinic start generated code]*/
6328
6329static Py_ssize_t
6330_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6331/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6332{
6333 Py_ssize_t res;
6334
6335 res = sizeof(UnpicklerObject);
6336 if (self->memo != NULL)
6337 res += self->memo_size * sizeof(PyObject *);
6338 if (self->marks != NULL)
6339 res += self->marks_size * sizeof(Py_ssize_t);
6340 if (self->input_line != NULL)
6341 res += strlen(self->input_line) + 1;
6342 if (self->encoding != NULL)
6343 res += strlen(self->encoding) + 1;
6344 if (self->errors != NULL)
6345 res += strlen(self->errors) + 1;
6346 return res;
6347}
6348
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006349static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006350 _PICKLE_UNPICKLER_LOAD_METHODDEF
6351 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006352 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006353 {NULL, NULL} /* sentinel */
6354};
6355
6356static void
6357Unpickler_dealloc(UnpicklerObject *self)
6358{
6359 PyObject_GC_UnTrack((PyObject *)self);
6360 Py_XDECREF(self->readline);
6361 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006362 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006363 Py_XDECREF(self->stack);
6364 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006365 if (self->buffer.buf != NULL) {
6366 PyBuffer_Release(&self->buffer);
6367 self->buffer.buf = NULL;
6368 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006369
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006370 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006371 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006372 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006373 PyMem_Free(self->encoding);
6374 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006375
6376 Py_TYPE(self)->tp_free((PyObject *)self);
6377}
6378
6379static int
6380Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6381{
6382 Py_VISIT(self->readline);
6383 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006384 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006385 Py_VISIT(self->stack);
6386 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006387 return 0;
6388}
6389
6390static int
6391Unpickler_clear(UnpicklerObject *self)
6392{
6393 Py_CLEAR(self->readline);
6394 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006395 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006396 Py_CLEAR(self->stack);
6397 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006398 if (self->buffer.buf != NULL) {
6399 PyBuffer_Release(&self->buffer);
6400 self->buffer.buf = NULL;
6401 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006402
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006403 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006404 PyMem_Free(self->marks);
6405 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006406 PyMem_Free(self->input_line);
6407 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006408 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006409 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006410 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006411 self->errors = NULL;
6412
6413 return 0;
6414}
6415
Larry Hastings61272b72014-01-07 12:41:53 -08006416/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006417
6418_pickle.Unpickler.__init__
6419
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006420 file: object
6421 *
6422 fix_imports: bool = True
6423 encoding: str = 'ASCII'
6424 errors: str = 'strict'
6425
6426This takes a binary file for reading a pickle data stream.
6427
6428The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006429protocol argument is needed. Bytes past the pickled object's
6430representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006431
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006432The argument *file* must have two methods, a read() method that takes
6433an integer argument, and a readline() method that requires no
6434arguments. Both methods should return bytes. Thus *file* can be a
6435binary file object opened for reading, a io.BytesIO object, or any
6436other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006437
6438Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6439which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006440generated by Python 2. If *fix_imports* is True, pickle will try to
6441map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006442*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006443instances pickled by Python 2; these default to 'ASCII' and 'strict',
6444respectively. The *encoding* can be 'bytes' to read these 8-bit
6445string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006446[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006447
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006448static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006449_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006450/*[clinic end generated code: output=b9ed1d84d315f3b5 input=30b4dc9e976b890c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006451{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006452 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006453
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006454 /* In case of multiple __init__() calls, clear previous content. */
6455 if (self->read != NULL)
6456 (void)Unpickler_clear(self);
6457
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006458 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006459 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006460
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006461 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006462 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006463
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006464 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006465 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006466 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006467
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006468 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006469 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6470 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006471 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006472 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006473 }
6474 else {
6475 self->pers_func = NULL;
6476 }
6477
6478 self->stack = (Pdata *)Pdata_New();
6479 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006480 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006481
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006482 self->memo_size = 32;
6483 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006484 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006485 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006486
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006487 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006488
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006489 return 0;
6490}
6491
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006492
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006493/* Define a proxy object for the Unpickler's internal memo object. This is to
6494 * avoid breaking code like:
6495 * unpickler.memo.clear()
6496 * and
6497 * unpickler.memo = saved_memo
6498 * Is this a good idea? Not really, but we don't want to break code that uses
6499 * it. Note that we don't implement the entire mapping API here. This is
6500 * intentional, as these should be treated as black-box implementation details.
6501 *
6502 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006503 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006504 */
6505
Larry Hastings61272b72014-01-07 12:41:53 -08006506/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006507_pickle.UnpicklerMemoProxy.clear
6508
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006509Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006510[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006511
Larry Hastings3cceb382014-01-04 11:09:09 -08006512static PyObject *
6513_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006514/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006515{
6516 _Unpickler_MemoCleanup(self->unpickler);
6517 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6518 if (self->unpickler->memo == NULL)
6519 return NULL;
6520 Py_RETURN_NONE;
6521}
6522
Larry Hastings61272b72014-01-07 12:41:53 -08006523/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006524_pickle.UnpicklerMemoProxy.copy
6525
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006526Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006527[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006528
Larry Hastings3cceb382014-01-04 11:09:09 -08006529static PyObject *
6530_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006531/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006532{
6533 Py_ssize_t i;
6534 PyObject *new_memo = PyDict_New();
6535 if (new_memo == NULL)
6536 return NULL;
6537
6538 for (i = 0; i < self->unpickler->memo_size; i++) {
6539 int status;
6540 PyObject *key, *value;
6541
6542 value = self->unpickler->memo[i];
6543 if (value == NULL)
6544 continue;
6545
6546 key = PyLong_FromSsize_t(i);
6547 if (key == NULL)
6548 goto error;
6549 status = PyDict_SetItem(new_memo, key, value);
6550 Py_DECREF(key);
6551 if (status < 0)
6552 goto error;
6553 }
6554 return new_memo;
6555
6556error:
6557 Py_DECREF(new_memo);
6558 return NULL;
6559}
6560
Larry Hastings61272b72014-01-07 12:41:53 -08006561/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006562_pickle.UnpicklerMemoProxy.__reduce__
6563
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006564Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006565[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006566
Larry Hastings3cceb382014-01-04 11:09:09 -08006567static PyObject *
6568_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006569/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006570{
6571 PyObject *reduce_value;
6572 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006573 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006574 if (contents == NULL)
6575 return NULL;
6576
6577 reduce_value = PyTuple_New(2);
6578 if (reduce_value == NULL) {
6579 Py_DECREF(contents);
6580 return NULL;
6581 }
6582 constructor_args = PyTuple_New(1);
6583 if (constructor_args == NULL) {
6584 Py_DECREF(contents);
6585 Py_DECREF(reduce_value);
6586 return NULL;
6587 }
6588 PyTuple_SET_ITEM(constructor_args, 0, contents);
6589 Py_INCREF((PyObject *)&PyDict_Type);
6590 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6591 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6592 return reduce_value;
6593}
6594
6595static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006596 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6597 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6598 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006599 {NULL, NULL} /* sentinel */
6600};
6601
6602static void
6603UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6604{
6605 PyObject_GC_UnTrack(self);
6606 Py_XDECREF(self->unpickler);
6607 PyObject_GC_Del((PyObject *)self);
6608}
6609
6610static int
6611UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6612 visitproc visit, void *arg)
6613{
6614 Py_VISIT(self->unpickler);
6615 return 0;
6616}
6617
6618static int
6619UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6620{
6621 Py_CLEAR(self->unpickler);
6622 return 0;
6623}
6624
6625static PyTypeObject UnpicklerMemoProxyType = {
6626 PyVarObject_HEAD_INIT(NULL, 0)
6627 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6628 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6629 0,
6630 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6631 0, /* tp_print */
6632 0, /* tp_getattr */
6633 0, /* tp_setattr */
6634 0, /* tp_compare */
6635 0, /* tp_repr */
6636 0, /* tp_as_number */
6637 0, /* tp_as_sequence */
6638 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006639 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006640 0, /* tp_call */
6641 0, /* tp_str */
6642 PyObject_GenericGetAttr, /* tp_getattro */
6643 PyObject_GenericSetAttr, /* tp_setattro */
6644 0, /* tp_as_buffer */
6645 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6646 0, /* tp_doc */
6647 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6648 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6649 0, /* tp_richcompare */
6650 0, /* tp_weaklistoffset */
6651 0, /* tp_iter */
6652 0, /* tp_iternext */
6653 unpicklerproxy_methods, /* tp_methods */
6654};
6655
6656static PyObject *
6657UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6658{
6659 UnpicklerMemoProxyObject *self;
6660
6661 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6662 &UnpicklerMemoProxyType);
6663 if (self == NULL)
6664 return NULL;
6665 Py_INCREF(unpickler);
6666 self->unpickler = unpickler;
6667 PyObject_GC_Track(self);
6668 return (PyObject *)self;
6669}
6670
6671/*****************************************************************************/
6672
6673
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006674static PyObject *
6675Unpickler_get_memo(UnpicklerObject *self)
6676{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006677 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006678}
6679
6680static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006681Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006682{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006683 PyObject **new_memo;
6684 Py_ssize_t new_memo_size = 0;
6685 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006686
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006687 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006688 PyErr_SetString(PyExc_TypeError,
6689 "attribute deletion is not supported");
6690 return -1;
6691 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006692
6693 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6694 UnpicklerObject *unpickler =
6695 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6696
6697 new_memo_size = unpickler->memo_size;
6698 new_memo = _Unpickler_NewMemo(new_memo_size);
6699 if (new_memo == NULL)
6700 return -1;
6701
6702 for (i = 0; i < new_memo_size; i++) {
6703 Py_XINCREF(unpickler->memo[i]);
6704 new_memo[i] = unpickler->memo[i];
6705 }
6706 }
6707 else if (PyDict_Check(obj)) {
6708 Py_ssize_t i = 0;
6709 PyObject *key, *value;
6710
6711 new_memo_size = PyDict_Size(obj);
6712 new_memo = _Unpickler_NewMemo(new_memo_size);
6713 if (new_memo == NULL)
6714 return -1;
6715
6716 while (PyDict_Next(obj, &i, &key, &value)) {
6717 Py_ssize_t idx;
6718 if (!PyLong_Check(key)) {
6719 PyErr_SetString(PyExc_TypeError,
6720 "memo key must be integers");
6721 goto error;
6722 }
6723 idx = PyLong_AsSsize_t(key);
6724 if (idx == -1 && PyErr_Occurred())
6725 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006726 if (idx < 0) {
6727 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006728 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006729 goto error;
6730 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006731 if (_Unpickler_MemoPut(self, idx, value) < 0)
6732 goto error;
6733 }
6734 }
6735 else {
6736 PyErr_Format(PyExc_TypeError,
6737 "'memo' attribute must be an UnpicklerMemoProxy object"
6738 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006739 return -1;
6740 }
6741
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006742 _Unpickler_MemoCleanup(self);
6743 self->memo_size = new_memo_size;
6744 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006745
6746 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006747
6748 error:
6749 if (new_memo_size) {
6750 i = new_memo_size;
6751 while (--i >= 0) {
6752 Py_XDECREF(new_memo[i]);
6753 }
6754 PyMem_FREE(new_memo);
6755 }
6756 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006757}
6758
6759static PyObject *
6760Unpickler_get_persload(UnpicklerObject *self)
6761{
6762 if (self->pers_func == NULL)
6763 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6764 else
6765 Py_INCREF(self->pers_func);
6766 return self->pers_func;
6767}
6768
6769static int
6770Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6771{
6772 PyObject *tmp;
6773
6774 if (value == NULL) {
6775 PyErr_SetString(PyExc_TypeError,
6776 "attribute deletion is not supported");
6777 return -1;
6778 }
6779 if (!PyCallable_Check(value)) {
6780 PyErr_SetString(PyExc_TypeError,
6781 "persistent_load must be a callable taking "
6782 "one argument");
6783 return -1;
6784 }
6785
6786 tmp = self->pers_func;
6787 Py_INCREF(value);
6788 self->pers_func = value;
6789 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6790
6791 return 0;
6792}
6793
6794static PyGetSetDef Unpickler_getsets[] = {
6795 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6796 {"persistent_load", (getter)Unpickler_get_persload,
6797 (setter)Unpickler_set_persload},
6798 {NULL}
6799};
6800
6801static PyTypeObject Unpickler_Type = {
6802 PyVarObject_HEAD_INIT(NULL, 0)
6803 "_pickle.Unpickler", /*tp_name*/
6804 sizeof(UnpicklerObject), /*tp_basicsize*/
6805 0, /*tp_itemsize*/
6806 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6807 0, /*tp_print*/
6808 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006809 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006810 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006811 0, /*tp_repr*/
6812 0, /*tp_as_number*/
6813 0, /*tp_as_sequence*/
6814 0, /*tp_as_mapping*/
6815 0, /*tp_hash*/
6816 0, /*tp_call*/
6817 0, /*tp_str*/
6818 0, /*tp_getattro*/
6819 0, /*tp_setattro*/
6820 0, /*tp_as_buffer*/
6821 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006822 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006823 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6824 (inquiry)Unpickler_clear, /*tp_clear*/
6825 0, /*tp_richcompare*/
6826 0, /*tp_weaklistoffset*/
6827 0, /*tp_iter*/
6828 0, /*tp_iternext*/
6829 Unpickler_methods, /*tp_methods*/
6830 0, /*tp_members*/
6831 Unpickler_getsets, /*tp_getset*/
6832 0, /*tp_base*/
6833 0, /*tp_dict*/
6834 0, /*tp_descr_get*/
6835 0, /*tp_descr_set*/
6836 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006837 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006838 PyType_GenericAlloc, /*tp_alloc*/
6839 PyType_GenericNew, /*tp_new*/
6840 PyObject_GC_Del, /*tp_free*/
6841 0, /*tp_is_gc*/
6842};
6843
Larry Hastings61272b72014-01-07 12:41:53 -08006844/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006845
6846_pickle.dump
6847
6848 obj: object
6849 file: object
6850 protocol: object = NULL
6851 *
6852 fix_imports: bool = True
6853
6854Write a pickled representation of obj to the open file object file.
6855
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006856This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6857be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006858
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 -08006867The *file* argument must have a write() method that accepts a single
6868bytes argument. It can thus be a file object opened for binary
6869writing, a io.BytesIO instance, or any other custom object that meets
6870this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006871
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006872If *fix_imports* is True and protocol is less than 3, pickle will try
6873to map the new Python 3 names to the old module names used in Python
68742, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006875[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006876
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006877static PyObject *
6878_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006879/*[clinic end generated code: output=a606e626d553850d input=e9e5fdd48de92eae]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006880{
6881 PicklerObject *pickler = _Pickler_New();
6882
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006883 if (pickler == NULL)
6884 return NULL;
6885
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006886 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006887 goto error;
6888
6889 if (_Pickler_SetOutputStream(pickler, file) < 0)
6890 goto error;
6891
6892 if (dump(pickler, obj) < 0)
6893 goto error;
6894
6895 if (_Pickler_FlushToFile(pickler) < 0)
6896 goto error;
6897
6898 Py_DECREF(pickler);
6899 Py_RETURN_NONE;
6900
6901 error:
6902 Py_XDECREF(pickler);
6903 return NULL;
6904}
6905
Larry Hastings61272b72014-01-07 12:41:53 -08006906/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006907
6908_pickle.dumps
6909
6910 obj: object
6911 protocol: object = NULL
6912 *
6913 fix_imports: bool = True
6914
6915Return the pickled representation of the object as a bytes object.
6916
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006917The optional *protocol* argument tells the pickler to use the given
6918protocol; supported protocols are 0, 1, 2, 3 and 4. The default
6919protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006920
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006921Specifying a negative protocol version selects the highest protocol
6922version supported. The higher the protocol used, the more recent the
6923version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006924
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006925If *fix_imports* is True and *protocol* is less than 3, pickle will
6926try to map the new Python 3 names to the old module names used in
6927Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006928[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006929
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006930static PyObject *
6931_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006932/*[clinic end generated code: output=777f0deefe5b88ee input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006933{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006934 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006935 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006936
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006937 if (pickler == NULL)
6938 return NULL;
6939
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006940 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006941 goto error;
6942
6943 if (dump(pickler, obj) < 0)
6944 goto error;
6945
6946 result = _Pickler_GetString(pickler);
6947 Py_DECREF(pickler);
6948 return result;
6949
6950 error:
6951 Py_XDECREF(pickler);
6952 return NULL;
6953}
6954
Larry Hastings61272b72014-01-07 12:41:53 -08006955/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006956
6957_pickle.load
6958
6959 file: object
6960 *
6961 fix_imports: bool = True
6962 encoding: str = 'ASCII'
6963 errors: str = 'strict'
6964
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006965Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006966
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006967This is equivalent to ``Unpickler(file).load()``, but may be more
6968efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006969
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006970The protocol version of the pickle is detected automatically, so no
6971protocol argument is needed. Bytes past the pickled object's
6972representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006973
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006974The argument *file* must have two methods, a read() method that takes
6975an integer argument, and a readline() method that requires no
6976arguments. Both methods should return bytes. Thus *file* can be a
6977binary file object opened for reading, a io.BytesIO object, or any
6978other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006979
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006980Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6981which are used to control compatiblity support for pickle stream
6982generated by Python 2. If *fix_imports* is True, pickle will try to
6983map the old Python 2 names to the new names used in Python 3. The
6984*encoding* and *errors* tell pickle how to decode 8-bit string
6985instances pickled by Python 2; these default to 'ASCII' and 'strict',
6986respectively. The *encoding* can be 'bytes' to read these 8-bit
6987string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006988[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006989
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006990static PyObject *
6991_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006992/*[clinic end generated code: output=568c61356c172654 input=da97372e38e510a6]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006993{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006994 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006995 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006996
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006997 if (unpickler == NULL)
6998 return NULL;
6999
7000 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7001 goto error;
7002
7003 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7004 goto error;
7005
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007006 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007007
7008 result = load(unpickler);
7009 Py_DECREF(unpickler);
7010 return result;
7011
7012 error:
7013 Py_XDECREF(unpickler);
7014 return NULL;
7015}
7016
Larry Hastings61272b72014-01-07 12:41:53 -08007017/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007018
7019_pickle.loads
7020
7021 data: object
7022 *
7023 fix_imports: bool = True
7024 encoding: str = 'ASCII'
7025 errors: str = 'strict'
7026
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007027Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007028
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007029The protocol version of the pickle is detected automatically, so no
7030protocol argument is needed. Bytes past the pickled object's
7031representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007032
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007033Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7034which are used to control compatiblity support for pickle stream
7035generated by Python 2. If *fix_imports* is True, pickle will try to
7036map the old Python 2 names to the new names used in Python 3. The
7037*encoding* and *errors* tell pickle how to decode 8-bit string
7038instances pickled by Python 2; these default to 'ASCII' and 'strict',
7039respectively. The *encoding* can be 'bytes' to read these 8-bit
7040string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007041[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007042
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007043static PyObject *
7044_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08007045/*[clinic end generated code: output=0b3845ad110b2522 input=f57f0fdaa2b4cb8b]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007046{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007047 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007048 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007049
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007050 if (unpickler == NULL)
7051 return NULL;
7052
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007053 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007054 goto error;
7055
7056 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7057 goto error;
7058
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007059 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007060
7061 result = load(unpickler);
7062 Py_DECREF(unpickler);
7063 return result;
7064
7065 error:
7066 Py_XDECREF(unpickler);
7067 return NULL;
7068}
7069
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007070static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007071 _PICKLE_DUMP_METHODDEF
7072 _PICKLE_DUMPS_METHODDEF
7073 _PICKLE_LOAD_METHODDEF
7074 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007075 {NULL, NULL} /* sentinel */
7076};
7077
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007078static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007079pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007080{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007081 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007082 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007083}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007084
Stefan Krahf483b0f2013-12-14 13:43:10 +01007085static void
7086pickle_free(PyObject *m)
7087{
7088 _Pickle_ClearState(_Pickle_GetState(m));
7089}
7090
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007091static int
7092pickle_traverse(PyObject *m, visitproc visit, void *arg)
7093{
7094 PickleState *st = _Pickle_GetState(m);
7095 Py_VISIT(st->PickleError);
7096 Py_VISIT(st->PicklingError);
7097 Py_VISIT(st->UnpicklingError);
7098 Py_VISIT(st->dispatch_table);
7099 Py_VISIT(st->extension_registry);
7100 Py_VISIT(st->extension_cache);
7101 Py_VISIT(st->inverted_registry);
7102 Py_VISIT(st->name_mapping_2to3);
7103 Py_VISIT(st->import_mapping_2to3);
7104 Py_VISIT(st->name_mapping_3to2);
7105 Py_VISIT(st->import_mapping_3to2);
7106 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007107 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007108}
7109
7110static struct PyModuleDef _picklemodule = {
7111 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007112 "_pickle", /* m_name */
7113 pickle_module_doc, /* m_doc */
7114 sizeof(PickleState), /* m_size */
7115 pickle_methods, /* m_methods */
7116 NULL, /* m_reload */
7117 pickle_traverse, /* m_traverse */
7118 pickle_clear, /* m_clear */
7119 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007120};
7121
7122PyMODINIT_FUNC
7123PyInit__pickle(void)
7124{
7125 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007126 PickleState *st;
7127
7128 m = PyState_FindModule(&_picklemodule);
7129 if (m) {
7130 Py_INCREF(m);
7131 return m;
7132 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007133
7134 if (PyType_Ready(&Unpickler_Type) < 0)
7135 return NULL;
7136 if (PyType_Ready(&Pickler_Type) < 0)
7137 return NULL;
7138 if (PyType_Ready(&Pdata_Type) < 0)
7139 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007140 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7141 return NULL;
7142 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7143 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007144
7145 /* Create the module and add the functions. */
7146 m = PyModule_Create(&_picklemodule);
7147 if (m == NULL)
7148 return NULL;
7149
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007150 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007151 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7152 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007153 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007154 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7155 return NULL;
7156
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007157 st = _Pickle_GetState(m);
7158
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007159 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007160 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7161 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007162 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007163 st->PicklingError = \
7164 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7165 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007166 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007167 st->UnpicklingError = \
7168 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7169 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007170 return NULL;
7171
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007172 Py_INCREF(st->PickleError);
7173 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007174 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007175 Py_INCREF(st->PicklingError);
7176 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007177 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007178 Py_INCREF(st->UnpicklingError);
7179 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007180 return NULL;
7181
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007182 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007183 return NULL;
7184
7185 return m;
7186}