blob: 9525ad6d9661bcc8c22f8c8df163e52ccac01c78 [file] [log] [blame]
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001
2/* Core extension modules are built-in on some platforms (e.g. Windows). */
3#ifdef Py_BUILD_CORE
Eric Snowfc1bf872017-09-11 18:30:43 -07004#define Py_BUILD_CORE_BUILTIN
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#undef Py_BUILD_CORE
6#endif
7
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008#include "Python.h"
9#include "structmember.h"
10
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -080011PyDoc_STRVAR(pickle_module_doc,
12"Optimized C implementation for the Python pickle module.");
13
Larry Hastings61272b72014-01-07 12:41:53 -080014/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080015module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -080016class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
17class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
18class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
19class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080020[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030021/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080022
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000023/* Bump this when new opcodes are added to the pickle protocol. */
24enum {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010025 HIGHEST_PROTOCOL = 4,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000026 DEFAULT_PROTOCOL = 3
27};
28
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000029/* Pickle opcodes. These must be kept updated with pickle.py.
30 Extensive docs are in pickletools.py. */
31enum opcode {
32 MARK = '(',
33 STOP = '.',
34 POP = '0',
35 POP_MARK = '1',
36 DUP = '2',
37 FLOAT = 'F',
38 INT = 'I',
39 BININT = 'J',
40 BININT1 = 'K',
41 LONG = 'L',
42 BININT2 = 'M',
43 NONE = 'N',
44 PERSID = 'P',
45 BINPERSID = 'Q',
46 REDUCE = 'R',
47 STRING = 'S',
48 BINSTRING = 'T',
49 SHORT_BINSTRING = 'U',
50 UNICODE = 'V',
51 BINUNICODE = 'X',
52 APPEND = 'a',
53 BUILD = 'b',
54 GLOBAL = 'c',
55 DICT = 'd',
56 EMPTY_DICT = '}',
57 APPENDS = 'e',
58 GET = 'g',
59 BINGET = 'h',
60 INST = 'i',
61 LONG_BINGET = 'j',
62 LIST = 'l',
63 EMPTY_LIST = ']',
64 OBJ = 'o',
65 PUT = 'p',
66 BINPUT = 'q',
67 LONG_BINPUT = 'r',
68 SETITEM = 's',
69 TUPLE = 't',
70 EMPTY_TUPLE = ')',
71 SETITEMS = 'u',
72 BINFLOAT = 'G',
73
74 /* Protocol 2. */
75 PROTO = '\x80',
76 NEWOBJ = '\x81',
77 EXT1 = '\x82',
78 EXT2 = '\x83',
79 EXT4 = '\x84',
80 TUPLE1 = '\x85',
81 TUPLE2 = '\x86',
82 TUPLE3 = '\x87',
83 NEWTRUE = '\x88',
84 NEWFALSE = '\x89',
85 LONG1 = '\x8a',
86 LONG4 = '\x8b',
87
88 /* Protocol 3 (Python 3.x) */
89 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010090 SHORT_BINBYTES = 'C',
91
92 /* Protocol 4 */
93 SHORT_BINUNICODE = '\x8c',
94 BINUNICODE8 = '\x8d',
95 BINBYTES8 = '\x8e',
96 EMPTY_SET = '\x8f',
97 ADDITEMS = '\x90',
98 FROZENSET = '\x91',
99 NEWOBJ_EX = '\x92',
100 STACK_GLOBAL = '\x93',
101 MEMOIZE = '\x94',
102 FRAME = '\x95'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000103};
104
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000105enum {
106 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
107 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
108 break if this gets out of synch with pickle.py, but it's unclear that would
109 help anything either. */
110 BATCHSIZE = 1000,
111
112 /* Nesting limit until Pickler, when running in "fast mode", starts
113 checking for self-referential data-structures. */
114 FAST_NESTING_LIMIT = 50,
115
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000116 /* Initial size of the write buffer of Pickler. */
117 WRITE_BUF_SIZE = 4096,
118
Antoine Pitrou04248a82010-10-12 20:51:21 +0000119 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100120 PREFETCH = 8192 * 16,
121
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200122 FRAME_SIZE_MIN = 4,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100123 FRAME_SIZE_TARGET = 64 * 1024,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100124 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000125};
126
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800127/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000128
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800129/* State of the pickle module, per PEP 3121. */
130typedef struct {
131 /* Exception classes for pickle. */
132 PyObject *PickleError;
133 PyObject *PicklingError;
134 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800135
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800136 /* copyreg.dispatch_table, {type_object: pickling_function} */
137 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000138
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800139 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000140
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800141 /* copyreg._extension_registry, {(module_name, function_name): code} */
142 PyObject *extension_registry;
143 /* copyreg._extension_cache, {code: object} */
144 PyObject *extension_cache;
145 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
146 PyObject *inverted_registry;
147
148 /* Import mappings for compatibility with Python 2.x */
149
150 /* _compat_pickle.NAME_MAPPING,
151 {(oldmodule, oldname): (newmodule, newname)} */
152 PyObject *name_mapping_2to3;
153 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
154 PyObject *import_mapping_2to3;
155 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
156 PyObject *name_mapping_3to2;
157 PyObject *import_mapping_3to2;
158
159 /* codecs.encode, used for saving bytes in older protocols */
160 PyObject *codecs_encode;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300161 /* builtins.getattr, used for saving nested names with protocol < 4 */
162 PyObject *getattr;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300163 /* functools.partial, used for implementing __newobj_ex__ with protocols
164 2 and 3 */
165 PyObject *partial;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800166} PickleState;
167
168/* Forward declaration of the _pickle module definition. */
169static struct PyModuleDef _picklemodule;
170
171/* Given a module object, get its per-module state. */
172static PickleState *
173_Pickle_GetState(PyObject *module)
174{
175 return (PickleState *)PyModule_GetState(module);
176}
177
178/* Find the module instance imported in the currently running sub-interpreter
179 and get its state. */
180static PickleState *
181_Pickle_GetGlobalState(void)
182{
183 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
184}
185
186/* Clear the given pickle module state. */
187static void
188_Pickle_ClearState(PickleState *st)
189{
190 Py_CLEAR(st->PickleError);
191 Py_CLEAR(st->PicklingError);
192 Py_CLEAR(st->UnpicklingError);
193 Py_CLEAR(st->dispatch_table);
194 Py_CLEAR(st->extension_registry);
195 Py_CLEAR(st->extension_cache);
196 Py_CLEAR(st->inverted_registry);
197 Py_CLEAR(st->name_mapping_2to3);
198 Py_CLEAR(st->import_mapping_2to3);
199 Py_CLEAR(st->name_mapping_3to2);
200 Py_CLEAR(st->import_mapping_3to2);
201 Py_CLEAR(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300202 Py_CLEAR(st->getattr);
Victor Stinner9ba97df2015-11-17 12:15:07 +0100203 Py_CLEAR(st->partial);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800204}
205
206/* Initialize the given pickle module state. */
207static int
208_Pickle_InitState(PickleState *st)
209{
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300210 PyObject *builtins;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800211 PyObject *copyreg = NULL;
212 PyObject *compat_pickle = NULL;
213 PyObject *codecs = NULL;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300214 PyObject *functools = NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800215
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300216 builtins = PyEval_GetBuiltins();
217 if (builtins == NULL)
218 goto error;
219 st->getattr = PyDict_GetItemString(builtins, "getattr");
220 if (st->getattr == NULL)
221 goto error;
222 Py_INCREF(st->getattr);
223
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800224 copyreg = PyImport_ImportModule("copyreg");
225 if (!copyreg)
226 goto error;
227 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
228 if (!st->dispatch_table)
229 goto error;
230 if (!PyDict_CheckExact(st->dispatch_table)) {
231 PyErr_Format(PyExc_RuntimeError,
232 "copyreg.dispatch_table should be a dict, not %.200s",
233 Py_TYPE(st->dispatch_table)->tp_name);
234 goto error;
235 }
236 st->extension_registry = \
237 PyObject_GetAttrString(copyreg, "_extension_registry");
238 if (!st->extension_registry)
239 goto error;
240 if (!PyDict_CheckExact(st->extension_registry)) {
241 PyErr_Format(PyExc_RuntimeError,
242 "copyreg._extension_registry should be a dict, "
243 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
244 goto error;
245 }
246 st->inverted_registry = \
247 PyObject_GetAttrString(copyreg, "_inverted_registry");
248 if (!st->inverted_registry)
249 goto error;
250 if (!PyDict_CheckExact(st->inverted_registry)) {
251 PyErr_Format(PyExc_RuntimeError,
252 "copyreg._inverted_registry should be a dict, "
253 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
254 goto error;
255 }
256 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
257 if (!st->extension_cache)
258 goto error;
259 if (!PyDict_CheckExact(st->extension_cache)) {
260 PyErr_Format(PyExc_RuntimeError,
261 "copyreg._extension_cache should be a dict, "
262 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
263 goto error;
264 }
265 Py_CLEAR(copyreg);
266
267 /* Load the 2.x -> 3.x stdlib module mapping tables */
268 compat_pickle = PyImport_ImportModule("_compat_pickle");
269 if (!compat_pickle)
270 goto error;
271 st->name_mapping_2to3 = \
272 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
273 if (!st->name_mapping_2to3)
274 goto error;
275 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
276 PyErr_Format(PyExc_RuntimeError,
277 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
278 Py_TYPE(st->name_mapping_2to3)->tp_name);
279 goto error;
280 }
281 st->import_mapping_2to3 = \
282 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
283 if (!st->import_mapping_2to3)
284 goto error;
285 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
286 PyErr_Format(PyExc_RuntimeError,
287 "_compat_pickle.IMPORT_MAPPING should be a dict, "
288 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
289 goto error;
290 }
291 /* ... and the 3.x -> 2.x mapping tables */
292 st->name_mapping_3to2 = \
293 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
294 if (!st->name_mapping_3to2)
295 goto error;
296 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
297 PyErr_Format(PyExc_RuntimeError,
298 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
299 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
300 goto error;
301 }
302 st->import_mapping_3to2 = \
303 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
304 if (!st->import_mapping_3to2)
305 goto error;
306 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
307 PyErr_Format(PyExc_RuntimeError,
308 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
309 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
310 goto error;
311 }
312 Py_CLEAR(compat_pickle);
313
314 codecs = PyImport_ImportModule("codecs");
315 if (codecs == NULL)
316 goto error;
317 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
318 if (st->codecs_encode == NULL) {
319 goto error;
320 }
321 if (!PyCallable_Check(st->codecs_encode)) {
322 PyErr_Format(PyExc_RuntimeError,
323 "codecs.encode should be a callable, not %.200s",
324 Py_TYPE(st->codecs_encode)->tp_name);
325 goto error;
326 }
327 Py_CLEAR(codecs);
328
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300329 functools = PyImport_ImportModule("functools");
330 if (!functools)
331 goto error;
332 st->partial = PyObject_GetAttrString(functools, "partial");
333 if (!st->partial)
334 goto error;
335 Py_CLEAR(functools);
336
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800337 return 0;
338
339 error:
340 Py_CLEAR(copyreg);
341 Py_CLEAR(compat_pickle);
342 Py_CLEAR(codecs);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300343 Py_CLEAR(functools);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800344 _Pickle_ClearState(st);
345 return -1;
346}
347
348/* Helper for calling a function with a single argument quickly.
349
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800350 This function steals the reference of the given argument. */
351static PyObject *
352_Pickle_FastCall(PyObject *func, PyObject *obj)
353{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800354 PyObject *result;
355
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100356 result = PyObject_CallFunctionObjArgs(func, obj, NULL);
Victor Stinner75210692016-08-19 18:59:15 +0200357 Py_DECREF(obj);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800358 return result;
359}
360
361/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000362
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200363/* Retrieve and deconstruct a method for avoiding a reference cycle
364 (pickler -> bound method of pickler -> pickler) */
365static int
366init_method_ref(PyObject *self, _Py_Identifier *name,
367 PyObject **method_func, PyObject **method_self)
368{
369 PyObject *func, *func2;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200370 int ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200371
372 /* *method_func and *method_self should be consistent. All refcount decrements
373 should be occurred after setting *method_self and *method_func. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200374 ret = _PyObject_LookupAttrId(self, name, &func);
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200375 if (func == NULL) {
376 *method_self = NULL;
377 Py_CLEAR(*method_func);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200378 return ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200379 }
380
381 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
382 /* Deconstruct a bound Python method */
383 func2 = PyMethod_GET_FUNCTION(func);
384 Py_INCREF(func2);
385 *method_self = self; /* borrowed */
386 Py_XSETREF(*method_func, func2);
387 Py_DECREF(func);
388 return 0;
389 }
390 else {
391 *method_self = NULL;
392 Py_XSETREF(*method_func, func);
393 return 0;
394 }
395}
396
397/* Bind a method if it was deconstructed */
398static PyObject *
399reconstruct_method(PyObject *func, PyObject *self)
400{
401 if (self) {
402 return PyMethod_New(func, self);
403 }
404 else {
405 Py_INCREF(func);
406 return func;
407 }
408}
409
410static PyObject *
411call_method(PyObject *func, PyObject *self, PyObject *obj)
412{
413 if (self) {
414 return PyObject_CallFunctionObjArgs(func, self, obj, NULL);
415 }
416 else {
417 return PyObject_CallFunctionObjArgs(func, obj, NULL);
418 }
419}
420
421/*************************************************************************/
422
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000423/* Internal data type used as the unpickling stack. */
424typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000425 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000426 PyObject **data;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200427 int mark_set; /* is MARK set? */
428 Py_ssize_t fence; /* position of top MARK or 0 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000429 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000430} Pdata;
431
432static void
433Pdata_dealloc(Pdata *self)
434{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200435 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000436 while (--i >= 0) {
437 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000438 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000439 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000440 PyObject_Del(self);
441}
442
443static PyTypeObject Pdata_Type = {
444 PyVarObject_HEAD_INIT(NULL, 0)
445 "_pickle.Pdata", /*tp_name*/
446 sizeof(Pdata), /*tp_basicsize*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200447 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000448 (destructor)Pdata_dealloc, /*tp_dealloc*/
449};
450
451static PyObject *
452Pdata_New(void)
453{
454 Pdata *self;
455
456 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
457 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000458 Py_SIZE(self) = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200459 self->mark_set = 0;
460 self->fence = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000461 self->allocated = 8;
462 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000463 if (self->data)
464 return (PyObject *)self;
465 Py_DECREF(self);
466 return PyErr_NoMemory();
467}
468
469
470/* Retain only the initial clearto items. If clearto >= the current
471 * number of items, this is a (non-erroneous) NOP.
472 */
473static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200474Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000475{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200476 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000477
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200478 assert(clearto >= self->fence);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000479 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000480 return 0;
481
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000482 while (--i >= clearto) {
483 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000484 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000485 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000486 return 0;
487}
488
489static int
490Pdata_grow(Pdata *self)
491{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000492 PyObject **data = self->data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200493 size_t allocated = (size_t)self->allocated;
494 size_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000495
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000496 new_allocated = (allocated >> 3) + 6;
497 /* check for integer overflow */
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200498 if (new_allocated > (size_t)PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000499 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000500 new_allocated += allocated;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500501 PyMem_RESIZE(data, PyObject *, new_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000502 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000503 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000504
505 self->data = data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200506 self->allocated = (Py_ssize_t)new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000507 return 0;
508
509 nomemory:
510 PyErr_NoMemory();
511 return -1;
512}
513
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200514static int
515Pdata_stack_underflow(Pdata *self)
516{
517 PickleState *st = _Pickle_GetGlobalState();
518 PyErr_SetString(st->UnpicklingError,
519 self->mark_set ?
520 "unexpected MARK found" :
521 "unpickling stack underflow");
522 return -1;
523}
524
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000525/* D is a Pdata*. Pop the topmost element and store it into V, which
526 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
527 * is raised and V is set to NULL.
528 */
529static PyObject *
530Pdata_pop(Pdata *self)
531{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200532 if (Py_SIZE(self) <= self->fence) {
533 Pdata_stack_underflow(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000534 return NULL;
535 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000536 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000537}
538#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
539
540static int
541Pdata_push(Pdata *self, PyObject *obj)
542{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000543 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000544 return -1;
545 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000546 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000547 return 0;
548}
549
550/* Push an object on stack, transferring its ownership to the stack. */
551#define PDATA_PUSH(D, O, ER) do { \
552 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
553
554/* Push an object on stack, adding a new reference to the object. */
555#define PDATA_APPEND(D, O, ER) do { \
556 Py_INCREF((O)); \
557 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
558
559static PyObject *
560Pdata_poptuple(Pdata *self, Py_ssize_t start)
561{
562 PyObject *tuple;
563 Py_ssize_t len, i, j;
564
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200565 if (start < self->fence) {
566 Pdata_stack_underflow(self);
567 return NULL;
568 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000569 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000570 tuple = PyTuple_New(len);
571 if (tuple == NULL)
572 return NULL;
573 for (i = start, j = 0; j < len; i++, j++)
574 PyTuple_SET_ITEM(tuple, j, self->data[i]);
575
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000576 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000577 return tuple;
578}
579
580static PyObject *
581Pdata_poplist(Pdata *self, Py_ssize_t start)
582{
583 PyObject *list;
584 Py_ssize_t len, i, j;
585
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000586 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000587 list = PyList_New(len);
588 if (list == NULL)
589 return NULL;
590 for (i = start, j = 0; j < len; i++, j++)
591 PyList_SET_ITEM(list, j, self->data[i]);
592
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000593 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000594 return list;
595}
596
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000597typedef struct {
598 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200599 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000600} PyMemoEntry;
601
602typedef struct {
603 Py_ssize_t mt_mask;
604 Py_ssize_t mt_used;
605 Py_ssize_t mt_allocated;
606 PyMemoEntry *mt_table;
607} PyMemoTable;
608
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000609typedef struct PicklerObject {
610 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000611 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000612 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000613 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000614 PyObject *pers_func; /* persistent_id() method, can be NULL */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200615 PyObject *pers_func_self; /* borrowed reference to self if pers_func
616 is an unbound method, NULL otherwise */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100617 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000618
619 PyObject *write; /* write() method of the output stream. */
620 PyObject *output_buffer; /* Write into a local bytearray buffer before
621 flushing to the stream. */
622 Py_ssize_t output_len; /* Length of output_buffer. */
623 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000624 int proto; /* Pickle protocol number, >= 0 */
625 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100626 int framing; /* True when framing is enabled, proto >= 4 */
627 Py_ssize_t frame_start; /* Position in output_buffer where the
Martin Pantera90a4a92016-05-30 04:04:50 +0000628 current frame begins. -1 if there
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100629 is no frame currently open. */
630
631 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000632 int fast; /* Enable fast mode if set to a true value.
633 The fast mode disable the usage of memo,
634 therefore speeding the pickling process by
635 not generating superfluous PUT opcodes. It
636 should not be used if with self-referential
637 objects. */
638 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000639 int fix_imports; /* Indicate whether Pickler should fix
640 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000641 PyObject *fast_memo;
642} PicklerObject;
643
644typedef struct UnpicklerObject {
645 PyObject_HEAD
646 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000647
648 /* The unpickler memo is just an array of PyObject *s. Using a dict
649 is unnecessary, since the keys are contiguous ints. */
650 PyObject **memo;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100651 Py_ssize_t memo_size; /* Capacity of the memo array */
652 Py_ssize_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000653
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000654 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200655 PyObject *pers_func_self; /* borrowed reference to self if pers_func
656 is an unbound method, NULL otherwise */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000657
658 Py_buffer buffer;
659 char *input_buffer;
660 char *input_line;
661 Py_ssize_t input_len;
662 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000663 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100664
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000665 PyObject *read; /* read() method of the input stream. */
666 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000667 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000668
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000669 char *encoding; /* Name of the encoding to be used for
670 decoding strings pickled using Python
671 2.x. The default value is "ASCII" */
672 char *errors; /* Name of errors handling scheme to used when
673 decoding strings. The default value is
674 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500675 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000676 objects. */
677 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
678 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000679 int proto; /* Protocol of the pickle loaded. */
680 int fix_imports; /* Indicate whether Unpickler should fix
681 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000682} UnpicklerObject;
683
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200684typedef struct {
685 PyObject_HEAD
686 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
687} PicklerMemoProxyObject;
688
689typedef struct {
690 PyObject_HEAD
691 UnpicklerObject *unpickler;
692} UnpicklerMemoProxyObject;
693
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000694/* Forward declarations */
695static int save(PicklerObject *, PyObject *, int);
696static int save_reduce(PicklerObject *, PyObject *, PyObject *);
697static PyTypeObject Pickler_Type;
698static PyTypeObject Unpickler_Type;
699
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200700#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000701
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000702/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300703 A custom hashtable mapping void* to Python ints. This is used by the pickler
704 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000705 a bunch of unnecessary object creation. This makes a huge performance
706 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000707
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000708#define MT_MINSIZE 8
709#define PERTURB_SHIFT 5
710
711
712static PyMemoTable *
713PyMemoTable_New(void)
714{
715 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
716 if (memo == NULL) {
717 PyErr_NoMemory();
718 return NULL;
719 }
720
721 memo->mt_used = 0;
722 memo->mt_allocated = MT_MINSIZE;
723 memo->mt_mask = MT_MINSIZE - 1;
724 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
725 if (memo->mt_table == NULL) {
726 PyMem_FREE(memo);
727 PyErr_NoMemory();
728 return NULL;
729 }
730 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
731
732 return memo;
733}
734
735static PyMemoTable *
736PyMemoTable_Copy(PyMemoTable *self)
737{
738 Py_ssize_t i;
739 PyMemoTable *new = PyMemoTable_New();
740 if (new == NULL)
741 return NULL;
742
743 new->mt_used = self->mt_used;
744 new->mt_allocated = self->mt_allocated;
745 new->mt_mask = self->mt_mask;
746 /* The table we get from _New() is probably smaller than we wanted.
747 Free it and allocate one that's the right size. */
748 PyMem_FREE(new->mt_table);
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500749 new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000750 if (new->mt_table == NULL) {
751 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200752 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000753 return NULL;
754 }
755 for (i = 0; i < self->mt_allocated; i++) {
756 Py_XINCREF(self->mt_table[i].me_key);
757 }
758 memcpy(new->mt_table, self->mt_table,
759 sizeof(PyMemoEntry) * self->mt_allocated);
760
761 return new;
762}
763
764static Py_ssize_t
765PyMemoTable_Size(PyMemoTable *self)
766{
767 return self->mt_used;
768}
769
770static int
771PyMemoTable_Clear(PyMemoTable *self)
772{
773 Py_ssize_t i = self->mt_allocated;
774
775 while (--i >= 0) {
776 Py_XDECREF(self->mt_table[i].me_key);
777 }
778 self->mt_used = 0;
779 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
780 return 0;
781}
782
783static void
784PyMemoTable_Del(PyMemoTable *self)
785{
786 if (self == NULL)
787 return;
788 PyMemoTable_Clear(self);
789
790 PyMem_FREE(self->mt_table);
791 PyMem_FREE(self);
792}
793
794/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
795 can be considerably simpler than dictobject.c's lookdict(). */
796static PyMemoEntry *
797_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
798{
799 size_t i;
800 size_t perturb;
801 size_t mask = (size_t)self->mt_mask;
802 PyMemoEntry *table = self->mt_table;
803 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000804 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000805
806 i = hash & mask;
807 entry = &table[i];
808 if (entry->me_key == NULL || entry->me_key == key)
809 return entry;
810
811 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
812 i = (i << 2) + i + perturb + 1;
813 entry = &table[i & mask];
814 if (entry->me_key == NULL || entry->me_key == key)
815 return entry;
816 }
Barry Warsawb2e57942017-09-14 18:13:16 -0700817 Py_UNREACHABLE();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000818}
819
820/* Returns -1 on failure, 0 on success. */
821static int
822_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
823{
824 PyMemoEntry *oldtable = NULL;
825 PyMemoEntry *oldentry, *newentry;
826 Py_ssize_t new_size = MT_MINSIZE;
827 Py_ssize_t to_process;
828
829 assert(min_size > 0);
830
831 /* Find the smallest valid table size >= min_size. */
832 while (new_size < min_size && new_size > 0)
833 new_size <<= 1;
834 if (new_size <= 0) {
835 PyErr_NoMemory();
836 return -1;
837 }
838 /* new_size needs to be a power of two. */
839 assert((new_size & (new_size - 1)) == 0);
840
841 /* Allocate new table. */
842 oldtable = self->mt_table;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500843 self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000844 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200845 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000846 PyErr_NoMemory();
847 return -1;
848 }
849 self->mt_allocated = new_size;
850 self->mt_mask = new_size - 1;
851 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
852
853 /* Copy entries from the old table. */
854 to_process = self->mt_used;
855 for (oldentry = oldtable; to_process > 0; oldentry++) {
856 if (oldentry->me_key != NULL) {
857 to_process--;
858 /* newentry is a pointer to a chunk of the new
859 mt_table, so we're setting the key:value pair
860 in-place. */
861 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
862 newentry->me_key = oldentry->me_key;
863 newentry->me_value = oldentry->me_value;
864 }
865 }
866
867 /* Deallocate the old table. */
868 PyMem_FREE(oldtable);
869 return 0;
870}
871
872/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200873static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000874PyMemoTable_Get(PyMemoTable *self, PyObject *key)
875{
876 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
877 if (entry->me_key == NULL)
878 return NULL;
879 return &entry->me_value;
880}
881
882/* Returns -1 on failure, 0 on success. */
883static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200884PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000885{
886 PyMemoEntry *entry;
887
888 assert(key != NULL);
889
890 entry = _PyMemoTable_Lookup(self, key);
891 if (entry->me_key != NULL) {
892 entry->me_value = value;
893 return 0;
894 }
895 Py_INCREF(key);
896 entry->me_key = key;
897 entry->me_value = value;
898 self->mt_used++;
899
900 /* If we added a key, we can safely resize. Otherwise just return!
901 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
902 *
903 * Quadrupling the size improves average table sparseness
904 * (reducing collisions) at the cost of some memory. It also halves
905 * the number of expensive resize operations in a growing memo table.
906 *
907 * Very large memo tables (over 50K items) use doubling instead.
908 * This may help applications with severe memory constraints.
909 */
910 if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
911 return 0;
912 return _PyMemoTable_ResizeTable(self,
913 (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
914}
915
916#undef MT_MINSIZE
917#undef PERTURB_SHIFT
918
919/*************************************************************************/
920
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000921
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000922static int
923_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000924{
Serhiy Storchaka48842712016-04-06 09:45:48 +0300925 Py_XSETREF(self->output_buffer,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +0200926 PyBytes_FromStringAndSize(NULL, self->max_output_len));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000927 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000928 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000929 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100930 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000931 return 0;
932}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000933
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100934static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100935_write_size64(char *out, size_t value)
936{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200937 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800938
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200939 Py_BUILD_ASSERT(sizeof(size_t) <= 8);
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800940
941 for (i = 0; i < sizeof(size_t); i++) {
942 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
943 }
944 for (i = sizeof(size_t); i < 8; i++) {
945 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800946 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100947}
948
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100949static int
950_Pickler_CommitFrame(PicklerObject *self)
951{
952 size_t frame_len;
953 char *qdata;
954
955 if (!self->framing || self->frame_start == -1)
956 return 0;
957 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
958 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200959 if (frame_len >= FRAME_SIZE_MIN) {
960 qdata[0] = FRAME;
961 _write_size64(qdata + 1, frame_len);
962 }
963 else {
964 memmove(qdata, qdata + FRAME_HEADER_SIZE, frame_len);
965 self->output_len -= FRAME_HEADER_SIZE;
966 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100967 self->frame_start = -1;
968 return 0;
969}
970
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000971static PyObject *
972_Pickler_GetString(PicklerObject *self)
973{
974 PyObject *output_buffer = self->output_buffer;
975
976 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100977
978 if (_Pickler_CommitFrame(self))
979 return NULL;
980
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000981 self->output_buffer = NULL;
982 /* Resize down to exact size */
983 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
984 return NULL;
985 return output_buffer;
986}
987
988static int
989_Pickler_FlushToFile(PicklerObject *self)
990{
991 PyObject *output, *result;
992
993 assert(self->write != NULL);
994
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100995 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000996 output = _Pickler_GetString(self);
997 if (output == NULL)
998 return -1;
999
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001000 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001001 Py_XDECREF(result);
1002 return (result == NULL) ? -1 : 0;
1003}
1004
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001005static int
1006_Pickler_OpcodeBoundary(PicklerObject *self)
1007{
1008 Py_ssize_t frame_len;
1009
1010 if (!self->framing || self->frame_start == -1) {
1011 return 0;
1012 }
1013 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
1014 if (frame_len >= FRAME_SIZE_TARGET) {
1015 if(_Pickler_CommitFrame(self)) {
1016 return -1;
1017 }
Miss Islington (bot)e86db342018-02-03 17:41:43 -08001018 /* Flush the content of the committed frame to the underlying
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001019 * file and reuse the pickler buffer for the next frame so as
1020 * to limit memory usage when dumping large complex objects to
1021 * a file.
1022 *
1023 * self->write is NULL when called via dumps.
1024 */
1025 if (self->write != NULL) {
1026 if (_Pickler_FlushToFile(self) < 0) {
1027 return -1;
1028 }
1029 if (_Pickler_ClearBuffer(self) < 0) {
1030 return -1;
1031 }
1032 }
1033 }
1034 return 0;
1035}
1036
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001037static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001038_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001039{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001040 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001041 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001042 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001043
1044 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001045 need_new_frame = (self->framing && self->frame_start == -1);
1046
1047 if (need_new_frame)
1048 n = data_len + FRAME_HEADER_SIZE;
1049 else
1050 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001051
1052 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001053 if (required > self->max_output_len) {
1054 /* Make place in buffer for the pickle chunk */
1055 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
1056 PyErr_NoMemory();
1057 return -1;
1058 }
1059 self->max_output_len = (self->output_len + n) / 2 * 3;
1060 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
1061 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001062 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001063 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001064 if (need_new_frame) {
1065 /* Setup new frame */
1066 Py_ssize_t frame_start = self->output_len;
1067 self->frame_start = frame_start;
1068 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
1069 /* Write an invalid value, for debugging */
1070 buffer[frame_start + i] = 0xFE;
1071 }
1072 self->output_len += FRAME_HEADER_SIZE;
1073 }
1074 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001075 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001076 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001077 buffer[self->output_len + i] = s[i];
1078 }
1079 }
1080 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001081 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001082 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001083 self->output_len += data_len;
1084 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001085}
1086
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001087static PicklerObject *
1088_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001089{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001090 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001091
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001092 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1093 if (self == NULL)
1094 return NULL;
1095
1096 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01001097 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001098 self->write = NULL;
1099 self->proto = 0;
1100 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001101 self->framing = 0;
1102 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001103 self->fast = 0;
1104 self->fast_nesting = 0;
1105 self->fix_imports = 0;
1106 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001107 self->max_output_len = WRITE_BUF_SIZE;
1108 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001109
1110 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001111 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1112 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001113
1114 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001115 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001116 return NULL;
1117 }
1118 return self;
1119}
1120
1121static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001122_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001123{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001124 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001125
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001126 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001127 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001128 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001129 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001130 proto = PyLong_AsLong(protocol);
1131 if (proto < 0) {
1132 if (proto == -1 && PyErr_Occurred())
1133 return -1;
1134 proto = HIGHEST_PROTOCOL;
1135 }
1136 else if (proto > HIGHEST_PROTOCOL) {
1137 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1138 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001139 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001140 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001141 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001142 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001143 self->bin = proto > 0;
1144 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001145 return 0;
1146}
1147
1148/* Returns -1 (with an exception set) on failure, 0 on success. This may
1149 be called once on a freshly created Pickler. */
1150static int
1151_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1152{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001153 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001154 assert(file != NULL);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001155 if (_PyObject_LookupAttrId(file, &PyId_write, &self->write) < 0) {
1156 return -1;
1157 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001158 if (self->write == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001159 PyErr_SetString(PyExc_TypeError,
1160 "file must have a 'write' attribute");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001161 return -1;
1162 }
1163
1164 return 0;
1165}
1166
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001167/* Returns the size of the input on success, -1 on failure. This takes its
1168 own reference to `input`. */
1169static Py_ssize_t
1170_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1171{
1172 if (self->buffer.buf != NULL)
1173 PyBuffer_Release(&self->buffer);
1174 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1175 return -1;
1176 self->input_buffer = self->buffer.buf;
1177 self->input_len = self->buffer.len;
1178 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001179 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001180 return self->input_len;
1181}
1182
Antoine Pitrou04248a82010-10-12 20:51:21 +00001183static int
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001184bad_readline(void)
1185{
1186 PickleState *st = _Pickle_GetGlobalState();
1187 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
1188 return -1;
1189}
1190
1191static int
Antoine Pitrou04248a82010-10-12 20:51:21 +00001192_Unpickler_SkipConsumed(UnpicklerObject *self)
1193{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001194 Py_ssize_t consumed;
1195 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001196
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001197 consumed = self->next_read_idx - self->prefetched_idx;
1198 if (consumed <= 0)
1199 return 0;
1200
1201 assert(self->peek); /* otherwise we did something wrong */
Martin Panter6245cb32016-04-15 02:14:19 +00001202 /* This makes a useless copy... */
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001203 r = PyObject_CallFunction(self->read, "n", consumed);
1204 if (r == NULL)
1205 return -1;
1206 Py_DECREF(r);
1207
1208 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001209 return 0;
1210}
1211
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001212static const Py_ssize_t READ_WHOLE_LINE = -1;
1213
1214/* If reading from a file, we need to only pull the bytes we need, since there
1215 may be multiple pickle objects arranged contiguously in the same input
1216 buffer.
1217
1218 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1219 bytes from the input stream/buffer.
1220
1221 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1222 failure; on success, returns the number of bytes read from the file.
1223
1224 On success, self->input_len will be 0; this is intentional so that when
1225 unpickling from a file, the "we've run out of data" code paths will trigger,
1226 causing the Unpickler to go back to the file for more data. Use the returned
1227 size to tell you how much data you can process. */
1228static Py_ssize_t
1229_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1230{
1231 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001232 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001233
1234 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001235
Antoine Pitrou04248a82010-10-12 20:51:21 +00001236 if (_Unpickler_SkipConsumed(self) < 0)
1237 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001238
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001239 if (n == READ_WHOLE_LINE) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02001240 data = _PyObject_CallNoArg(self->readline);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001241 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001242 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001243 PyObject *len;
1244 /* Prefetch some data without advancing the file pointer, if possible */
1245 if (self->peek && n < PREFETCH) {
1246 len = PyLong_FromSsize_t(PREFETCH);
1247 if (len == NULL)
1248 return -1;
1249 data = _Pickle_FastCall(self->peek, len);
1250 if (data == NULL) {
1251 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1252 return -1;
1253 /* peek() is probably not supported by the given file object */
1254 PyErr_Clear();
1255 Py_CLEAR(self->peek);
1256 }
1257 else {
1258 read_size = _Unpickler_SetStringInput(self, data);
1259 Py_DECREF(data);
1260 self->prefetched_idx = 0;
1261 if (n <= read_size)
1262 return n;
1263 }
1264 }
1265 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001266 if (len == NULL)
1267 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001268 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001269 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001270 if (data == NULL)
1271 return -1;
1272
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001273 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001274 Py_DECREF(data);
1275 return read_size;
1276}
1277
Victor Stinner19ed27e2016-05-20 11:42:37 +02001278/* Don't call it directly: use _Unpickler_Read() */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001279static Py_ssize_t
Victor Stinner19ed27e2016-05-20 11:42:37 +02001280_Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001281{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001282 Py_ssize_t num_read;
1283
Benjamin Peterson6aa15642015-09-27 01:16:03 -07001284 *s = NULL;
Benjamin Petersone48cf7e2015-09-26 00:08:34 -07001285 if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1286 PickleState *st = _Pickle_GetGlobalState();
1287 PyErr_SetString(st->UnpicklingError,
1288 "read would overflow (invalid bytecode)");
1289 return -1;
1290 }
Victor Stinner19ed27e2016-05-20 11:42:37 +02001291
1292 /* This case is handled by the _Unpickler_Read() macro for efficiency */
1293 assert(self->next_read_idx + n > self->input_len);
1294
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001295 if (!self->read)
1296 return bad_readline();
1297
Antoine Pitrou04248a82010-10-12 20:51:21 +00001298 num_read = _Unpickler_ReadFromFile(self, n);
1299 if (num_read < 0)
1300 return -1;
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001301 if (num_read < n)
1302 return bad_readline();
Antoine Pitrou04248a82010-10-12 20:51:21 +00001303 *s = self->input_buffer;
1304 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001305 return n;
1306}
1307
Victor Stinner19ed27e2016-05-20 11:42:37 +02001308/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1309
1310 This should be used for all data reads, rather than accessing the unpickler's
1311 input buffer directly. This method deals correctly with reading from input
1312 streams, which the input buffer doesn't deal with.
1313
1314 Note that when reading from a file-like object, self->next_read_idx won't
1315 be updated (it should remain at 0 for the entire unpickling process). You
1316 should use this function's return value to know how many bytes you can
1317 consume.
1318
1319 Returns -1 (with an exception set) on failure. On success, return the
1320 number of chars read. */
1321#define _Unpickler_Read(self, s, n) \
Victor Stinnerda230562016-05-20 21:16:59 +02001322 (((n) <= (self)->input_len - (self)->next_read_idx) \
Victor Stinner19ed27e2016-05-20 11:42:37 +02001323 ? (*(s) = (self)->input_buffer + (self)->next_read_idx, \
1324 (self)->next_read_idx += (n), \
1325 (n)) \
1326 : _Unpickler_ReadImpl(self, (s), (n)))
1327
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001328static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001329_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1330 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001331{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001332 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001333 if (input_line == NULL) {
1334 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001335 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001336 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001337
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001338 memcpy(input_line, line, len);
1339 input_line[len] = '\0';
1340 self->input_line = input_line;
1341 *result = self->input_line;
1342 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001343}
1344
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001345/* Read a line from the input stream/buffer. If we run off the end of the input
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001346 before hitting \n, raise an error.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001347
1348 Returns the number of chars read, or -1 on failure. */
1349static Py_ssize_t
1350_Unpickler_Readline(UnpicklerObject *self, char **result)
1351{
1352 Py_ssize_t i, num_read;
1353
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001354 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001355 if (self->input_buffer[i] == '\n') {
1356 char *line_start = self->input_buffer + self->next_read_idx;
1357 num_read = i - self->next_read_idx + 1;
1358 self->next_read_idx = i + 1;
1359 return _Unpickler_CopyLine(self, line_start, num_read, result);
1360 }
1361 }
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001362 if (!self->read)
1363 return bad_readline();
Victor Stinner121aab42011-09-29 23:40:53 +02001364
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001365 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1366 if (num_read < 0)
1367 return -1;
1368 if (num_read == 0 || self->input_buffer[num_read - 1] != '\n')
1369 return bad_readline();
1370 self->next_read_idx = num_read;
1371 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001372}
1373
1374/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1375 will be modified in place. */
1376static int
1377_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1378{
1379 Py_ssize_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001380
1381 assert(new_size > self->memo_size);
1382
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001383 PyMem_RESIZE(self->memo, PyObject *, new_size);
1384 if (self->memo == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001385 PyErr_NoMemory();
1386 return -1;
1387 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001388 for (i = self->memo_size; i < new_size; i++)
1389 self->memo[i] = NULL;
1390 self->memo_size = new_size;
1391 return 0;
1392}
1393
1394/* Returns NULL if idx is out of bounds. */
1395static PyObject *
1396_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1397{
1398 if (idx < 0 || idx >= self->memo_size)
1399 return NULL;
1400
1401 return self->memo[idx];
1402}
1403
1404/* Returns -1 (with an exception set) on failure, 0 on success.
1405 This takes its own reference to `value`. */
1406static int
1407_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1408{
1409 PyObject *old_item;
1410
1411 if (idx >= self->memo_size) {
1412 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1413 return -1;
1414 assert(idx < self->memo_size);
1415 }
1416 Py_INCREF(value);
1417 old_item = self->memo[idx];
1418 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001419 if (old_item != NULL) {
1420 Py_DECREF(old_item);
1421 }
1422 else {
1423 self->memo_len++;
1424 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001425 return 0;
1426}
1427
1428static PyObject **
1429_Unpickler_NewMemo(Py_ssize_t new_size)
1430{
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001431 PyObject **memo = PyMem_NEW(PyObject *, new_size);
Victor Stinner42024562013-07-12 00:53:57 +02001432 if (memo == NULL) {
1433 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001434 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001435 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001436 memset(memo, 0, new_size * sizeof(PyObject *));
1437 return memo;
1438}
1439
1440/* Free the unpickler's memo, taking care to decref any items left in it. */
1441static void
1442_Unpickler_MemoCleanup(UnpicklerObject *self)
1443{
1444 Py_ssize_t i;
1445 PyObject **memo = self->memo;
1446
1447 if (self->memo == NULL)
1448 return;
1449 self->memo = NULL;
1450 i = self->memo_size;
1451 while (--i >= 0) {
1452 Py_XDECREF(memo[i]);
1453 }
1454 PyMem_FREE(memo);
1455}
1456
1457static UnpicklerObject *
1458_Unpickler_New(void)
1459{
1460 UnpicklerObject *self;
1461
1462 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1463 if (self == NULL)
1464 return NULL;
1465
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001466 self->pers_func = NULL;
1467 self->input_buffer = NULL;
1468 self->input_line = NULL;
1469 self->input_len = 0;
1470 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001471 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001472 self->read = NULL;
1473 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001474 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001475 self->encoding = NULL;
1476 self->errors = NULL;
1477 self->marks = NULL;
1478 self->num_marks = 0;
1479 self->marks_size = 0;
1480 self->proto = 0;
1481 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001482 memset(&self->buffer, 0, sizeof(Py_buffer));
1483 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001484 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001485 self->memo = _Unpickler_NewMemo(self->memo_size);
1486 self->stack = (Pdata *)Pdata_New();
1487
1488 if (self->memo == NULL || self->stack == NULL) {
1489 Py_DECREF(self);
1490 return NULL;
1491 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001492
1493 return self;
1494}
1495
1496/* Returns -1 (with an exception set) on failure, 0 on success. This may
1497 be called once on a freshly created Pickler. */
1498static int
1499_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1500{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001501 _Py_IDENTIFIER(peek);
1502 _Py_IDENTIFIER(read);
1503 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001504
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001505 if (_PyObject_LookupAttrId(file, &PyId_peek, &self->peek) < 0) {
1506 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001507 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001508 (void)_PyObject_LookupAttrId(file, &PyId_read, &self->read);
1509 (void)_PyObject_LookupAttrId(file, &PyId_readline, &self->readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001510 if (self->readline == NULL || self->read == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001511 if (!PyErr_Occurred()) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001512 PyErr_SetString(PyExc_TypeError,
1513 "file must have 'read' and 'readline' attributes");
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001514 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001515 Py_CLEAR(self->read);
1516 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001517 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001518 return -1;
1519 }
1520 return 0;
1521}
1522
1523/* Returns -1 (with an exception set) on failure, 0 on success. This may
1524 be called once on a freshly created Pickler. */
1525static int
1526_Unpickler_SetInputEncoding(UnpicklerObject *self,
1527 const char *encoding,
1528 const char *errors)
1529{
1530 if (encoding == NULL)
1531 encoding = "ASCII";
1532 if (errors == NULL)
1533 errors = "strict";
1534
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001535 self->encoding = _PyMem_Strdup(encoding);
1536 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001537 if (self->encoding == NULL || self->errors == NULL) {
1538 PyErr_NoMemory();
1539 return -1;
1540 }
1541 return 0;
1542}
1543
1544/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001545static int
1546memo_get(PicklerObject *self, PyObject *key)
1547{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001548 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001549 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001550 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001551
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001552 value = PyMemoTable_Get(self->memo, key);
1553 if (value == NULL) {
1554 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001555 return -1;
1556 }
1557
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001558 if (!self->bin) {
1559 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001560 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1561 "%" PY_FORMAT_SIZE_T "d\n", *value);
1562 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001563 }
1564 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001565 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001566 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001567 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001568 len = 2;
1569 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001570 else if ((size_t)*value <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001571 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001572 pdata[1] = (unsigned char)(*value & 0xff);
1573 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1574 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1575 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001576 len = 5;
1577 }
1578 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001579 PickleState *st = _Pickle_GetGlobalState();
1580 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001581 "memo id too large for LONG_BINGET");
1582 return -1;
1583 }
1584 }
1585
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001586 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001587 return -1;
1588
1589 return 0;
1590}
1591
1592/* Store an object in the memo, assign it a new unique ID based on the number
1593 of objects currently stored in the memo and generate a PUT opcode. */
1594static int
1595memo_put(PicklerObject *self, PyObject *obj)
1596{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001597 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001598 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001599 Py_ssize_t idx;
1600
1601 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001602
1603 if (self->fast)
1604 return 0;
1605
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001606 idx = PyMemoTable_Size(self->memo);
1607 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1608 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001609
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001610 if (self->proto >= 4) {
1611 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1612 return -1;
1613 return 0;
1614 }
1615 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001616 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001617 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001618 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001619 len = strlen(pdata);
1620 }
1621 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001622 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001623 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001624 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001625 len = 2;
1626 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001627 else if ((size_t)idx <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001628 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001629 pdata[1] = (unsigned char)(idx & 0xff);
1630 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1631 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1632 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001633 len = 5;
1634 }
1635 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001636 PickleState *st = _Pickle_GetGlobalState();
1637 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001638 "memo id too large for LONG_BINPUT");
1639 return -1;
1640 }
1641 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001642 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001643 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001644
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001645 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001646}
1647
1648static PyObject *
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001649get_dotted_path(PyObject *obj, PyObject *name)
1650{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001651 _Py_static_string(PyId_dot, ".");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001652 PyObject *dotted_path;
1653 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001654
1655 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001656 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001657 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001658 n = PyList_GET_SIZE(dotted_path);
1659 assert(n >= 1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001660 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001661 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001662 if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001663 if (obj == NULL)
1664 PyErr_Format(PyExc_AttributeError,
1665 "Can't pickle local object %R", name);
1666 else
1667 PyErr_Format(PyExc_AttributeError,
1668 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001669 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001670 return NULL;
1671 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001672 }
1673 return dotted_path;
1674}
1675
1676static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001677get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001678{
1679 Py_ssize_t i, n;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001680 PyObject *parent = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001681
1682 assert(PyList_CheckExact(names));
1683 Py_INCREF(obj);
1684 n = PyList_GET_SIZE(names);
1685 for (i = 0; i < n; i++) {
1686 PyObject *name = PyList_GET_ITEM(names, i);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001687 Py_XDECREF(parent);
1688 parent = obj;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001689 (void)_PyObject_LookupAttr(parent, name, &obj);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001690 if (obj == NULL) {
1691 Py_DECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001692 return NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001693 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001694 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001695 if (pparent != NULL)
1696 *pparent = parent;
1697 else
1698 Py_XDECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001699 return obj;
1700}
1701
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001702
1703static PyObject *
1704getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1705{
1706 PyObject *dotted_path, *attr;
1707
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001708 if (allow_qualname) {
1709 dotted_path = get_dotted_path(obj, name);
1710 if (dotted_path == NULL)
1711 return NULL;
1712 attr = get_deep_attribute(obj, dotted_path, NULL);
1713 Py_DECREF(dotted_path);
1714 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001715 else {
1716 (void)_PyObject_LookupAttr(obj, name, &attr);
1717 }
1718 if (attr == NULL && !PyErr_Occurred()) {
1719 PyErr_Format(PyExc_AttributeError,
1720 "Can't get attribute %R on %R", name, obj);
1721 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001722 return attr;
1723}
1724
Eric Snow3f9eee62017-09-15 16:35:20 -06001725static int
1726_checkmodule(PyObject *module_name, PyObject *module,
1727 PyObject *global, PyObject *dotted_path)
1728{
1729 if (module == Py_None) {
1730 return -1;
1731 }
1732 if (PyUnicode_Check(module_name) &&
1733 _PyUnicode_EqualToASCIIString(module_name, "__main__")) {
1734 return -1;
1735 }
1736
1737 PyObject *candidate = get_deep_attribute(module, dotted_path, NULL);
1738 if (candidate == NULL) {
Eric Snow3f9eee62017-09-15 16:35:20 -06001739 return -1;
1740 }
1741 if (candidate != global) {
1742 Py_DECREF(candidate);
1743 return -1;
1744 }
1745 Py_DECREF(candidate);
1746 return 0;
1747}
1748
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001749static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001750whichmodule(PyObject *global, PyObject *dotted_path)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001751{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001752 PyObject *module_name;
Eric Snow3f9eee62017-09-15 16:35:20 -06001753 PyObject *module = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001754 Py_ssize_t i;
Eric Snow3f9eee62017-09-15 16:35:20 -06001755 PyObject *modules;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001756 _Py_IDENTIFIER(__module__);
1757 _Py_IDENTIFIER(modules);
1758 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001759
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001760 if (_PyObject_LookupAttrId(global, &PyId___module__, &module_name) < 0) {
1761 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001762 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001763 if (module_name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001764 /* In some rare cases (e.g., bound methods of extension types),
1765 __module__ can be None. If it is so, then search sys.modules for
1766 the module of global. */
1767 if (module_name != Py_None)
1768 return module_name;
1769 Py_CLEAR(module_name);
1770 }
1771 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001772
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001773 /* Fallback on walking sys.modules */
Eric Snow3f9eee62017-09-15 16:35:20 -06001774 modules = _PySys_GetObjectId(&PyId_modules);
1775 if (modules == NULL) {
Victor Stinner1e53bba2013-07-16 22:26:05 +02001776 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001777 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001778 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001779 if (PyDict_CheckExact(modules)) {
1780 i = 0;
1781 while (PyDict_Next(modules, &i, &module_name, &module)) {
1782 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1783 Py_INCREF(module_name);
1784 return module_name;
1785 }
1786 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001787 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001788 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001789 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001790 }
1791 else {
1792 PyObject *iterator = PyObject_GetIter(modules);
1793 if (iterator == NULL) {
1794 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001795 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001796 while ((module_name = PyIter_Next(iterator))) {
1797 module = PyObject_GetItem(modules, module_name);
1798 if (module == NULL) {
1799 Py_DECREF(module_name);
1800 Py_DECREF(iterator);
1801 return NULL;
1802 }
1803 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1804 Py_DECREF(module);
1805 Py_DECREF(iterator);
1806 return module_name;
1807 }
1808 Py_DECREF(module);
1809 Py_DECREF(module_name);
1810 if (PyErr_Occurred()) {
1811 Py_DECREF(iterator);
1812 return NULL;
1813 }
1814 }
1815 Py_DECREF(iterator);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001816 }
1817
1818 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001819 module_name = _PyUnicode_FromId(&PyId___main__);
Victor Stinneraf46eb82017-09-05 23:30:16 +02001820 Py_XINCREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001821 return module_name;
1822}
1823
1824/* fast_save_enter() and fast_save_leave() are guards against recursive
1825 objects when Pickler is used with the "fast mode" (i.e., with object
1826 memoization disabled). If the nesting of a list or dict object exceed
1827 FAST_NESTING_LIMIT, these guards will start keeping an internal
1828 reference to the seen list or dict objects and check whether these objects
1829 are recursive. These are not strictly necessary, since save() has a
1830 hard-coded recursion limit, but they give a nicer error message than the
1831 typical RuntimeError. */
1832static int
1833fast_save_enter(PicklerObject *self, PyObject *obj)
1834{
1835 /* if fast_nesting < 0, we're doing an error exit. */
1836 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1837 PyObject *key = NULL;
1838 if (self->fast_memo == NULL) {
1839 self->fast_memo = PyDict_New();
1840 if (self->fast_memo == NULL) {
1841 self->fast_nesting = -1;
1842 return 0;
1843 }
1844 }
1845 key = PyLong_FromVoidPtr(obj);
Mat Mf76231f2017-11-13 02:50:16 -05001846 if (key == NULL) {
1847 self->fast_nesting = -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001848 return 0;
Mat Mf76231f2017-11-13 02:50:16 -05001849 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001850 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001851 Py_DECREF(key);
1852 PyErr_Format(PyExc_ValueError,
1853 "fast mode: can't pickle cyclic objects "
1854 "including object type %.200s at %p",
1855 obj->ob_type->tp_name, obj);
1856 self->fast_nesting = -1;
1857 return 0;
1858 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001859 if (PyErr_Occurred()) {
Mat Mf76231f2017-11-13 02:50:16 -05001860 Py_DECREF(key);
1861 self->fast_nesting = -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001862 return 0;
1863 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001864 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1865 Py_DECREF(key);
1866 self->fast_nesting = -1;
1867 return 0;
1868 }
1869 Py_DECREF(key);
1870 }
1871 return 1;
1872}
1873
1874static int
1875fast_save_leave(PicklerObject *self, PyObject *obj)
1876{
1877 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1878 PyObject *key = PyLong_FromVoidPtr(obj);
1879 if (key == NULL)
1880 return 0;
1881 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1882 Py_DECREF(key);
1883 return 0;
1884 }
1885 Py_DECREF(key);
1886 }
1887 return 1;
1888}
1889
1890static int
1891save_none(PicklerObject *self, PyObject *obj)
1892{
1893 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001894 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001895 return -1;
1896
1897 return 0;
1898}
1899
1900static int
1901save_bool(PicklerObject *self, PyObject *obj)
1902{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001903 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001904 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001905 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001906 return -1;
1907 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001908 else {
1909 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1910 * so that unpicklers written before bools were introduced unpickle them
1911 * as ints, but unpicklers after can recognize that bools were intended.
1912 * Note that protocol 2 added direct ways to pickle bools.
1913 */
1914 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1915 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1916 return -1;
1917 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001918 return 0;
1919}
1920
1921static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001922save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001923{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001924 PyObject *repr = NULL;
1925 Py_ssize_t size;
1926 long val;
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001927 int overflow;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001928 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001929
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001930 val= PyLong_AsLongAndOverflow(obj, &overflow);
1931 if (!overflow && (sizeof(long) <= 4 ||
1932 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1))))
1933 {
Larry Hastings61272b72014-01-07 12:41:53 -08001934 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001935
1936 Note: we can't use -0x80000000L in the above condition because some
1937 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1938 before applying the unary minus when sizeof(long) <= 4. The
1939 resulting value stays unsigned which is commonly not what we want,
1940 so MSVC happily warns us about it. However, that result would have
1941 been fine because we guard for sizeof(long) <= 4 which turns the
1942 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001943 char pdata[32];
1944 Py_ssize_t len = 0;
1945
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001946 if (self->bin) {
1947 pdata[1] = (unsigned char)(val & 0xff);
1948 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1949 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1950 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001951
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001952 if ((pdata[4] != 0) || (pdata[3] != 0)) {
1953 pdata[0] = BININT;
1954 len = 5;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001955 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001956 else if (pdata[2] != 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001957 pdata[0] = BININT2;
1958 len = 3;
1959 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001960 else {
1961 pdata[0] = BININT1;
1962 len = 2;
1963 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001964 }
1965 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001966 sprintf(pdata, "%c%ld\n", INT, val);
1967 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001968 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001969 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001970 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001971
1972 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001973 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001974 assert(!PyErr_Occurred());
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001975
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001976 if (self->proto >= 2) {
1977 /* Linear-time pickling. */
1978 size_t nbits;
1979 size_t nbytes;
1980 unsigned char *pdata;
1981 char header[5];
1982 int i;
1983 int sign = _PyLong_Sign(obj);
1984
1985 if (sign == 0) {
1986 header[0] = LONG1;
1987 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001988 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001989 goto error;
1990 return 0;
1991 }
1992 nbits = _PyLong_NumBits(obj);
1993 if (nbits == (size_t)-1 && PyErr_Occurred())
1994 goto error;
1995 /* How many bytes do we need? There are nbits >> 3 full
1996 * bytes of data, and nbits & 7 leftover bits. If there
1997 * are any leftover bits, then we clearly need another
1998 * byte. Wnat's not so obvious is that we *probably*
1999 * need another byte even if there aren't any leftovers:
2000 * the most-significant bit of the most-significant byte
2001 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03002002 * opposite of the one we need. The exception is ints
2003 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002004 * its own 256's-complement, so has the right sign bit
2005 * even without the extra byte. That's a pain to check
2006 * for in advance, though, so we always grab an extra
2007 * byte at the start, and cut it back later if possible.
2008 */
2009 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01002010 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002011 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03002012 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002013 goto error;
2014 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002015 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002016 if (repr == NULL)
2017 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002018 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002019 i = _PyLong_AsByteArray((PyLongObject *)obj,
2020 pdata, nbytes,
2021 1 /* little endian */ , 1 /* signed */ );
2022 if (i < 0)
2023 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03002024 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002025 * needed. This is so iff the MSB is all redundant sign
2026 * bits.
2027 */
2028 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02002029 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002030 pdata[nbytes - 1] == 0xff &&
2031 (pdata[nbytes - 2] & 0x80) != 0) {
2032 nbytes--;
2033 }
2034
2035 if (nbytes < 256) {
2036 header[0] = LONG1;
2037 header[1] = (unsigned char)nbytes;
2038 size = 2;
2039 }
2040 else {
2041 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002042 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002043 for (i = 1; i < 5; i++) {
2044 header[i] = (unsigned char)(size & 0xff);
2045 size >>= 8;
2046 }
2047 size = 5;
2048 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002049 if (_Pickler_Write(self, header, size) < 0 ||
2050 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002051 goto error;
2052 }
2053 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002054 const char long_op = LONG;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002055 const char *string;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002056
Mark Dickinson8dd05142009-01-20 20:43:58 +00002057 /* proto < 2: write the repr and newline. This is quadratic-time (in
2058 the number of digits), in both directions. We add a trailing 'L'
2059 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002060
2061 repr = PyObject_Repr(obj);
2062 if (repr == NULL)
2063 goto error;
2064
Serhiy Storchaka06515832016-11-20 09:13:07 +02002065 string = PyUnicode_AsUTF8AndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002066 if (string == NULL)
2067 goto error;
2068
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002069 if (_Pickler_Write(self, &long_op, 1) < 0 ||
2070 _Pickler_Write(self, string, size) < 0 ||
2071 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002072 goto error;
2073 }
2074
2075 if (0) {
2076 error:
2077 status = -1;
2078 }
2079 Py_XDECREF(repr);
2080
2081 return status;
2082}
2083
2084static int
2085save_float(PicklerObject *self, PyObject *obj)
2086{
2087 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
2088
2089 if (self->bin) {
2090 char pdata[9];
2091 pdata[0] = BINFLOAT;
2092 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
2093 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002094 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002095 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02002096 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002097 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00002098 int result = -1;
2099 char *buf = NULL;
2100 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002101
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002102 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002103 goto done;
2104
Serhiy Storchakac86ca262015-02-15 14:18:32 +02002105 buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00002106 if (!buf) {
2107 PyErr_NoMemory();
2108 goto done;
2109 }
2110
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002111 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002112 goto done;
2113
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002114 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002115 goto done;
2116
2117 result = 0;
2118done:
2119 PyMem_Free(buf);
2120 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002121 }
2122
2123 return 0;
2124}
2125
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002126/* Perform direct write of the header and payload of the binary object.
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002127
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002128 The large contiguous data is written directly into the underlying file
2129 object, bypassing the output_buffer of the Pickler. We intentionally
2130 do not insert a protocol 4 frame opcode to make it possible to optimize
2131 file.read calls in the loader.
2132 */
2133static int
2134_Pickler_write_bytes(PicklerObject *self,
2135 const char *header, Py_ssize_t header_size,
2136 const char *data, Py_ssize_t data_size,
2137 PyObject *payload)
2138{
2139 int bypass_buffer = (data_size >= FRAME_SIZE_TARGET);
2140 int framing = self->framing;
2141
2142 if (bypass_buffer) {
2143 assert(self->output_buffer != NULL);
2144 /* Commit the previous frame. */
2145 if (_Pickler_CommitFrame(self)) {
2146 return -1;
2147 }
2148 /* Disable framing temporarily */
2149 self->framing = 0;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002150 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002151
2152 if (_Pickler_Write(self, header, header_size) < 0) {
2153 return -1;
2154 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002155
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002156 if (bypass_buffer && self->write != NULL) {
2157 /* Bypass the in-memory buffer to directly stream large data
2158 into the underlying file object. */
2159 PyObject *result, *mem = NULL;
2160 /* Dump the output buffer to the file. */
2161 if (_Pickler_FlushToFile(self) < 0) {
2162 return -1;
2163 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002164
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002165 /* Stream write the payload into the file without going through the
2166 output buffer. */
2167 if (payload == NULL) {
Serhiy Storchaka5b76bdb2018-01-13 00:28:31 +02002168 /* TODO: It would be better to use a memoryview with a linked
2169 original string if this is possible. */
2170 payload = mem = PyBytes_FromStringAndSize(data, data_size);
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002171 if (payload == NULL) {
2172 return -1;
2173 }
2174 }
2175 result = PyObject_CallFunctionObjArgs(self->write, payload, NULL);
2176 Py_XDECREF(mem);
2177 if (result == NULL) {
2178 return -1;
2179 }
2180 Py_DECREF(result);
2181
2182 /* Reinitialize the buffer for subsequent calls to _Pickler_Write. */
2183 if (_Pickler_ClearBuffer(self) < 0) {
2184 return -1;
2185 }
2186 }
2187 else {
2188 if (_Pickler_Write(self, data, data_size) < 0) {
2189 return -1;
2190 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002191 }
2192
2193 /* Re-enable framing for subsequent calls to _Pickler_Write. */
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002194 self->framing = framing;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002195
2196 return 0;
2197}
2198
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002199static int
2200save_bytes(PicklerObject *self, PyObject *obj)
2201{
2202 if (self->proto < 3) {
2203 /* Older pickle protocols do not have an opcode for pickling bytes
2204 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002205 the __reduce__ method) to permit bytes object unpickling.
2206
2207 Here we use a hack to be compatible with Python 2. Since in Python
2208 2 'bytes' is just an alias for 'str' (which has different
2209 parameters than the actual bytes object), we use codecs.encode
2210 to create the appropriate 'str' object when unpickled using
2211 Python 2 *and* the appropriate 'bytes' object when unpickled
2212 using Python 3. Again this is a hack and we don't need to do this
2213 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002214 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002215 int status;
2216
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002217 if (PyBytes_GET_SIZE(obj) == 0) {
2218 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2219 }
2220 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002221 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002222 PyObject *unicode_str =
2223 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2224 PyBytes_GET_SIZE(obj),
2225 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002226 _Py_IDENTIFIER(latin1);
2227
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002228 if (unicode_str == NULL)
2229 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002230 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002231 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002232 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002233 Py_DECREF(unicode_str);
2234 }
2235
2236 if (reduce_value == NULL)
2237 return -1;
2238
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002239 /* save_reduce() will memoize the object automatically. */
2240 status = save_reduce(self, reduce_value, obj);
2241 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002242 return status;
2243 }
2244 else {
2245 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002246 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002247 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002248
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002249 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002250 if (size < 0)
2251 return -1;
2252
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002253 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002254 header[0] = SHORT_BINBYTES;
2255 header[1] = (unsigned char)size;
2256 len = 2;
2257 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03002258 else if ((size_t)size <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002259 header[0] = BINBYTES;
2260 header[1] = (unsigned char)(size & 0xff);
2261 header[2] = (unsigned char)((size >> 8) & 0xff);
2262 header[3] = (unsigned char)((size >> 16) & 0xff);
2263 header[4] = (unsigned char)((size >> 24) & 0xff);
2264 len = 5;
2265 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002266 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002267 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002268 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002269 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002270 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002271 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002272 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002273 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002274 return -1; /* string too large */
2275 }
2276
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002277 if (_Pickler_write_bytes(self, header, len,
2278 PyBytes_AS_STRING(obj), size, obj) < 0)
2279 {
2280 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002281 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002282
2283 if (memo_put(self, obj) < 0)
2284 return -1;
2285
2286 return 0;
2287 }
2288}
2289
2290/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2291 backslash and newline characters to \uXXXX escapes. */
2292static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002293raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002294{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002295 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002296 Py_ssize_t i, size;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002297 void *data;
2298 unsigned int kind;
Victor Stinner358af132015-10-12 22:36:57 +02002299 _PyBytesWriter writer;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002300
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002301 if (PyUnicode_READY(obj))
2302 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002303
Victor Stinner358af132015-10-12 22:36:57 +02002304 _PyBytesWriter_Init(&writer);
2305
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002306 size = PyUnicode_GET_LENGTH(obj);
2307 data = PyUnicode_DATA(obj);
2308 kind = PyUnicode_KIND(obj);
Victor Stinner121aab42011-09-29 23:40:53 +02002309
Victor Stinner358af132015-10-12 22:36:57 +02002310 p = _PyBytesWriter_Alloc(&writer, size);
2311 if (p == NULL)
2312 goto error;
2313 writer.overallocate = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002314
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002315 for (i=0; i < size; i++) {
2316 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002317 /* Map 32-bit characters to '\Uxxxxxxxx' */
2318 if (ch >= 0x10000) {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002319 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002320 p = _PyBytesWriter_Prepare(&writer, p, 10-1);
2321 if (p == NULL)
2322 goto error;
2323
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002324 *p++ = '\\';
2325 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002326 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2327 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2328 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2329 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2330 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2331 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2332 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2333 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002334 }
Victor Stinner358af132015-10-12 22:36:57 +02002335 /* Map 16-bit characters, '\\' and '\n' to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002336 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002337 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002338 p = _PyBytesWriter_Prepare(&writer, p, 6-1);
2339 if (p == NULL)
2340 goto error;
2341
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002342 *p++ = '\\';
2343 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002344 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2345 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2346 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2347 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002348 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002349 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002350 else
2351 *p++ = (char) ch;
2352 }
Victor Stinner358af132015-10-12 22:36:57 +02002353
2354 return _PyBytesWriter_Finish(&writer, p);
2355
2356error:
2357 _PyBytesWriter_Dealloc(&writer);
2358 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002359}
2360
2361static int
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002362write_unicode_binary(PicklerObject *self, PyObject *obj)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002363{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002364 char header[9];
2365 Py_ssize_t len;
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002366 PyObject *encoded = NULL;
2367 Py_ssize_t size;
2368 const char *data;
2369
2370 if (PyUnicode_READY(obj))
2371 return -1;
2372
2373 data = PyUnicode_AsUTF8AndSize(obj, &size);
2374 if (data == NULL) {
2375 /* Issue #8383: for strings with lone surrogates, fallback on the
2376 "surrogatepass" error handler. */
2377 PyErr_Clear();
2378 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2379 if (encoded == NULL)
2380 return -1;
2381
2382 data = PyBytes_AS_STRING(encoded);
2383 size = PyBytes_GET_SIZE(encoded);
2384 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002385
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002386 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002387 if (size <= 0xff && self->proto >= 4) {
2388 header[0] = SHORT_BINUNICODE;
2389 header[1] = (unsigned char)(size & 0xff);
2390 len = 2;
2391 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002392 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002393 header[0] = BINUNICODE;
2394 header[1] = (unsigned char)(size & 0xff);
2395 header[2] = (unsigned char)((size >> 8) & 0xff);
2396 header[3] = (unsigned char)((size >> 16) & 0xff);
2397 header[4] = (unsigned char)((size >> 24) & 0xff);
2398 len = 5;
2399 }
2400 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002401 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002402 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002403 len = 9;
2404 }
2405 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002406 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002407 "cannot serialize a string larger than 4GiB");
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002408 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002409 return -1;
2410 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002411
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002412 if (_Pickler_write_bytes(self, header, len, data, size, encoded) < 0) {
2413 Py_XDECREF(encoded);
2414 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002415 }
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002416 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002417 return 0;
2418}
2419
2420static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002421save_unicode(PicklerObject *self, PyObject *obj)
2422{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002423 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002424 if (write_unicode_binary(self, obj) < 0)
2425 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002426 }
2427 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002428 PyObject *encoded;
2429 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002430 const char unicode_op = UNICODE;
2431
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002432 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002433 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002434 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002435
Antoine Pitrou299978d2013-04-07 17:38:11 +02002436 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2437 Py_DECREF(encoded);
2438 return -1;
2439 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002440
2441 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002442 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2443 Py_DECREF(encoded);
2444 return -1;
2445 }
2446 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002447
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002448 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002449 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002450 }
2451 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002452 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002453
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002454 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002455}
2456
2457/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2458static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002459store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002460{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002461 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002462
2463 assert(PyTuple_Size(t) == len);
2464
2465 for (i = 0; i < len; i++) {
2466 PyObject *element = PyTuple_GET_ITEM(t, i);
2467
2468 if (element == NULL)
2469 return -1;
2470 if (save(self, element, 0) < 0)
2471 return -1;
2472 }
2473
2474 return 0;
2475}
2476
2477/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2478 * used across protocols to minimize the space needed to pickle them.
2479 * Tuples are also the only builtin immutable type that can be recursive
2480 * (a tuple can be reached from itself), and that requires some subtle
2481 * magic so that it works in all cases. IOW, this is a long routine.
2482 */
2483static int
2484save_tuple(PicklerObject *self, PyObject *obj)
2485{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002486 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002487
2488 const char mark_op = MARK;
2489 const char tuple_op = TUPLE;
2490 const char pop_op = POP;
2491 const char pop_mark_op = POP_MARK;
2492 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2493
2494 if ((len = PyTuple_Size(obj)) < 0)
2495 return -1;
2496
2497 if (len == 0) {
2498 char pdata[2];
2499
2500 if (self->proto) {
2501 pdata[0] = EMPTY_TUPLE;
2502 len = 1;
2503 }
2504 else {
2505 pdata[0] = MARK;
2506 pdata[1] = TUPLE;
2507 len = 2;
2508 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002509 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002510 return -1;
2511 return 0;
2512 }
2513
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002514 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002515 * saving the tuple elements, the tuple must be recursive, in
2516 * which case we'll pop everything we put on the stack, and fetch
2517 * its value from the memo.
2518 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002519 if (len <= 3 && self->proto >= 2) {
2520 /* Use TUPLE{1,2,3} opcodes. */
2521 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002522 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002523
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002524 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002525 /* pop the len elements */
2526 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002527 if (_Pickler_Write(self, &pop_op, 1) < 0)
2528 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002529 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002530 if (memo_get(self, obj) < 0)
2531 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002532
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002533 return 0;
2534 }
2535 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002536 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2537 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002538 }
2539 goto memoize;
2540 }
2541
2542 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2543 * Generate MARK e1 e2 ... TUPLE
2544 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002545 if (_Pickler_Write(self, &mark_op, 1) < 0)
2546 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002547
2548 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002549 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002550
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002551 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002552 /* pop the stack stuff we pushed */
2553 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002554 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2555 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002556 }
2557 else {
2558 /* Note that we pop one more than len, to remove
2559 * the MARK too.
2560 */
2561 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002562 if (_Pickler_Write(self, &pop_op, 1) < 0)
2563 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002564 }
2565 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002566 if (memo_get(self, obj) < 0)
2567 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002568
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002569 return 0;
2570 }
2571 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002572 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2573 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002574 }
2575
2576 memoize:
2577 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002578 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002579
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002580 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002581}
2582
2583/* iter is an iterator giving items, and we batch up chunks of
2584 * MARK item item ... item APPENDS
2585 * opcode sequences. Calling code should have arranged to first create an
2586 * empty list, or list-like object, for the APPENDS to operate on.
2587 * Returns 0 on success, <0 on error.
2588 */
2589static int
2590batch_list(PicklerObject *self, PyObject *iter)
2591{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002592 PyObject *obj = NULL;
2593 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002594 int i, n;
2595
2596 const char mark_op = MARK;
2597 const char append_op = APPEND;
2598 const char appends_op = APPENDS;
2599
2600 assert(iter != NULL);
2601
2602 /* XXX: I think this function could be made faster by avoiding the
2603 iterator interface and fetching objects directly from list using
2604 PyList_GET_ITEM.
2605 */
2606
2607 if (self->proto == 0) {
2608 /* APPENDS isn't available; do one at a time. */
2609 for (;;) {
2610 obj = PyIter_Next(iter);
2611 if (obj == NULL) {
2612 if (PyErr_Occurred())
2613 return -1;
2614 break;
2615 }
2616 i = save(self, obj, 0);
2617 Py_DECREF(obj);
2618 if (i < 0)
2619 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002620 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002621 return -1;
2622 }
2623 return 0;
2624 }
2625
2626 /* proto > 0: write in batches of BATCHSIZE. */
2627 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002628 /* Get first item */
2629 firstitem = PyIter_Next(iter);
2630 if (firstitem == NULL) {
2631 if (PyErr_Occurred())
2632 goto error;
2633
2634 /* nothing more to add */
2635 break;
2636 }
2637
2638 /* Try to get a second item */
2639 obj = PyIter_Next(iter);
2640 if (obj == NULL) {
2641 if (PyErr_Occurred())
2642 goto error;
2643
2644 /* Only one item to write */
2645 if (save(self, firstitem, 0) < 0)
2646 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002647 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002648 goto error;
2649 Py_CLEAR(firstitem);
2650 break;
2651 }
2652
2653 /* More than one item to write */
2654
2655 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002656 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002657 goto error;
2658
2659 if (save(self, firstitem, 0) < 0)
2660 goto error;
2661 Py_CLEAR(firstitem);
2662 n = 1;
2663
2664 /* Fetch and save up to BATCHSIZE items */
2665 while (obj) {
2666 if (save(self, obj, 0) < 0)
2667 goto error;
2668 Py_CLEAR(obj);
2669 n += 1;
2670
2671 if (n == BATCHSIZE)
2672 break;
2673
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002674 obj = PyIter_Next(iter);
2675 if (obj == NULL) {
2676 if (PyErr_Occurred())
2677 goto error;
2678 break;
2679 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002680 }
2681
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002682 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002683 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002684
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002685 } while (n == BATCHSIZE);
2686 return 0;
2687
2688 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002689 Py_XDECREF(firstitem);
2690 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002691 return -1;
2692}
2693
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002694/* This is a variant of batch_list() above, specialized for lists (with no
2695 * support for list subclasses). Like batch_list(), we batch up chunks of
2696 * MARK item item ... item APPENDS
2697 * opcode sequences. Calling code should have arranged to first create an
2698 * empty list, or list-like object, for the APPENDS to operate on.
2699 * Returns 0 on success, -1 on error.
2700 *
2701 * This version is considerably faster than batch_list(), if less general.
2702 *
2703 * Note that this only works for protocols > 0.
2704 */
2705static int
2706batch_list_exact(PicklerObject *self, PyObject *obj)
2707{
2708 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002709 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002710
2711 const char append_op = APPEND;
2712 const char appends_op = APPENDS;
2713 const char mark_op = MARK;
2714
2715 assert(obj != NULL);
2716 assert(self->proto > 0);
2717 assert(PyList_CheckExact(obj));
2718
2719 if (PyList_GET_SIZE(obj) == 1) {
2720 item = PyList_GET_ITEM(obj, 0);
2721 if (save(self, item, 0) < 0)
2722 return -1;
2723 if (_Pickler_Write(self, &append_op, 1) < 0)
2724 return -1;
2725 return 0;
2726 }
2727
2728 /* Write in batches of BATCHSIZE. */
2729 total = 0;
2730 do {
2731 this_batch = 0;
2732 if (_Pickler_Write(self, &mark_op, 1) < 0)
2733 return -1;
2734 while (total < PyList_GET_SIZE(obj)) {
2735 item = PyList_GET_ITEM(obj, total);
2736 if (save(self, item, 0) < 0)
2737 return -1;
2738 total++;
2739 if (++this_batch == BATCHSIZE)
2740 break;
2741 }
2742 if (_Pickler_Write(self, &appends_op, 1) < 0)
2743 return -1;
2744
2745 } while (total < PyList_GET_SIZE(obj));
2746
2747 return 0;
2748}
2749
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002750static int
2751save_list(PicklerObject *self, PyObject *obj)
2752{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002753 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002754 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002755 int status = 0;
2756
2757 if (self->fast && !fast_save_enter(self, obj))
2758 goto error;
2759
2760 /* Create an empty list. */
2761 if (self->bin) {
2762 header[0] = EMPTY_LIST;
2763 len = 1;
2764 }
2765 else {
2766 header[0] = MARK;
2767 header[1] = LIST;
2768 len = 2;
2769 }
2770
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002771 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002772 goto error;
2773
2774 /* Get list length, and bow out early if empty. */
2775 if ((len = PyList_Size(obj)) < 0)
2776 goto error;
2777
2778 if (memo_put(self, obj) < 0)
2779 goto error;
2780
2781 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002782 /* Materialize the list elements. */
2783 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002784 if (Py_EnterRecursiveCall(" while pickling an object"))
2785 goto error;
2786 status = batch_list_exact(self, obj);
2787 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002788 } else {
2789 PyObject *iter = PyObject_GetIter(obj);
2790 if (iter == NULL)
2791 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002792
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002793 if (Py_EnterRecursiveCall(" while pickling an object")) {
2794 Py_DECREF(iter);
2795 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002796 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002797 status = batch_list(self, iter);
2798 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002799 Py_DECREF(iter);
2800 }
2801 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002802 if (0) {
2803 error:
2804 status = -1;
2805 }
2806
2807 if (self->fast && !fast_save_leave(self, obj))
2808 status = -1;
2809
2810 return status;
2811}
2812
2813/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2814 * MARK key value ... key value SETITEMS
2815 * opcode sequences. Calling code should have arranged to first create an
2816 * empty dict, or dict-like object, for the SETITEMS to operate on.
2817 * Returns 0 on success, <0 on error.
2818 *
2819 * This is very much like batch_list(). The difference between saving
2820 * elements directly, and picking apart two-tuples, is so long-winded at
2821 * the C level, though, that attempts to combine these routines were too
2822 * ugly to bear.
2823 */
2824static int
2825batch_dict(PicklerObject *self, PyObject *iter)
2826{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002827 PyObject *obj = NULL;
2828 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002829 int i, n;
2830
2831 const char mark_op = MARK;
2832 const char setitem_op = SETITEM;
2833 const char setitems_op = SETITEMS;
2834
2835 assert(iter != NULL);
2836
2837 if (self->proto == 0) {
2838 /* SETITEMS isn't available; do one at a time. */
2839 for (;;) {
2840 obj = PyIter_Next(iter);
2841 if (obj == NULL) {
2842 if (PyErr_Occurred())
2843 return -1;
2844 break;
2845 }
2846 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2847 PyErr_SetString(PyExc_TypeError, "dict items "
2848 "iterator must return 2-tuples");
2849 return -1;
2850 }
2851 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2852 if (i >= 0)
2853 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2854 Py_DECREF(obj);
2855 if (i < 0)
2856 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002857 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002858 return -1;
2859 }
2860 return 0;
2861 }
2862
2863 /* proto > 0: write in batches of BATCHSIZE. */
2864 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002865 /* Get first item */
2866 firstitem = PyIter_Next(iter);
2867 if (firstitem == NULL) {
2868 if (PyErr_Occurred())
2869 goto error;
2870
2871 /* nothing more to add */
2872 break;
2873 }
2874 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2875 PyErr_SetString(PyExc_TypeError, "dict items "
2876 "iterator must return 2-tuples");
2877 goto error;
2878 }
2879
2880 /* Try to get a second item */
2881 obj = PyIter_Next(iter);
2882 if (obj == NULL) {
2883 if (PyErr_Occurred())
2884 goto error;
2885
2886 /* Only one item to write */
2887 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2888 goto error;
2889 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2890 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002891 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002892 goto error;
2893 Py_CLEAR(firstitem);
2894 break;
2895 }
2896
2897 /* More than one item to write */
2898
2899 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002900 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002901 goto error;
2902
2903 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2904 goto error;
2905 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2906 goto error;
2907 Py_CLEAR(firstitem);
2908 n = 1;
2909
2910 /* Fetch and save up to BATCHSIZE items */
2911 while (obj) {
2912 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2913 PyErr_SetString(PyExc_TypeError, "dict items "
2914 "iterator must return 2-tuples");
2915 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002916 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002917 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2918 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2919 goto error;
2920 Py_CLEAR(obj);
2921 n += 1;
2922
2923 if (n == BATCHSIZE)
2924 break;
2925
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002926 obj = PyIter_Next(iter);
2927 if (obj == NULL) {
2928 if (PyErr_Occurred())
2929 goto error;
2930 break;
2931 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002932 }
2933
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002934 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002935 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002936
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002937 } while (n == BATCHSIZE);
2938 return 0;
2939
2940 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002941 Py_XDECREF(firstitem);
2942 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002943 return -1;
2944}
2945
Collin Winter5c9b02d2009-05-25 05:43:30 +00002946/* This is a variant of batch_dict() above that specializes for dicts, with no
2947 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2948 * MARK key value ... key value SETITEMS
2949 * opcode sequences. Calling code should have arranged to first create an
2950 * empty dict, or dict-like object, for the SETITEMS to operate on.
2951 * Returns 0 on success, -1 on error.
2952 *
2953 * Note that this currently doesn't work for protocol 0.
2954 */
2955static int
2956batch_dict_exact(PicklerObject *self, PyObject *obj)
2957{
2958 PyObject *key = NULL, *value = NULL;
2959 int i;
2960 Py_ssize_t dict_size, ppos = 0;
2961
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002962 const char mark_op = MARK;
2963 const char setitem_op = SETITEM;
2964 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002965
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002966 assert(obj != NULL && PyDict_CheckExact(obj));
Collin Winter5c9b02d2009-05-25 05:43:30 +00002967 assert(self->proto > 0);
2968
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002969 dict_size = PyDict_GET_SIZE(obj);
Collin Winter5c9b02d2009-05-25 05:43:30 +00002970
2971 /* Special-case len(d) == 1 to save space. */
2972 if (dict_size == 1) {
2973 PyDict_Next(obj, &ppos, &key, &value);
2974 if (save(self, key, 0) < 0)
2975 return -1;
2976 if (save(self, value, 0) < 0)
2977 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002978 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002979 return -1;
2980 return 0;
2981 }
2982
2983 /* Write in batches of BATCHSIZE. */
2984 do {
2985 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002986 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002987 return -1;
2988 while (PyDict_Next(obj, &ppos, &key, &value)) {
2989 if (save(self, key, 0) < 0)
2990 return -1;
2991 if (save(self, value, 0) < 0)
2992 return -1;
2993 if (++i == BATCHSIZE)
2994 break;
2995 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002996 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002997 return -1;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002998 if (PyDict_GET_SIZE(obj) != dict_size) {
Collin Winter5c9b02d2009-05-25 05:43:30 +00002999 PyErr_Format(
3000 PyExc_RuntimeError,
3001 "dictionary changed size during iteration");
3002 return -1;
3003 }
3004
3005 } while (i == BATCHSIZE);
3006 return 0;
3007}
3008
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003009static int
3010save_dict(PicklerObject *self, PyObject *obj)
3011{
3012 PyObject *items, *iter;
3013 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003014 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003015 int status = 0;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003016 assert(PyDict_Check(obj));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003017
3018 if (self->fast && !fast_save_enter(self, obj))
3019 goto error;
3020
3021 /* Create an empty dict. */
3022 if (self->bin) {
3023 header[0] = EMPTY_DICT;
3024 len = 1;
3025 }
3026 else {
3027 header[0] = MARK;
3028 header[1] = DICT;
3029 len = 2;
3030 }
3031
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003032 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003033 goto error;
3034
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003035 if (memo_put(self, obj) < 0)
3036 goto error;
3037
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003038 if (PyDict_GET_SIZE(obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003039 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00003040 if (PyDict_CheckExact(obj) && self->proto > 0) {
3041 /* We can take certain shortcuts if we know this is a dict and
3042 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003043 if (Py_EnterRecursiveCall(" while pickling an object"))
3044 goto error;
3045 status = batch_dict_exact(self, obj);
3046 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003047 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003048 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003049
Victor Stinnerad8c83a2016-09-05 17:53:15 -07003050 items = _PyObject_CallMethodId(obj, &PyId_items, NULL);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003051 if (items == NULL)
3052 goto error;
3053 iter = PyObject_GetIter(items);
3054 Py_DECREF(items);
3055 if (iter == NULL)
3056 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003057 if (Py_EnterRecursiveCall(" while pickling an object")) {
3058 Py_DECREF(iter);
3059 goto error;
3060 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00003061 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003062 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003063 Py_DECREF(iter);
3064 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003065 }
3066
3067 if (0) {
3068 error:
3069 status = -1;
3070 }
3071
3072 if (self->fast && !fast_save_leave(self, obj))
3073 status = -1;
3074
3075 return status;
3076}
3077
3078static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003079save_set(PicklerObject *self, PyObject *obj)
3080{
3081 PyObject *item;
3082 int i;
3083 Py_ssize_t set_size, ppos = 0;
3084 Py_hash_t hash;
3085
3086 const char empty_set_op = EMPTY_SET;
3087 const char mark_op = MARK;
3088 const char additems_op = ADDITEMS;
3089
3090 if (self->proto < 4) {
3091 PyObject *items;
3092 PyObject *reduce_value;
3093 int status;
3094
3095 items = PySequence_List(obj);
3096 if (items == NULL) {
3097 return -1;
3098 }
3099 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
3100 Py_DECREF(items);
3101 if (reduce_value == NULL) {
3102 return -1;
3103 }
3104 /* save_reduce() will memoize the object automatically. */
3105 status = save_reduce(self, reduce_value, obj);
3106 Py_DECREF(reduce_value);
3107 return status;
3108 }
3109
3110 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
3111 return -1;
3112
3113 if (memo_put(self, obj) < 0)
3114 return -1;
3115
3116 set_size = PySet_GET_SIZE(obj);
3117 if (set_size == 0)
3118 return 0; /* nothing to do */
3119
3120 /* Write in batches of BATCHSIZE. */
3121 do {
3122 i = 0;
3123 if (_Pickler_Write(self, &mark_op, 1) < 0)
3124 return -1;
3125 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
3126 if (save(self, item, 0) < 0)
3127 return -1;
3128 if (++i == BATCHSIZE)
3129 break;
3130 }
3131 if (_Pickler_Write(self, &additems_op, 1) < 0)
3132 return -1;
3133 if (PySet_GET_SIZE(obj) != set_size) {
3134 PyErr_Format(
3135 PyExc_RuntimeError,
3136 "set changed size during iteration");
3137 return -1;
3138 }
3139 } while (i == BATCHSIZE);
3140
3141 return 0;
3142}
3143
3144static int
3145save_frozenset(PicklerObject *self, PyObject *obj)
3146{
3147 PyObject *iter;
3148
3149 const char mark_op = MARK;
3150 const char frozenset_op = FROZENSET;
3151
3152 if (self->fast && !fast_save_enter(self, obj))
3153 return -1;
3154
3155 if (self->proto < 4) {
3156 PyObject *items;
3157 PyObject *reduce_value;
3158 int status;
3159
3160 items = PySequence_List(obj);
3161 if (items == NULL) {
3162 return -1;
3163 }
3164 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
3165 items);
3166 Py_DECREF(items);
3167 if (reduce_value == NULL) {
3168 return -1;
3169 }
3170 /* save_reduce() will memoize the object automatically. */
3171 status = save_reduce(self, reduce_value, obj);
3172 Py_DECREF(reduce_value);
3173 return status;
3174 }
3175
3176 if (_Pickler_Write(self, &mark_op, 1) < 0)
3177 return -1;
3178
3179 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003180 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01003181 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003182 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003183 for (;;) {
3184 PyObject *item;
3185
3186 item = PyIter_Next(iter);
3187 if (item == NULL) {
3188 if (PyErr_Occurred()) {
3189 Py_DECREF(iter);
3190 return -1;
3191 }
3192 break;
3193 }
3194 if (save(self, item, 0) < 0) {
3195 Py_DECREF(item);
3196 Py_DECREF(iter);
3197 return -1;
3198 }
3199 Py_DECREF(item);
3200 }
3201 Py_DECREF(iter);
3202
3203 /* If the object is already in the memo, this means it is
3204 recursive. In this case, throw away everything we put on the
3205 stack, and fetch the object back from the memo. */
3206 if (PyMemoTable_Get(self->memo, obj)) {
3207 const char pop_mark_op = POP_MARK;
3208
3209 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3210 return -1;
3211 if (memo_get(self, obj) < 0)
3212 return -1;
3213 return 0;
3214 }
3215
3216 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3217 return -1;
3218 if (memo_put(self, obj) < 0)
3219 return -1;
3220
3221 return 0;
3222}
3223
3224static int
3225fix_imports(PyObject **module_name, PyObject **global_name)
3226{
3227 PyObject *key;
3228 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003229 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003230
3231 key = PyTuple_Pack(2, *module_name, *global_name);
3232 if (key == NULL)
3233 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003234 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003235 Py_DECREF(key);
3236 if (item) {
3237 PyObject *fixed_module_name;
3238 PyObject *fixed_global_name;
3239
3240 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3241 PyErr_Format(PyExc_RuntimeError,
3242 "_compat_pickle.REVERSE_NAME_MAPPING values "
3243 "should be 2-tuples, not %.200s",
3244 Py_TYPE(item)->tp_name);
3245 return -1;
3246 }
3247 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3248 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3249 if (!PyUnicode_Check(fixed_module_name) ||
3250 !PyUnicode_Check(fixed_global_name)) {
3251 PyErr_Format(PyExc_RuntimeError,
3252 "_compat_pickle.REVERSE_NAME_MAPPING values "
3253 "should be pairs of str, not (%.200s, %.200s)",
3254 Py_TYPE(fixed_module_name)->tp_name,
3255 Py_TYPE(fixed_global_name)->tp_name);
3256 return -1;
3257 }
3258
3259 Py_CLEAR(*module_name);
3260 Py_CLEAR(*global_name);
3261 Py_INCREF(fixed_module_name);
3262 Py_INCREF(fixed_global_name);
3263 *module_name = fixed_module_name;
3264 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003265 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003266 }
3267 else if (PyErr_Occurred()) {
3268 return -1;
3269 }
3270
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003271 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003272 if (item) {
3273 if (!PyUnicode_Check(item)) {
3274 PyErr_Format(PyExc_RuntimeError,
3275 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3276 "should be strings, not %.200s",
3277 Py_TYPE(item)->tp_name);
3278 return -1;
3279 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003280 Py_INCREF(item);
Serhiy Storchaka48842712016-04-06 09:45:48 +03003281 Py_XSETREF(*module_name, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003282 }
3283 else if (PyErr_Occurred()) {
3284 return -1;
3285 }
3286
3287 return 0;
3288}
3289
3290static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003291save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3292{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003293 PyObject *global_name = NULL;
3294 PyObject *module_name = NULL;
3295 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003296 PyObject *parent = NULL;
3297 PyObject *dotted_path = NULL;
3298 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003299 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003300 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003301 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003302 _Py_IDENTIFIER(__name__);
3303 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003304
3305 const char global_op = GLOBAL;
3306
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003307 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003308 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003309 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003310 }
3311 else {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003312 if (_PyObject_LookupAttrId(obj, &PyId___qualname__, &global_name) < 0)
3313 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003314 if (global_name == NULL) {
3315 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3316 if (global_name == NULL)
3317 goto error;
3318 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003319 }
3320
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003321 dotted_path = get_dotted_path(module, global_name);
3322 if (dotted_path == NULL)
3323 goto error;
3324 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003325 if (module_name == NULL)
3326 goto error;
3327
3328 /* XXX: Change to use the import C API directly with level=0 to disallow
3329 relative imports.
3330
3331 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3332 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3333 custom import functions (IMHO, this would be a nice security
3334 feature). The import C API would need to be extended to support the
3335 extra parameters of __import__ to fix that. */
3336 module = PyImport_Import(module_name);
3337 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003338 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003339 "Can't pickle %R: import of module %R failed",
3340 obj, module_name);
3341 goto error;
3342 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003343 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3344 Py_INCREF(lastname);
3345 cls = get_deep_attribute(module, dotted_path, &parent);
3346 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003347 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003348 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003349 "Can't pickle %R: attribute lookup %S on %S failed",
3350 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003351 goto error;
3352 }
3353 if (cls != obj) {
3354 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003355 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003356 "Can't pickle %R: it's not the same object as %S.%S",
3357 obj, module_name, global_name);
3358 goto error;
3359 }
3360 Py_DECREF(cls);
3361
3362 if (self->proto >= 2) {
3363 /* See whether this is in the extension registry, and if
3364 * so generate an EXT opcode.
3365 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003366 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003367 PyObject *code_obj; /* extension code as Python object */
3368 long code; /* extension code as C value */
3369 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003370 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003371
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003372 extension_key = PyTuple_Pack(2, module_name, global_name);
3373 if (extension_key == NULL) {
3374 goto error;
3375 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003376 code_obj = PyDict_GetItemWithError(st->extension_registry,
3377 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003378 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003379 /* The object is not registered in the extension registry.
3380 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003381 if (code_obj == NULL) {
3382 if (PyErr_Occurred()) {
3383 goto error;
3384 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003385 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003386 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003387
3388 /* XXX: pickle.py doesn't check neither the type, nor the range
3389 of the value returned by the extension_registry. It should for
3390 consistency. */
3391
3392 /* Verify code_obj has the right type and value. */
3393 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003394 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003395 "Can't pickle %R: extension code %R isn't an integer",
3396 obj, code_obj);
3397 goto error;
3398 }
3399 code = PyLong_AS_LONG(code_obj);
3400 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003401 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003402 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3403 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003404 goto error;
3405 }
3406
3407 /* Generate an EXT opcode. */
3408 if (code <= 0xff) {
3409 pdata[0] = EXT1;
3410 pdata[1] = (unsigned char)code;
3411 n = 2;
3412 }
3413 else if (code <= 0xffff) {
3414 pdata[0] = EXT2;
3415 pdata[1] = (unsigned char)(code & 0xff);
3416 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3417 n = 3;
3418 }
3419 else {
3420 pdata[0] = EXT4;
3421 pdata[1] = (unsigned char)(code & 0xff);
3422 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3423 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3424 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3425 n = 5;
3426 }
3427
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003428 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003429 goto error;
3430 }
3431 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003432 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003433 if (parent == module) {
3434 Py_INCREF(lastname);
3435 Py_DECREF(global_name);
3436 global_name = lastname;
3437 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003438 if (self->proto >= 4) {
3439 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003440
Christian Heimese8b1ba12013-11-23 21:13:39 +01003441 if (save(self, module_name, 0) < 0)
3442 goto error;
3443 if (save(self, global_name, 0) < 0)
3444 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003445
3446 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3447 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003448 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003449 else if (parent != module) {
3450 PickleState *st = _Pickle_GetGlobalState();
3451 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3452 st->getattr, parent, lastname);
3453 status = save_reduce(self, reduce_value, NULL);
3454 Py_DECREF(reduce_value);
3455 if (status < 0)
3456 goto error;
3457 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003458 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003459 /* Generate a normal global opcode if we are using a pickle
3460 protocol < 4, or if the object is not registered in the
3461 extension registry. */
3462 PyObject *encoded;
3463 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003464
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003465 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003466 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003467
3468 /* For protocol < 3 and if the user didn't request against doing
3469 so, we convert module names to the old 2.x module names. */
3470 if (self->proto < 3 && self->fix_imports) {
3471 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003472 goto error;
3473 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003474 }
3475
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003476 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3477 both the module name and the global name using UTF-8. We do so
3478 only when we are using the pickle protocol newer than version
3479 3. This is to ensure compatibility with older Unpickler running
3480 on Python 2.x. */
3481 if (self->proto == 3) {
3482 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003483 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003484 else {
3485 unicode_encoder = PyUnicode_AsASCIIString;
3486 }
3487 encoded = unicode_encoder(module_name);
3488 if (encoded == NULL) {
3489 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003490 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003491 "can't pickle module identifier '%S' using "
3492 "pickle protocol %i",
3493 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003494 goto error;
3495 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003496 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3497 PyBytes_GET_SIZE(encoded)) < 0) {
3498 Py_DECREF(encoded);
3499 goto error;
3500 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003501 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003502 if(_Pickler_Write(self, "\n", 1) < 0)
3503 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003504
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003505 /* Save the name of the module. */
3506 encoded = unicode_encoder(global_name);
3507 if (encoded == NULL) {
3508 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003509 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003510 "can't pickle global identifier '%S' using "
3511 "pickle protocol %i",
3512 global_name, self->proto);
3513 goto error;
3514 }
3515 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3516 PyBytes_GET_SIZE(encoded)) < 0) {
3517 Py_DECREF(encoded);
3518 goto error;
3519 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003520 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003521 if (_Pickler_Write(self, "\n", 1) < 0)
3522 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003523 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003524 /* Memoize the object. */
3525 if (memo_put(self, obj) < 0)
3526 goto error;
3527 }
3528
3529 if (0) {
3530 error:
3531 status = -1;
3532 }
3533 Py_XDECREF(module_name);
3534 Py_XDECREF(global_name);
3535 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003536 Py_XDECREF(parent);
3537 Py_XDECREF(dotted_path);
3538 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003539
3540 return status;
3541}
3542
3543static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003544save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3545{
3546 PyObject *reduce_value;
3547 int status;
3548
3549 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3550 if (reduce_value == NULL) {
3551 return -1;
3552 }
3553 status = save_reduce(self, reduce_value, obj);
3554 Py_DECREF(reduce_value);
3555 return status;
3556}
3557
3558static int
3559save_type(PicklerObject *self, PyObject *obj)
3560{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003561 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003562 return save_singleton_type(self, obj, Py_None);
3563 }
3564 else if (obj == (PyObject *)&PyEllipsis_Type) {
3565 return save_singleton_type(self, obj, Py_Ellipsis);
3566 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003567 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003568 return save_singleton_type(self, obj, Py_NotImplemented);
3569 }
3570 return save_global(self, obj, NULL);
3571}
3572
3573static int
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003574save_pers(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003575{
3576 PyObject *pid = NULL;
3577 int status = 0;
3578
3579 const char persid_op = PERSID;
3580 const char binpersid_op = BINPERSID;
3581
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003582 pid = call_method(self->pers_func, self->pers_func_self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003583 if (pid == NULL)
3584 return -1;
3585
3586 if (pid != Py_None) {
3587 if (self->bin) {
3588 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003589 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003590 goto error;
3591 }
3592 else {
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003593 PyObject *pid_str;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003594
3595 pid_str = PyObject_Str(pid);
3596 if (pid_str == NULL)
3597 goto error;
3598
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003599 /* XXX: Should it check whether the pid contains embedded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003600 newlines? */
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003601 if (!PyUnicode_IS_ASCII(pid_str)) {
3602 PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
3603 "persistent IDs in protocol 0 must be "
3604 "ASCII strings");
3605 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003606 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003607 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003608
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003609 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003610 _Pickler_Write(self, PyUnicode_DATA(pid_str),
3611 PyUnicode_GET_LENGTH(pid_str)) < 0 ||
3612 _Pickler_Write(self, "\n", 1) < 0) {
3613 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003614 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003615 }
3616 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003617 }
3618 status = 1;
3619 }
3620
3621 if (0) {
3622 error:
3623 status = -1;
3624 }
3625 Py_XDECREF(pid);
3626
3627 return status;
3628}
3629
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003630static PyObject *
3631get_class(PyObject *obj)
3632{
3633 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003634 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003635
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003636 if (_PyObject_LookupAttrId(obj, &PyId___class__, &cls) == 0) {
3637 cls = (PyObject *) Py_TYPE(obj);
3638 Py_INCREF(cls);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003639 }
3640 return cls;
3641}
3642
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003643/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3644 * appropriate __reduce__ method for obj.
3645 */
3646static int
3647save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3648{
3649 PyObject *callable;
3650 PyObject *argtup;
3651 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003652 PyObject *listitems = Py_None;
3653 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003654 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003655 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003656 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003657
3658 const char reduce_op = REDUCE;
3659 const char build_op = BUILD;
3660 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003661 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003662
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003663 size = PyTuple_Size(args);
3664 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003665 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003666 "__reduce__ must contain 2 through 5 elements");
3667 return -1;
3668 }
3669
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003670 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3671 &callable, &argtup, &state, &listitems, &dictitems))
3672 return -1;
3673
3674 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003675 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003676 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003677 return -1;
3678 }
3679 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003680 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003681 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003682 return -1;
3683 }
3684
3685 if (state == Py_None)
3686 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003687
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003688 if (listitems == Py_None)
3689 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003690 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003691 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003692 "returned by __reduce__ must be an iterator, not %s",
3693 Py_TYPE(listitems)->tp_name);
3694 return -1;
3695 }
3696
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003697 if (dictitems == Py_None)
3698 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003699 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003700 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003701 "returned by __reduce__ must be an iterator, not %s",
3702 Py_TYPE(dictitems)->tp_name);
3703 return -1;
3704 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003705
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003706 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003707 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003708 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003709
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003710 if (_PyObject_LookupAttrId(callable, &PyId___name__, &name) < 0) {
3711 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003712 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003713 if (name != NULL && PyUnicode_Check(name)) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003714 _Py_IDENTIFIER(__newobj_ex__);
Serhiy Storchakaf0f35a62017-01-09 10:09:43 +02003715 use_newobj_ex = _PyUnicode_EqualToASCIIId(
3716 name, &PyId___newobj_ex__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003717 if (!use_newobj_ex) {
3718 _Py_IDENTIFIER(__newobj__);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02003719 use_newobj = _PyUnicode_EqualToASCIIId(name, &PyId___newobj__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003720 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003721 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003722 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003723 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003724
3725 if (use_newobj_ex) {
3726 PyObject *cls;
3727 PyObject *args;
3728 PyObject *kwargs;
3729
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003730 if (PyTuple_GET_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003731 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003732 "length of the NEWOBJ_EX argument tuple must be "
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003733 "exactly 3, not %zd", PyTuple_GET_SIZE(argtup));
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003734 return -1;
3735 }
3736
3737 cls = PyTuple_GET_ITEM(argtup, 0);
3738 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003739 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003740 "first item from NEWOBJ_EX argument tuple must "
3741 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3742 return -1;
3743 }
3744 args = PyTuple_GET_ITEM(argtup, 1);
3745 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003746 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003747 "second item from NEWOBJ_EX argument tuple must "
3748 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3749 return -1;
3750 }
3751 kwargs = PyTuple_GET_ITEM(argtup, 2);
3752 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003753 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003754 "third item from NEWOBJ_EX argument tuple must "
3755 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3756 return -1;
3757 }
3758
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003759 if (self->proto >= 4) {
3760 if (save(self, cls, 0) < 0 ||
3761 save(self, args, 0) < 0 ||
3762 save(self, kwargs, 0) < 0 ||
3763 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3764 return -1;
3765 }
3766 }
3767 else {
3768 PyObject *newargs;
3769 PyObject *cls_new;
3770 Py_ssize_t i;
3771 _Py_IDENTIFIER(__new__);
3772
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003773 newargs = PyTuple_New(PyTuple_GET_SIZE(args) + 2);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003774 if (newargs == NULL)
3775 return -1;
3776
3777 cls_new = _PyObject_GetAttrId(cls, &PyId___new__);
3778 if (cls_new == NULL) {
3779 Py_DECREF(newargs);
3780 return -1;
3781 }
3782 PyTuple_SET_ITEM(newargs, 0, cls_new);
3783 Py_INCREF(cls);
3784 PyTuple_SET_ITEM(newargs, 1, cls);
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003785 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003786 PyObject *item = PyTuple_GET_ITEM(args, i);
3787 Py_INCREF(item);
3788 PyTuple_SET_ITEM(newargs, i + 2, item);
3789 }
3790
3791 callable = PyObject_Call(st->partial, newargs, kwargs);
3792 Py_DECREF(newargs);
3793 if (callable == NULL)
3794 return -1;
3795
3796 newargs = PyTuple_New(0);
3797 if (newargs == NULL) {
3798 Py_DECREF(callable);
3799 return -1;
3800 }
3801
3802 if (save(self, callable, 0) < 0 ||
3803 save(self, newargs, 0) < 0 ||
3804 _Pickler_Write(self, &reduce_op, 1) < 0) {
3805 Py_DECREF(newargs);
3806 Py_DECREF(callable);
3807 return -1;
3808 }
3809 Py_DECREF(newargs);
3810 Py_DECREF(callable);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003811 }
3812 }
3813 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003814 PyObject *cls;
3815 PyObject *newargtup;
3816 PyObject *obj_class;
3817 int p;
3818
3819 /* Sanity checks. */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003820 if (PyTuple_GET_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003821 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003822 return -1;
3823 }
3824
3825 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003826 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003827 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003828 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003829 return -1;
3830 }
3831
3832 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003833 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003834 p = obj_class != cls; /* true iff a problem */
3835 Py_DECREF(obj_class);
3836 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003837 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003838 "__newobj__ args has the wrong class");
3839 return -1;
3840 }
3841 }
3842 /* XXX: These calls save() are prone to infinite recursion. Imagine
3843 what happen if the value returned by the __reduce__() method of
3844 some extension type contains another object of the same type. Ouch!
3845
3846 Here is a quick example, that I ran into, to illustrate what I
3847 mean:
3848
3849 >>> import pickle, copyreg
3850 >>> copyreg.dispatch_table.pop(complex)
3851 >>> pickle.dumps(1+2j)
3852 Traceback (most recent call last):
3853 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04003854 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003855
3856 Removing the complex class from copyreg.dispatch_table made the
3857 __reduce_ex__() method emit another complex object:
3858
3859 >>> (1+1j).__reduce_ex__(2)
3860 (<function __newobj__ at 0xb7b71c3c>,
3861 (<class 'complex'>, (1+1j)), None, None, None)
3862
3863 Thus when save() was called on newargstup (the 2nd item) recursion
3864 ensued. Of course, the bug was in the complex class which had a
3865 broken __getnewargs__() that emitted another complex object. But,
3866 the point, here, is it is quite easy to end up with a broken reduce
3867 function. */
3868
3869 /* Save the class and its __new__ arguments. */
3870 if (save(self, cls, 0) < 0)
3871 return -1;
3872
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003873 newargtup = PyTuple_GetSlice(argtup, 1, PyTuple_GET_SIZE(argtup));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003874 if (newargtup == NULL)
3875 return -1;
3876
3877 p = save(self, newargtup, 0);
3878 Py_DECREF(newargtup);
3879 if (p < 0)
3880 return -1;
3881
3882 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003883 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003884 return -1;
3885 }
3886 else { /* Not using NEWOBJ. */
3887 if (save(self, callable, 0) < 0 ||
3888 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003889 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003890 return -1;
3891 }
3892
3893 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3894 the caller do not want to memoize the object. Not particularly useful,
3895 but that is to mimic the behavior save_reduce() in pickle.py when
3896 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003897 if (obj != NULL) {
3898 /* If the object is already in the memo, this means it is
3899 recursive. In this case, throw away everything we put on the
3900 stack, and fetch the object back from the memo. */
3901 if (PyMemoTable_Get(self->memo, obj)) {
3902 const char pop_op = POP;
3903
3904 if (_Pickler_Write(self, &pop_op, 1) < 0)
3905 return -1;
3906 if (memo_get(self, obj) < 0)
3907 return -1;
3908
3909 return 0;
3910 }
3911 else if (memo_put(self, obj) < 0)
3912 return -1;
3913 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003914
3915 if (listitems && batch_list(self, listitems) < 0)
3916 return -1;
3917
3918 if (dictitems && batch_dict(self, dictitems) < 0)
3919 return -1;
3920
3921 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003922 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003923 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003924 return -1;
3925 }
3926
3927 return 0;
3928}
3929
3930static int
3931save(PicklerObject *self, PyObject *obj, int pers_save)
3932{
3933 PyTypeObject *type;
3934 PyObject *reduce_func = NULL;
3935 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003936 int status = 0;
3937
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003938 if (_Pickler_OpcodeBoundary(self) < 0)
3939 return -1;
3940
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003941 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003942 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003943
3944 /* The extra pers_save argument is necessary to avoid calling save_pers()
3945 on its returned object. */
3946 if (!pers_save && self->pers_func) {
3947 /* save_pers() returns:
3948 -1 to signal an error;
3949 0 if it did nothing successfully;
3950 1 if a persistent id was saved.
3951 */
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003952 if ((status = save_pers(self, obj)) != 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003953 goto done;
3954 }
3955
3956 type = Py_TYPE(obj);
3957
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003958 /* The old cPickle had an optimization that used switch-case statement
3959 dispatching on the first letter of the type name. This has was removed
3960 since benchmarks shown that this optimization was actually slowing
3961 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003962
3963 /* Atom types; these aren't memoized, so don't check the memo. */
3964
3965 if (obj == Py_None) {
3966 status = save_none(self, obj);
3967 goto done;
3968 }
3969 else if (obj == Py_False || obj == Py_True) {
3970 status = save_bool(self, obj);
3971 goto done;
3972 }
3973 else if (type == &PyLong_Type) {
3974 status = save_long(self, obj);
3975 goto done;
3976 }
3977 else if (type == &PyFloat_Type) {
3978 status = save_float(self, obj);
3979 goto done;
3980 }
3981
3982 /* Check the memo to see if it has the object. If so, generate
3983 a GET (or BINGET) opcode, instead of pickling the object
3984 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003985 if (PyMemoTable_Get(self->memo, obj)) {
3986 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003987 goto error;
3988 goto done;
3989 }
3990
3991 if (type == &PyBytes_Type) {
3992 status = save_bytes(self, obj);
3993 goto done;
3994 }
3995 else if (type == &PyUnicode_Type) {
3996 status = save_unicode(self, obj);
3997 goto done;
3998 }
3999 else if (type == &PyDict_Type) {
4000 status = save_dict(self, obj);
4001 goto done;
4002 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004003 else if (type == &PySet_Type) {
4004 status = save_set(self, obj);
4005 goto done;
4006 }
4007 else if (type == &PyFrozenSet_Type) {
4008 status = save_frozenset(self, obj);
4009 goto done;
4010 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004011 else if (type == &PyList_Type) {
4012 status = save_list(self, obj);
4013 goto done;
4014 }
4015 else if (type == &PyTuple_Type) {
4016 status = save_tuple(self, obj);
4017 goto done;
4018 }
4019 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08004020 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004021 goto done;
4022 }
4023 else if (type == &PyFunction_Type) {
4024 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08004025 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004026 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004027
4028 /* XXX: This part needs some unit tests. */
4029
4030 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004031 * self.dispatch_table, copyreg.dispatch_table, the object's
4032 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004033 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004034 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004035 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004036 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
4037 (PyObject *)type);
4038 if (reduce_func == NULL) {
4039 if (PyErr_Occurred()) {
4040 goto error;
4041 }
4042 } else {
4043 /* PyDict_GetItemWithError() returns a borrowed reference.
4044 Increase the reference count to be consistent with
4045 PyObject_GetItem and _PyObject_GetAttrId used below. */
4046 Py_INCREF(reduce_func);
4047 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004048 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004049 reduce_func = PyObject_GetItem(self->dispatch_table,
4050 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004051 if (reduce_func == NULL) {
4052 if (PyErr_ExceptionMatches(PyExc_KeyError))
4053 PyErr_Clear();
4054 else
4055 goto error;
4056 }
4057 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004058 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004059 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004060 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004061 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02004062 else if (PyType_IsSubtype(type, &PyType_Type)) {
4063 status = save_global(self, obj, NULL);
4064 goto done;
4065 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004066 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004067 _Py_IDENTIFIER(__reduce__);
4068 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004069
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004070
4071 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
4072 automatically defined as __reduce__. While this is convenient, this
4073 make it impossible to know which method was actually called. Of
4074 course, this is not a big deal. But still, it would be nice to let
4075 the user know which method was called when something go
4076 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
4077 don't actually have to check for a __reduce__ method. */
4078
4079 /* Check for a __reduce_ex__ method. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004080 if (_PyObject_LookupAttrId(obj, &PyId___reduce_ex__, &reduce_func) < 0) {
4081 goto error;
4082 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004083 if (reduce_func != NULL) {
4084 PyObject *proto;
4085 proto = PyLong_FromLong(self->proto);
4086 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004087 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004088 }
4089 }
4090 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004091 PickleState *st = _Pickle_GetGlobalState();
4092
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004093 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004094 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004095 if (reduce_func != NULL) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02004096 reduce_value = _PyObject_CallNoArg(reduce_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004097 }
4098 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004099 PyErr_Format(st->PicklingError,
4100 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004101 type->tp_name, obj);
4102 goto error;
4103 }
4104 }
4105 }
4106
4107 if (reduce_value == NULL)
4108 goto error;
4109
4110 if (PyUnicode_Check(reduce_value)) {
4111 status = save_global(self, obj, reduce_value);
4112 goto done;
4113 }
4114
4115 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004116 PickleState *st = _Pickle_GetGlobalState();
4117 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004118 "__reduce__ must return a string or tuple");
4119 goto error;
4120 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004121
4122 status = save_reduce(self, reduce_value, obj);
4123
4124 if (0) {
4125 error:
4126 status = -1;
4127 }
4128 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004129
Alexandre Vassalottidff18342008-07-13 18:48:30 +00004130 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004131 Py_XDECREF(reduce_func);
4132 Py_XDECREF(reduce_value);
4133
4134 return status;
4135}
4136
4137static int
4138dump(PicklerObject *self, PyObject *obj)
4139{
4140 const char stop_op = STOP;
4141
4142 if (self->proto >= 2) {
4143 char header[2];
4144
4145 header[0] = PROTO;
4146 assert(self->proto >= 0 && self->proto < 256);
4147 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004148 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004149 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004150 if (self->proto >= 4)
4151 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004152 }
4153
4154 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004155 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004156 return -1;
4157
4158 return 0;
4159}
4160
Larry Hastings61272b72014-01-07 12:41:53 -08004161/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004162
4163_pickle.Pickler.clear_memo
4164
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004165Clears the pickler's "memo".
4166
4167The memo is the data structure that remembers which objects the
4168pickler has already seen, so that shared or recursive objects are
4169pickled by reference and not by value. This method is useful when
4170re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08004171[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004172
Larry Hastings3cceb382014-01-04 11:09:09 -08004173static PyObject *
4174_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004175/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004176{
4177 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004178 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004179
4180 Py_RETURN_NONE;
4181}
4182
Larry Hastings61272b72014-01-07 12:41:53 -08004183/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004184
4185_pickle.Pickler.dump
4186
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004187 obj: object
4188 /
4189
4190Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08004191[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004192
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004193static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004194_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08004195/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004196{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004197 /* Check whether the Pickler was initialized correctly (issue3664).
4198 Developers often forget to call __init__() in their subclasses, which
4199 would trigger a segfault without this check. */
4200 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004201 PickleState *st = _Pickle_GetGlobalState();
4202 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004203 "Pickler.__init__() was not called by %s.__init__()",
4204 Py_TYPE(self)->tp_name);
4205 return NULL;
4206 }
4207
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004208 if (_Pickler_ClearBuffer(self) < 0)
4209 return NULL;
4210
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004211 if (dump(self, obj) < 0)
4212 return NULL;
4213
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004214 if (_Pickler_FlushToFile(self) < 0)
4215 return NULL;
4216
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004217 Py_RETURN_NONE;
4218}
4219
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004220/*[clinic input]
4221
4222_pickle.Pickler.__sizeof__ -> Py_ssize_t
4223
4224Returns size in memory, in bytes.
4225[clinic start generated code]*/
4226
4227static Py_ssize_t
4228_pickle_Pickler___sizeof___impl(PicklerObject *self)
4229/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4230{
4231 Py_ssize_t res, s;
4232
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004233 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004234 if (self->memo != NULL) {
4235 res += sizeof(PyMemoTable);
4236 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4237 }
4238 if (self->output_buffer != NULL) {
4239 s = _PySys_GetSizeOf(self->output_buffer);
4240 if (s == -1)
4241 return -1;
4242 res += s;
4243 }
4244 return res;
4245}
4246
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004247static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004248 _PICKLE_PICKLER_DUMP_METHODDEF
4249 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004250 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004251 {NULL, NULL} /* sentinel */
4252};
4253
4254static void
4255Pickler_dealloc(PicklerObject *self)
4256{
4257 PyObject_GC_UnTrack(self);
4258
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004259 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004260 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004261 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004262 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004263 Py_XDECREF(self->fast_memo);
4264
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004265 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004266
4267 Py_TYPE(self)->tp_free((PyObject *)self);
4268}
4269
4270static int
4271Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4272{
4273 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004274 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004275 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004276 Py_VISIT(self->fast_memo);
4277 return 0;
4278}
4279
4280static int
4281Pickler_clear(PicklerObject *self)
4282{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004283 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004284 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004285 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004286 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004287 Py_CLEAR(self->fast_memo);
4288
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004289 if (self->memo != NULL) {
4290 PyMemoTable *memo = self->memo;
4291 self->memo = NULL;
4292 PyMemoTable_Del(memo);
4293 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004294 return 0;
4295}
4296
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004297
Larry Hastings61272b72014-01-07 12:41:53 -08004298/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004299
4300_pickle.Pickler.__init__
4301
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004302 file: object
4303 protocol: object = NULL
4304 fix_imports: bool = True
4305
4306This takes a binary file for writing a pickle data stream.
4307
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004308The optional *protocol* argument tells the pickler to use the given
4309protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4310protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004311
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004312Specifying a negative protocol version selects the highest protocol
4313version supported. The higher the protocol used, the more recent the
4314version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004315
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004316The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004317bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004318writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004319this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004320
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004321If *fix_imports* is True and protocol is less than 3, pickle will try
4322to map the new Python 3 names to the old module names used in Python
43232, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004324[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004325
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004326static int
Larry Hastings89964c42015-04-14 18:07:59 -04004327_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4328 PyObject *protocol, int fix_imports)
Martin Panter2eb819f2015-11-02 04:04:57 +00004329/*[clinic end generated code: output=b5f31078dab17fb0 input=4faabdbc763c2389]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004330{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004331 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004332 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004333
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004334 /* In case of multiple __init__() calls, clear previous content. */
4335 if (self->write != NULL)
4336 (void)Pickler_clear(self);
4337
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004338 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004339 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004340
4341 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004342 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004343
4344 /* memo and output_buffer may have already been created in _Pickler_New */
4345 if (self->memo == NULL) {
4346 self->memo = PyMemoTable_New();
4347 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004348 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004349 }
4350 self->output_len = 0;
4351 if (self->output_buffer == NULL) {
4352 self->max_output_len = WRITE_BUF_SIZE;
4353 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4354 self->max_output_len);
4355 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004356 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004357 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004358
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004359 self->fast = 0;
4360 self->fast_nesting = 0;
4361 self->fast_memo = NULL;
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004362
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004363 if (init_method_ref((PyObject *)self, &PyId_persistent_id,
4364 &self->pers_func, &self->pers_func_self) < 0)
4365 {
4366 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004367 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004368
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004369 if (_PyObject_LookupAttrId((PyObject *)self,
4370 &PyId_dispatch_table, &self->dispatch_table) < 0) {
4371 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004372 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004373
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004374 return 0;
4375}
4376
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004377
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004378/* Define a proxy object for the Pickler's internal memo object. This is to
4379 * avoid breaking code like:
4380 * pickler.memo.clear()
4381 * and
4382 * pickler.memo = saved_memo
4383 * Is this a good idea? Not really, but we don't want to break code that uses
4384 * it. Note that we don't implement the entire mapping API here. This is
4385 * intentional, as these should be treated as black-box implementation details.
4386 */
4387
Larry Hastings61272b72014-01-07 12:41:53 -08004388/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004389_pickle.PicklerMemoProxy.clear
4390
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004391Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004392[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004393
Larry Hastings3cceb382014-01-04 11:09:09 -08004394static PyObject *
4395_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004396/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004397{
4398 if (self->pickler->memo)
4399 PyMemoTable_Clear(self->pickler->memo);
4400 Py_RETURN_NONE;
4401}
4402
Larry Hastings61272b72014-01-07 12:41:53 -08004403/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004404_pickle.PicklerMemoProxy.copy
4405
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004406Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004407[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004408
Larry Hastings3cceb382014-01-04 11:09:09 -08004409static PyObject *
4410_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004411/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004412{
4413 Py_ssize_t i;
4414 PyMemoTable *memo;
4415 PyObject *new_memo = PyDict_New();
4416 if (new_memo == NULL)
4417 return NULL;
4418
4419 memo = self->pickler->memo;
4420 for (i = 0; i < memo->mt_allocated; ++i) {
4421 PyMemoEntry entry = memo->mt_table[i];
4422 if (entry.me_key != NULL) {
4423 int status;
4424 PyObject *key, *value;
4425
4426 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004427 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004428
4429 if (key == NULL || value == NULL) {
4430 Py_XDECREF(key);
4431 Py_XDECREF(value);
4432 goto error;
4433 }
4434 status = PyDict_SetItem(new_memo, key, value);
4435 Py_DECREF(key);
4436 Py_DECREF(value);
4437 if (status < 0)
4438 goto error;
4439 }
4440 }
4441 return new_memo;
4442
4443 error:
4444 Py_XDECREF(new_memo);
4445 return NULL;
4446}
4447
Larry Hastings61272b72014-01-07 12:41:53 -08004448/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004449_pickle.PicklerMemoProxy.__reduce__
4450
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004451Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004452[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004453
Larry Hastings3cceb382014-01-04 11:09:09 -08004454static PyObject *
4455_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004456/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004457{
4458 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004459 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004460 if (contents == NULL)
4461 return NULL;
4462
4463 reduce_value = PyTuple_New(2);
4464 if (reduce_value == NULL) {
4465 Py_DECREF(contents);
4466 return NULL;
4467 }
4468 dict_args = PyTuple_New(1);
4469 if (dict_args == NULL) {
4470 Py_DECREF(contents);
4471 Py_DECREF(reduce_value);
4472 return NULL;
4473 }
4474 PyTuple_SET_ITEM(dict_args, 0, contents);
4475 Py_INCREF((PyObject *)&PyDict_Type);
4476 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4477 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4478 return reduce_value;
4479}
4480
4481static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004482 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4483 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4484 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004485 {NULL, NULL} /* sentinel */
4486};
4487
4488static void
4489PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4490{
4491 PyObject_GC_UnTrack(self);
4492 Py_XDECREF(self->pickler);
4493 PyObject_GC_Del((PyObject *)self);
4494}
4495
4496static int
4497PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4498 visitproc visit, void *arg)
4499{
4500 Py_VISIT(self->pickler);
4501 return 0;
4502}
4503
4504static int
4505PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4506{
4507 Py_CLEAR(self->pickler);
4508 return 0;
4509}
4510
4511static PyTypeObject PicklerMemoProxyType = {
4512 PyVarObject_HEAD_INIT(NULL, 0)
4513 "_pickle.PicklerMemoProxy", /*tp_name*/
4514 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4515 0,
4516 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4517 0, /* tp_print */
4518 0, /* tp_getattr */
4519 0, /* tp_setattr */
4520 0, /* tp_compare */
4521 0, /* tp_repr */
4522 0, /* tp_as_number */
4523 0, /* tp_as_sequence */
4524 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004525 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004526 0, /* tp_call */
4527 0, /* tp_str */
4528 PyObject_GenericGetAttr, /* tp_getattro */
4529 PyObject_GenericSetAttr, /* tp_setattro */
4530 0, /* tp_as_buffer */
4531 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4532 0, /* tp_doc */
4533 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4534 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4535 0, /* tp_richcompare */
4536 0, /* tp_weaklistoffset */
4537 0, /* tp_iter */
4538 0, /* tp_iternext */
4539 picklerproxy_methods, /* tp_methods */
4540};
4541
4542static PyObject *
4543PicklerMemoProxy_New(PicklerObject *pickler)
4544{
4545 PicklerMemoProxyObject *self;
4546
4547 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4548 if (self == NULL)
4549 return NULL;
4550 Py_INCREF(pickler);
4551 self->pickler = pickler;
4552 PyObject_GC_Track(self);
4553 return (PyObject *)self;
4554}
4555
4556/*****************************************************************************/
4557
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004558static PyObject *
4559Pickler_get_memo(PicklerObject *self)
4560{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004561 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004562}
4563
4564static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004565Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004566{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004567 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004568
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004569 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004570 PyErr_SetString(PyExc_TypeError,
4571 "attribute deletion is not supported");
4572 return -1;
4573 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004574
4575 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4576 PicklerObject *pickler =
4577 ((PicklerMemoProxyObject *)obj)->pickler;
4578
4579 new_memo = PyMemoTable_Copy(pickler->memo);
4580 if (new_memo == NULL)
4581 return -1;
4582 }
4583 else if (PyDict_Check(obj)) {
4584 Py_ssize_t i = 0;
4585 PyObject *key, *value;
4586
4587 new_memo = PyMemoTable_New();
4588 if (new_memo == NULL)
4589 return -1;
4590
4591 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004592 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004593 PyObject *memo_obj;
4594
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004595 if (!PyTuple_Check(value) || PyTuple_GET_SIZE(value) != 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004596 PyErr_SetString(PyExc_TypeError,
4597 "'memo' values must be 2-item tuples");
4598 goto error;
4599 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004600 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004601 if (memo_id == -1 && PyErr_Occurred())
4602 goto error;
4603 memo_obj = PyTuple_GET_ITEM(value, 1);
4604 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4605 goto error;
4606 }
4607 }
4608 else {
4609 PyErr_Format(PyExc_TypeError,
Serhiy Storchakab6a9c972016-04-17 09:39:28 +03004610 "'memo' attribute must be a PicklerMemoProxy object"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004611 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004612 return -1;
4613 }
4614
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004615 PyMemoTable_Del(self->memo);
4616 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004617
4618 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004619
4620 error:
4621 if (new_memo)
4622 PyMemoTable_Del(new_memo);
4623 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004624}
4625
4626static PyObject *
4627Pickler_get_persid(PicklerObject *self)
4628{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004629 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004630 PyErr_SetString(PyExc_AttributeError, "persistent_id");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004631 return NULL;
4632 }
4633 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004634}
4635
4636static int
4637Pickler_set_persid(PicklerObject *self, PyObject *value)
4638{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004639 if (value == NULL) {
4640 PyErr_SetString(PyExc_TypeError,
4641 "attribute deletion is not supported");
4642 return -1;
4643 }
4644 if (!PyCallable_Check(value)) {
4645 PyErr_SetString(PyExc_TypeError,
4646 "persistent_id must be a callable taking one argument");
4647 return -1;
4648 }
4649
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004650 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004651 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03004652 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004653
4654 return 0;
4655}
4656
4657static PyMemberDef Pickler_members[] = {
4658 {"bin", T_INT, offsetof(PicklerObject, bin)},
4659 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004660 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004661 {NULL}
4662};
4663
4664static PyGetSetDef Pickler_getsets[] = {
4665 {"memo", (getter)Pickler_get_memo,
4666 (setter)Pickler_set_memo},
4667 {"persistent_id", (getter)Pickler_get_persid,
4668 (setter)Pickler_set_persid},
4669 {NULL}
4670};
4671
4672static PyTypeObject Pickler_Type = {
4673 PyVarObject_HEAD_INIT(NULL, 0)
4674 "_pickle.Pickler" , /*tp_name*/
4675 sizeof(PicklerObject), /*tp_basicsize*/
4676 0, /*tp_itemsize*/
4677 (destructor)Pickler_dealloc, /*tp_dealloc*/
4678 0, /*tp_print*/
4679 0, /*tp_getattr*/
4680 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004681 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004682 0, /*tp_repr*/
4683 0, /*tp_as_number*/
4684 0, /*tp_as_sequence*/
4685 0, /*tp_as_mapping*/
4686 0, /*tp_hash*/
4687 0, /*tp_call*/
4688 0, /*tp_str*/
4689 0, /*tp_getattro*/
4690 0, /*tp_setattro*/
4691 0, /*tp_as_buffer*/
4692 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004693 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004694 (traverseproc)Pickler_traverse, /*tp_traverse*/
4695 (inquiry)Pickler_clear, /*tp_clear*/
4696 0, /*tp_richcompare*/
4697 0, /*tp_weaklistoffset*/
4698 0, /*tp_iter*/
4699 0, /*tp_iternext*/
4700 Pickler_methods, /*tp_methods*/
4701 Pickler_members, /*tp_members*/
4702 Pickler_getsets, /*tp_getset*/
4703 0, /*tp_base*/
4704 0, /*tp_dict*/
4705 0, /*tp_descr_get*/
4706 0, /*tp_descr_set*/
4707 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004708 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004709 PyType_GenericAlloc, /*tp_alloc*/
4710 PyType_GenericNew, /*tp_new*/
4711 PyObject_GC_Del, /*tp_free*/
4712 0, /*tp_is_gc*/
4713};
4714
Victor Stinner121aab42011-09-29 23:40:53 +02004715/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004716
4717 XXX: It would be nice to able to avoid Python function call overhead, by
4718 using directly the C version of find_class(), when find_class() is not
4719 overridden by a subclass. Although, this could become rather hackish. A
4720 simpler optimization would be to call the C function when self is not a
4721 subclass instance. */
4722static PyObject *
4723find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4724{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004725 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004726
Victor Stinner55ba38a2016-12-09 16:09:30 +01004727 return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_find_class,
4728 module_name, global_name, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004729}
4730
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004731static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004732marker(UnpicklerObject *self)
4733{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02004734 Py_ssize_t mark;
4735
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004736 if (self->num_marks < 1) {
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02004737 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004738 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004739 return -1;
4740 }
4741
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02004742 mark = self->marks[--self->num_marks];
4743 self->stack->mark_set = self->num_marks != 0;
4744 self->stack->fence = self->num_marks ?
4745 self->marks[self->num_marks - 1] : 0;
4746 return mark;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004747}
4748
4749static int
4750load_none(UnpicklerObject *self)
4751{
4752 PDATA_APPEND(self->stack, Py_None, -1);
4753 return 0;
4754}
4755
4756static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004757load_int(UnpicklerObject *self)
4758{
4759 PyObject *value;
4760 char *endptr, *s;
4761 Py_ssize_t len;
4762 long x;
4763
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004764 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004765 return -1;
4766 if (len < 2)
4767 return bad_readline();
4768
4769 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004770 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004771 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004772 x = strtol(s, &endptr, 0);
4773
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004774 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004775 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004776 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004777 errno = 0;
4778 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004779 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004780 if (value == NULL) {
4781 PyErr_SetString(PyExc_ValueError,
4782 "could not convert string to int");
4783 return -1;
4784 }
4785 }
4786 else {
4787 if (len == 3 && (x == 0 || x == 1)) {
4788 if ((value = PyBool_FromLong(x)) == NULL)
4789 return -1;
4790 }
4791 else {
4792 if ((value = PyLong_FromLong(x)) == NULL)
4793 return -1;
4794 }
4795 }
4796
4797 PDATA_PUSH(self->stack, value, -1);
4798 return 0;
4799}
4800
4801static int
4802load_bool(UnpicklerObject *self, PyObject *boolean)
4803{
4804 assert(boolean == Py_True || boolean == Py_False);
4805 PDATA_APPEND(self->stack, boolean, -1);
4806 return 0;
4807}
4808
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004809/* s contains x bytes of an unsigned little-endian integer. Return its value
4810 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4811 */
4812static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004813calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004814{
4815 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004816 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004817 size_t x = 0;
4818
Serhiy Storchakae0606192015-09-29 22:10:07 +03004819 if (nbytes > (int)sizeof(size_t)) {
4820 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
4821 * have 64-bit size that can't be represented on 32-bit platform.
4822 */
4823 for (i = (int)sizeof(size_t); i < nbytes; i++) {
4824 if (s[i])
4825 return -1;
4826 }
4827 nbytes = (int)sizeof(size_t);
4828 }
4829 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004830 x |= (size_t) s[i] << (8 * i);
4831 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004832
4833 if (x > PY_SSIZE_T_MAX)
4834 return -1;
4835 else
4836 return (Py_ssize_t) x;
4837}
4838
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004839/* s contains x bytes of a little-endian integer. Return its value as a
4840 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03004841 * int, but when x is 4 it's a signed one. This is a historical source
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004842 * of x-platform bugs.
4843 */
4844static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004845calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004846{
4847 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004848 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004849 long x = 0;
4850
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004851 for (i = 0; i < nbytes; i++) {
4852 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004853 }
4854
4855 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4856 * is signed, so on a box with longs bigger than 4 bytes we need
4857 * to extend a BININT's sign bit to the full width.
4858 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004859 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004860 x |= -(x & (1L << 31));
4861 }
4862
4863 return x;
4864}
4865
4866static int
4867load_binintx(UnpicklerObject *self, char *s, int size)
4868{
4869 PyObject *value;
4870 long x;
4871
4872 x = calc_binint(s, size);
4873
4874 if ((value = PyLong_FromLong(x)) == NULL)
4875 return -1;
4876
4877 PDATA_PUSH(self->stack, value, -1);
4878 return 0;
4879}
4880
4881static int
4882load_binint(UnpicklerObject *self)
4883{
4884 char *s;
4885
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004886 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004887 return -1;
4888
4889 return load_binintx(self, s, 4);
4890}
4891
4892static int
4893load_binint1(UnpicklerObject *self)
4894{
4895 char *s;
4896
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004897 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004898 return -1;
4899
4900 return load_binintx(self, s, 1);
4901}
4902
4903static int
4904load_binint2(UnpicklerObject *self)
4905{
4906 char *s;
4907
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004908 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004909 return -1;
4910
4911 return load_binintx(self, s, 2);
4912}
4913
4914static int
4915load_long(UnpicklerObject *self)
4916{
4917 PyObject *value;
Victor Stinnerb110dad2016-12-09 17:06:43 +01004918 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004919 Py_ssize_t len;
4920
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004921 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004922 return -1;
4923 if (len < 2)
4924 return bad_readline();
4925
Mark Dickinson8dd05142009-01-20 20:43:58 +00004926 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4927 the 'L' before calling PyLong_FromString. In order to maintain
4928 compatibility with Python 3.0.0, we don't actually *require*
4929 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004930 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004931 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004932 /* XXX: Should the base argument explicitly set to 10? */
4933 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004934 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004935 return -1;
4936
4937 PDATA_PUSH(self->stack, value, -1);
4938 return 0;
4939}
4940
4941/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4942 * data following.
4943 */
4944static int
4945load_counted_long(UnpicklerObject *self, int size)
4946{
4947 PyObject *value;
4948 char *nbytes;
4949 char *pdata;
4950
4951 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004952 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004953 return -1;
4954
4955 size = calc_binint(nbytes, size);
4956 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004957 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004958 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004959 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004960 "LONG pickle has negative byte count");
4961 return -1;
4962 }
4963
4964 if (size == 0)
4965 value = PyLong_FromLong(0L);
4966 else {
4967 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004968 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004969 return -1;
4970 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4971 1 /* little endian */ , 1 /* signed */ );
4972 }
4973 if (value == NULL)
4974 return -1;
4975 PDATA_PUSH(self->stack, value, -1);
4976 return 0;
4977}
4978
4979static int
4980load_float(UnpicklerObject *self)
4981{
4982 PyObject *value;
4983 char *endptr, *s;
4984 Py_ssize_t len;
4985 double d;
4986
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004987 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004988 return -1;
4989 if (len < 2)
4990 return bad_readline();
4991
4992 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004993 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4994 if (d == -1.0 && PyErr_Occurred())
4995 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004996 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004997 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4998 return -1;
4999 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00005000 value = PyFloat_FromDouble(d);
5001 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005002 return -1;
5003
5004 PDATA_PUSH(self->stack, value, -1);
5005 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005006}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005007
5008static int
5009load_binfloat(UnpicklerObject *self)
5010{
5011 PyObject *value;
5012 double x;
5013 char *s;
5014
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005015 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005016 return -1;
5017
5018 x = _PyFloat_Unpack8((unsigned char *)s, 0);
5019 if (x == -1.0 && PyErr_Occurred())
5020 return -1;
5021
5022 if ((value = PyFloat_FromDouble(x)) == NULL)
5023 return -1;
5024
5025 PDATA_PUSH(self->stack, value, -1);
5026 return 0;
5027}
5028
5029static int
5030load_string(UnpicklerObject *self)
5031{
5032 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005033 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005034 Py_ssize_t len;
5035 char *s, *p;
5036
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005037 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005038 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005039 /* Strip the newline */
5040 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005041 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005042 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005043 p = s + 1;
5044 len -= 2;
5045 }
5046 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005047 PickleState *st = _Pickle_GetGlobalState();
5048 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005049 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005050 return -1;
5051 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005052 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005053
5054 /* Use the PyBytes API to decode the string, since that is what is used
5055 to encode, and then coerce the result to Unicode. */
5056 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005057 if (bytes == NULL)
5058 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005059
5060 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
5061 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5062 if (strcmp(self->encoding, "bytes") == 0) {
5063 obj = bytes;
5064 }
5065 else {
5066 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
5067 Py_DECREF(bytes);
5068 if (obj == NULL) {
5069 return -1;
5070 }
5071 }
5072
5073 PDATA_PUSH(self->stack, obj, -1);
5074 return 0;
5075}
5076
5077static int
5078load_counted_binstring(UnpicklerObject *self, int nbytes)
5079{
5080 PyObject *obj;
5081 Py_ssize_t size;
5082 char *s;
5083
5084 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005085 return -1;
5086
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005087 size = calc_binsize(s, nbytes);
5088 if (size < 0) {
5089 PickleState *st = _Pickle_GetGlobalState();
5090 PyErr_Format(st->UnpicklingError,
5091 "BINSTRING exceeds system's maximum size of %zd bytes",
5092 PY_SSIZE_T_MAX);
5093 return -1;
5094 }
5095
5096 if (_Unpickler_Read(self, &s, size) < 0)
5097 return -1;
5098
5099 /* Convert Python 2.x strings to bytes if the *encoding* given to the
5100 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5101 if (strcmp(self->encoding, "bytes") == 0) {
5102 obj = PyBytes_FromStringAndSize(s, size);
5103 }
5104 else {
5105 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
5106 }
5107 if (obj == NULL) {
5108 return -1;
5109 }
5110
5111 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005112 return 0;
5113}
5114
5115static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005116load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005117{
5118 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005119 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005120 char *s;
5121
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005122 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005123 return -1;
5124
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005125 size = calc_binsize(s, nbytes);
5126 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005127 PyErr_Format(PyExc_OverflowError,
5128 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005129 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005130 return -1;
5131 }
5132
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005133 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005134 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005135
5136 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005137 if (bytes == NULL)
5138 return -1;
5139
5140 PDATA_PUSH(self->stack, bytes, -1);
5141 return 0;
5142}
5143
5144static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005145load_unicode(UnpicklerObject *self)
5146{
5147 PyObject *str;
5148 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005149 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005150
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005151 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005152 return -1;
5153 if (len < 1)
5154 return bad_readline();
5155
5156 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
5157 if (str == NULL)
5158 return -1;
5159
5160 PDATA_PUSH(self->stack, str, -1);
5161 return 0;
5162}
5163
5164static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005165load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005166{
5167 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005168 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005169 char *s;
5170
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005171 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005172 return -1;
5173
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005174 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005175 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005176 PyErr_Format(PyExc_OverflowError,
5177 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005178 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005179 return -1;
5180 }
5181
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005182 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005183 return -1;
5184
Victor Stinner485fb562010-04-13 11:07:24 +00005185 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005186 if (str == NULL)
5187 return -1;
5188
5189 PDATA_PUSH(self->stack, str, -1);
5190 return 0;
5191}
5192
5193static int
Victor Stinner21b47112016-03-14 18:09:39 +01005194load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005195{
5196 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005197
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005198 if (Py_SIZE(self->stack) < len)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005199 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005200
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005201 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005202 if (tuple == NULL)
5203 return -1;
5204 PDATA_PUSH(self->stack, tuple, -1);
5205 return 0;
5206}
5207
5208static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005209load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005210{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005211 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005212
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005213 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005214 return -1;
5215
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005216 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005217}
5218
5219static int
5220load_empty_list(UnpicklerObject *self)
5221{
5222 PyObject *list;
5223
5224 if ((list = PyList_New(0)) == NULL)
5225 return -1;
5226 PDATA_PUSH(self->stack, list, -1);
5227 return 0;
5228}
5229
5230static int
5231load_empty_dict(UnpicklerObject *self)
5232{
5233 PyObject *dict;
5234
5235 if ((dict = PyDict_New()) == NULL)
5236 return -1;
5237 PDATA_PUSH(self->stack, dict, -1);
5238 return 0;
5239}
5240
5241static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005242load_empty_set(UnpicklerObject *self)
5243{
5244 PyObject *set;
5245
5246 if ((set = PySet_New(NULL)) == NULL)
5247 return -1;
5248 PDATA_PUSH(self->stack, set, -1);
5249 return 0;
5250}
5251
5252static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005253load_list(UnpicklerObject *self)
5254{
5255 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005256 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005257
5258 if ((i = marker(self)) < 0)
5259 return -1;
5260
5261 list = Pdata_poplist(self->stack, i);
5262 if (list == NULL)
5263 return -1;
5264 PDATA_PUSH(self->stack, list, -1);
5265 return 0;
5266}
5267
5268static int
5269load_dict(UnpicklerObject *self)
5270{
5271 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005272 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005273
5274 if ((i = marker(self)) < 0)
5275 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005276 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005277
5278 if ((dict = PyDict_New()) == NULL)
5279 return -1;
5280
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005281 if ((j - i) % 2 != 0) {
5282 PickleState *st = _Pickle_GetGlobalState();
5283 PyErr_SetString(st->UnpicklingError, "odd number of items for DICT");
Serhiy Storchaka3ac53802015-12-07 11:32:00 +02005284 Py_DECREF(dict);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005285 return -1;
5286 }
5287
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005288 for (k = i + 1; k < j; k += 2) {
5289 key = self->stack->data[k - 1];
5290 value = self->stack->data[k];
5291 if (PyDict_SetItem(dict, key, value) < 0) {
5292 Py_DECREF(dict);
5293 return -1;
5294 }
5295 }
5296 Pdata_clear(self->stack, i);
5297 PDATA_PUSH(self->stack, dict, -1);
5298 return 0;
5299}
5300
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005301static int
5302load_frozenset(UnpicklerObject *self)
5303{
5304 PyObject *items;
5305 PyObject *frozenset;
5306 Py_ssize_t i;
5307
5308 if ((i = marker(self)) < 0)
5309 return -1;
5310
5311 items = Pdata_poptuple(self->stack, i);
5312 if (items == NULL)
5313 return -1;
5314
5315 frozenset = PyFrozenSet_New(items);
5316 Py_DECREF(items);
5317 if (frozenset == NULL)
5318 return -1;
5319
5320 PDATA_PUSH(self->stack, frozenset, -1);
5321 return 0;
5322}
5323
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005324static PyObject *
5325instantiate(PyObject *cls, PyObject *args)
5326{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005327 /* Caller must assure args are a tuple. Normally, args come from
5328 Pdata_poptuple which packs objects from the top of the stack
5329 into a newly created tuple. */
5330 assert(PyTuple_Check(args));
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005331 if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
5332 _Py_IDENTIFIER(__getinitargs__);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005333 _Py_IDENTIFIER(__new__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005334 PyObject *func;
5335 if (_PyObject_LookupAttrId(cls, &PyId___getinitargs__, &func) < 0) {
5336 return NULL;
5337 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005338 if (func == NULL) {
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005339 return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
5340 }
5341 Py_DECREF(func);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005342 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005343 return PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005344}
5345
5346static int
5347load_obj(UnpicklerObject *self)
5348{
5349 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005350 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005351
5352 if ((i = marker(self)) < 0)
5353 return -1;
5354
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005355 if (Py_SIZE(self->stack) - i < 1)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005356 return Pdata_stack_underflow(self->stack);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005357
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005358 args = Pdata_poptuple(self->stack, i + 1);
5359 if (args == NULL)
5360 return -1;
5361
5362 PDATA_POP(self->stack, cls);
5363 if (cls) {
5364 obj = instantiate(cls, args);
5365 Py_DECREF(cls);
5366 }
5367 Py_DECREF(args);
5368 if (obj == NULL)
5369 return -1;
5370
5371 PDATA_PUSH(self->stack, obj, -1);
5372 return 0;
5373}
5374
5375static int
5376load_inst(UnpicklerObject *self)
5377{
5378 PyObject *cls = NULL;
5379 PyObject *args = NULL;
5380 PyObject *obj = NULL;
5381 PyObject *module_name;
5382 PyObject *class_name;
5383 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005384 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005385 char *s;
5386
5387 if ((i = marker(self)) < 0)
5388 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005389 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005390 return -1;
5391 if (len < 2)
5392 return bad_readline();
5393
5394 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5395 identifiers are permitted in Python 3.0, since the INST opcode is only
5396 supported by older protocols on Python 2.x. */
5397 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5398 if (module_name == NULL)
5399 return -1;
5400
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005401 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005402 if (len < 2) {
5403 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005404 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005405 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005406 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005407 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005408 cls = find_class(self, module_name, class_name);
5409 Py_DECREF(class_name);
5410 }
5411 }
5412 Py_DECREF(module_name);
5413
5414 if (cls == NULL)
5415 return -1;
5416
5417 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5418 obj = instantiate(cls, args);
5419 Py_DECREF(args);
5420 }
5421 Py_DECREF(cls);
5422
5423 if (obj == NULL)
5424 return -1;
5425
5426 PDATA_PUSH(self->stack, obj, -1);
5427 return 0;
5428}
5429
5430static int
5431load_newobj(UnpicklerObject *self)
5432{
5433 PyObject *args = NULL;
5434 PyObject *clsraw = NULL;
5435 PyTypeObject *cls; /* clsraw cast to its true type */
5436 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005437 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005438
5439 /* Stack is ... cls argtuple, and we want to call
5440 * cls.__new__(cls, *argtuple).
5441 */
5442 PDATA_POP(self->stack, args);
5443 if (args == NULL)
5444 goto error;
5445 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005446 PyErr_SetString(st->UnpicklingError,
5447 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005448 goto error;
5449 }
5450
5451 PDATA_POP(self->stack, clsraw);
5452 cls = (PyTypeObject *)clsraw;
5453 if (cls == NULL)
5454 goto error;
5455 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005456 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005457 "isn't a type object");
5458 goto error;
5459 }
5460 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005461 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005462 "has NULL tp_new");
5463 goto error;
5464 }
5465
5466 /* Call __new__. */
5467 obj = cls->tp_new(cls, args, NULL);
5468 if (obj == NULL)
5469 goto error;
5470
5471 Py_DECREF(args);
5472 Py_DECREF(clsraw);
5473 PDATA_PUSH(self->stack, obj, -1);
5474 return 0;
5475
5476 error:
5477 Py_XDECREF(args);
5478 Py_XDECREF(clsraw);
5479 return -1;
5480}
5481
5482static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005483load_newobj_ex(UnpicklerObject *self)
5484{
5485 PyObject *cls, *args, *kwargs;
5486 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005487 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005488
5489 PDATA_POP(self->stack, kwargs);
5490 if (kwargs == NULL) {
5491 return -1;
5492 }
5493 PDATA_POP(self->stack, args);
5494 if (args == NULL) {
5495 Py_DECREF(kwargs);
5496 return -1;
5497 }
5498 PDATA_POP(self->stack, cls);
5499 if (cls == NULL) {
5500 Py_DECREF(kwargs);
5501 Py_DECREF(args);
5502 return -1;
5503 }
Larry Hastings61272b72014-01-07 12:41:53 -08005504
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005505 if (!PyType_Check(cls)) {
5506 Py_DECREF(kwargs);
5507 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005508 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005509 "NEWOBJ_EX class argument must be a type, not %.200s",
5510 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005511 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005512 return -1;
5513 }
5514
5515 if (((PyTypeObject *)cls)->tp_new == NULL) {
5516 Py_DECREF(kwargs);
5517 Py_DECREF(args);
5518 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005519 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005520 "NEWOBJ_EX class argument doesn't have __new__");
5521 return -1;
5522 }
5523 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5524 Py_DECREF(kwargs);
5525 Py_DECREF(args);
5526 Py_DECREF(cls);
5527 if (obj == NULL) {
5528 return -1;
5529 }
5530 PDATA_PUSH(self->stack, obj, -1);
5531 return 0;
5532}
5533
5534static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005535load_global(UnpicklerObject *self)
5536{
5537 PyObject *global = NULL;
5538 PyObject *module_name;
5539 PyObject *global_name;
5540 Py_ssize_t len;
5541 char *s;
5542
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005543 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005544 return -1;
5545 if (len < 2)
5546 return bad_readline();
5547 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5548 if (!module_name)
5549 return -1;
5550
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005551 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005552 if (len < 2) {
5553 Py_DECREF(module_name);
5554 return bad_readline();
5555 }
5556 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5557 if (global_name) {
5558 global = find_class(self, module_name, global_name);
5559 Py_DECREF(global_name);
5560 }
5561 }
5562 Py_DECREF(module_name);
5563
5564 if (global == NULL)
5565 return -1;
5566 PDATA_PUSH(self->stack, global, -1);
5567 return 0;
5568}
5569
5570static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005571load_stack_global(UnpicklerObject *self)
5572{
5573 PyObject *global;
5574 PyObject *module_name;
5575 PyObject *global_name;
5576
5577 PDATA_POP(self->stack, global_name);
5578 PDATA_POP(self->stack, module_name);
5579 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5580 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005581 PickleState *st = _Pickle_GetGlobalState();
5582 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005583 Py_XDECREF(global_name);
5584 Py_XDECREF(module_name);
5585 return -1;
5586 }
5587 global = find_class(self, module_name, global_name);
5588 Py_DECREF(global_name);
5589 Py_DECREF(module_name);
5590 if (global == NULL)
5591 return -1;
5592 PDATA_PUSH(self->stack, global, -1);
5593 return 0;
5594}
5595
5596static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005597load_persid(UnpicklerObject *self)
5598{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005599 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005600 Py_ssize_t len;
5601 char *s;
5602
5603 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005604 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005605 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005606 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005607 return bad_readline();
5608
Serhiy Storchakadec25af2016-07-17 11:24:17 +03005609 pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
5610 if (pid == NULL) {
5611 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
5612 PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
5613 "persistent IDs in protocol 0 must be "
5614 "ASCII strings");
5615 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005616 return -1;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03005617 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005618
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005619 obj = call_method(self->pers_func, self->pers_func_self, pid);
5620 Py_DECREF(pid);
5621 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005622 return -1;
5623
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005624 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005625 return 0;
5626 }
5627 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005628 PickleState *st = _Pickle_GetGlobalState();
5629 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005630 "A load persistent id instruction was encountered,\n"
5631 "but no persistent_load function was specified.");
5632 return -1;
5633 }
5634}
5635
5636static int
5637load_binpersid(UnpicklerObject *self)
5638{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005639 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005640
5641 if (self->pers_func) {
5642 PDATA_POP(self->stack, pid);
5643 if (pid == NULL)
5644 return -1;
5645
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005646 obj = call_method(self->pers_func, self->pers_func_self, pid);
5647 Py_DECREF(pid);
5648 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005649 return -1;
5650
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005651 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005652 return 0;
5653 }
5654 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005655 PickleState *st = _Pickle_GetGlobalState();
5656 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005657 "A load persistent id instruction was encountered,\n"
5658 "but no persistent_load function was specified.");
5659 return -1;
5660 }
5661}
5662
5663static int
5664load_pop(UnpicklerObject *self)
5665{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005666 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005667
5668 /* Note that we split the (pickle.py) stack into two stacks,
5669 * an object stack and a mark stack. We have to be clever and
5670 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005671 * mark stack first, and only signalling a stack underflow if
5672 * the object stack is empty and the mark stack doesn't match
5673 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005675 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005676 self->num_marks--;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005677 self->stack->mark_set = self->num_marks != 0;
5678 self->stack->fence = self->num_marks ?
5679 self->marks[self->num_marks - 1] : 0;
5680 } else if (len <= self->stack->fence)
5681 return Pdata_stack_underflow(self->stack);
5682 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005683 len--;
5684 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005685 Py_SIZE(self->stack) = len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005686 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005687 return 0;
5688}
5689
5690static int
5691load_pop_mark(UnpicklerObject *self)
5692{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005693 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005694
5695 if ((i = marker(self)) < 0)
5696 return -1;
5697
5698 Pdata_clear(self->stack, i);
5699
5700 return 0;
5701}
5702
5703static int
5704load_dup(UnpicklerObject *self)
5705{
5706 PyObject *last;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005707 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005708
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005709 if (len <= self->stack->fence)
5710 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005711 last = self->stack->data[len - 1];
5712 PDATA_APPEND(self->stack, last, -1);
5713 return 0;
5714}
5715
5716static int
5717load_get(UnpicklerObject *self)
5718{
5719 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005720 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005721 Py_ssize_t len;
5722 char *s;
5723
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005724 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005725 return -1;
5726 if (len < 2)
5727 return bad_readline();
5728
5729 key = PyLong_FromString(s, NULL, 10);
5730 if (key == NULL)
5731 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005732 idx = PyLong_AsSsize_t(key);
5733 if (idx == -1 && PyErr_Occurred()) {
5734 Py_DECREF(key);
5735 return -1;
5736 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005737
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005738 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005739 if (value == NULL) {
5740 if (!PyErr_Occurred())
5741 PyErr_SetObject(PyExc_KeyError, key);
5742 Py_DECREF(key);
5743 return -1;
5744 }
5745 Py_DECREF(key);
5746
5747 PDATA_APPEND(self->stack, value, -1);
5748 return 0;
5749}
5750
5751static int
5752load_binget(UnpicklerObject *self)
5753{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005754 PyObject *value;
5755 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005756 char *s;
5757
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005758 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005759 return -1;
5760
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005761 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005762
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005763 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005764 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005765 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005766 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005767 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005768 Py_DECREF(key);
5769 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005770 return -1;
5771 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005772
5773 PDATA_APPEND(self->stack, value, -1);
5774 return 0;
5775}
5776
5777static int
5778load_long_binget(UnpicklerObject *self)
5779{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005780 PyObject *value;
5781 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005782 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005783
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005784 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005785 return -1;
5786
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005787 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005788
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005789 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005790 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005791 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005792 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005793 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005794 Py_DECREF(key);
5795 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005796 return -1;
5797 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005798
5799 PDATA_APPEND(self->stack, value, -1);
5800 return 0;
5801}
5802
5803/* Push an object from the extension registry (EXT[124]). nbytes is
5804 * the number of bytes following the opcode, holding the index (code) value.
5805 */
5806static int
5807load_extension(UnpicklerObject *self, int nbytes)
5808{
5809 char *codebytes; /* the nbytes bytes after the opcode */
5810 long code; /* calc_binint returns long */
5811 PyObject *py_code; /* code as a Python int */
5812 PyObject *obj; /* the object to push */
5813 PyObject *pair; /* (module_name, class_name) */
5814 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005815 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005816
5817 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005818 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005819 return -1;
5820 code = calc_binint(codebytes, nbytes);
5821 if (code <= 0) { /* note that 0 is forbidden */
5822 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005823 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005824 return -1;
5825 }
5826
5827 /* Look for the code in the cache. */
5828 py_code = PyLong_FromLong(code);
5829 if (py_code == NULL)
5830 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005831 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005832 if (obj != NULL) {
5833 /* Bingo. */
5834 Py_DECREF(py_code);
5835 PDATA_APPEND(self->stack, obj, -1);
5836 return 0;
5837 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005838 if (PyErr_Occurred()) {
5839 Py_DECREF(py_code);
5840 return -1;
5841 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005842
5843 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005844 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005845 if (pair == NULL) {
5846 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005847 if (!PyErr_Occurred()) {
5848 PyErr_Format(PyExc_ValueError, "unregistered extension "
5849 "code %ld", code);
5850 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005851 return -1;
5852 }
5853 /* Since the extension registry is manipulable via Python code,
5854 * confirm that pair is really a 2-tuple of strings.
5855 */
5856 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5857 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5858 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5859 Py_DECREF(py_code);
5860 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5861 "isn't a 2-tuple of strings", code);
5862 return -1;
5863 }
5864 /* Load the object. */
5865 obj = find_class(self, module_name, class_name);
5866 if (obj == NULL) {
5867 Py_DECREF(py_code);
5868 return -1;
5869 }
5870 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005871 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005872 Py_DECREF(py_code);
5873 if (code < 0) {
5874 Py_DECREF(obj);
5875 return -1;
5876 }
5877 PDATA_PUSH(self->stack, obj, -1);
5878 return 0;
5879}
5880
5881static int
5882load_put(UnpicklerObject *self)
5883{
5884 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005885 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005886 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005887 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005888
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005889 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005890 return -1;
5891 if (len < 2)
5892 return bad_readline();
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005893 if (Py_SIZE(self->stack) <= self->stack->fence)
5894 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005895 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005896
5897 key = PyLong_FromString(s, NULL, 10);
5898 if (key == NULL)
5899 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005900 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005901 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005902 if (idx < 0) {
5903 if (!PyErr_Occurred())
5904 PyErr_SetString(PyExc_ValueError,
5905 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005906 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005907 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005908
5909 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005910}
5911
5912static int
5913load_binput(UnpicklerObject *self)
5914{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005915 PyObject *value;
5916 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005917 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005918
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005919 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005920 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005921
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005922 if (Py_SIZE(self->stack) <= self->stack->fence)
5923 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005924 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005925
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005926 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005927
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005928 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005929}
5930
5931static int
5932load_long_binput(UnpicklerObject *self)
5933{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005934 PyObject *value;
5935 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005936 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005937
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005938 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005939 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005940
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005941 if (Py_SIZE(self->stack) <= self->stack->fence)
5942 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005943 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005944
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005945 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005946 if (idx < 0) {
5947 PyErr_SetString(PyExc_ValueError,
5948 "negative LONG_BINPUT argument");
5949 return -1;
5950 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005951
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005952 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005953}
5954
5955static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005956load_memoize(UnpicklerObject *self)
5957{
5958 PyObject *value;
5959
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005960 if (Py_SIZE(self->stack) <= self->stack->fence)
5961 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005962 value = self->stack->data[Py_SIZE(self->stack) - 1];
5963
5964 return _Unpickler_MemoPut(self, self->memo_len, value);
5965}
5966
5967static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005968do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005969{
5970 PyObject *value;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005971 PyObject *slice;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005972 PyObject *list;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005973 PyObject *result;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005974 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005975
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005976 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005977 if (x > len || x <= self->stack->fence)
5978 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005979 if (len == x) /* nothing to do */
5980 return 0;
5981
5982 list = self->stack->data[x - 1];
5983
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005984 if (PyList_CheckExact(list)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005985 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005986 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005987
5988 slice = Pdata_poplist(self->stack, x);
5989 if (!slice)
5990 return -1;
5991 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005992 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005993 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005994 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005995 }
5996 else {
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005997 PyObject *extend_func;
5998 _Py_IDENTIFIER(extend);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005999
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006000 extend_func = _PyObject_GetAttrId(list, &PyId_extend);
6001 if (extend_func != NULL) {
6002 slice = Pdata_poplist(self->stack, x);
6003 if (!slice) {
6004 Py_DECREF(extend_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006005 return -1;
6006 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006007 result = _Pickle_FastCall(extend_func, slice);
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006008 Py_DECREF(extend_func);
6009 if (result == NULL)
6010 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006011 Py_DECREF(result);
6012 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006013 else {
6014 PyObject *append_func;
6015 _Py_IDENTIFIER(append);
6016
6017 /* Even if the PEP 307 requires extend() and append() methods,
6018 fall back on append() if the object has no extend() method
6019 for backward compatibility. */
6020 PyErr_Clear();
6021 append_func = _PyObject_GetAttrId(list, &PyId_append);
6022 if (append_func == NULL)
6023 return -1;
6024 for (i = x; i < len; i++) {
6025 value = self->stack->data[i];
6026 result = _Pickle_FastCall(append_func, value);
6027 if (result == NULL) {
6028 Pdata_clear(self->stack, i + 1);
6029 Py_SIZE(self->stack) = x;
6030 Py_DECREF(append_func);
6031 return -1;
6032 }
6033 Py_DECREF(result);
6034 }
6035 Py_SIZE(self->stack) = x;
6036 Py_DECREF(append_func);
6037 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006038 }
6039
6040 return 0;
6041}
6042
6043static int
6044load_append(UnpicklerObject *self)
6045{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006046 if (Py_SIZE(self->stack) - 1 <= self->stack->fence)
6047 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006048 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006049}
6050
6051static int
6052load_appends(UnpicklerObject *self)
6053{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006054 Py_ssize_t i = marker(self);
6055 if (i < 0)
6056 return -1;
6057 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006058}
6059
6060static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006061do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006062{
6063 PyObject *value, *key;
6064 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006065 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006066 int status = 0;
6067
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006068 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006069 if (x > len || x <= self->stack->fence)
6070 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006071 if (len == x) /* nothing to do */
6072 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02006073 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006074 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006075 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006076 PyErr_SetString(st->UnpicklingError,
6077 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006078 return -1;
6079 }
6080
6081 /* Here, dict does not actually need to be a PyDict; it could be anything
6082 that supports the __setitem__ attribute. */
6083 dict = self->stack->data[x - 1];
6084
6085 for (i = x + 1; i < len; i += 2) {
6086 key = self->stack->data[i - 1];
6087 value = self->stack->data[i];
6088 if (PyObject_SetItem(dict, key, value) < 0) {
6089 status = -1;
6090 break;
6091 }
6092 }
6093
6094 Pdata_clear(self->stack, x);
6095 return status;
6096}
6097
6098static int
6099load_setitem(UnpicklerObject *self)
6100{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006101 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006102}
6103
6104static int
6105load_setitems(UnpicklerObject *self)
6106{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006107 Py_ssize_t i = marker(self);
6108 if (i < 0)
6109 return -1;
6110 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006111}
6112
6113static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006114load_additems(UnpicklerObject *self)
6115{
6116 PyObject *set;
6117 Py_ssize_t mark, len, i;
6118
6119 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006120 if (mark < 0)
6121 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006122 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006123 if (mark > len || mark <= self->stack->fence)
6124 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006125 if (len == mark) /* nothing to do */
6126 return 0;
6127
6128 set = self->stack->data[mark - 1];
6129
6130 if (PySet_Check(set)) {
6131 PyObject *items;
6132 int status;
6133
6134 items = Pdata_poptuple(self->stack, mark);
6135 if (items == NULL)
6136 return -1;
6137
6138 status = _PySet_Update(set, items);
6139 Py_DECREF(items);
6140 return status;
6141 }
6142 else {
6143 PyObject *add_func;
6144 _Py_IDENTIFIER(add);
6145
6146 add_func = _PyObject_GetAttrId(set, &PyId_add);
6147 if (add_func == NULL)
6148 return -1;
6149 for (i = mark; i < len; i++) {
6150 PyObject *result;
6151 PyObject *item;
6152
6153 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006154 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006155 if (result == NULL) {
6156 Pdata_clear(self->stack, i + 1);
6157 Py_SIZE(self->stack) = mark;
6158 return -1;
6159 }
6160 Py_DECREF(result);
6161 }
6162 Py_SIZE(self->stack) = mark;
6163 }
6164
6165 return 0;
6166}
6167
6168static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006169load_build(UnpicklerObject *self)
6170{
6171 PyObject *state, *inst, *slotstate;
6172 PyObject *setstate;
6173 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006174 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006175
6176 /* Stack is ... instance, state. We want to leave instance at
6177 * the stack top, possibly mutated via instance.__setstate__(state).
6178 */
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006179 if (Py_SIZE(self->stack) - 2 < self->stack->fence)
6180 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006181
6182 PDATA_POP(self->stack, state);
6183 if (state == NULL)
6184 return -1;
6185
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006186 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006187
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006188 if (_PyObject_LookupAttrId(inst, &PyId___setstate__, &setstate) < 0) {
6189 Py_DECREF(state);
6190 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006191 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006192 if (setstate != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006193 PyObject *result;
6194
6195 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006196 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006197 Py_DECREF(setstate);
6198 if (result == NULL)
6199 return -1;
6200 Py_DECREF(result);
6201 return 0;
6202 }
6203
6204 /* A default __setstate__. First see whether state embeds a
6205 * slot state dict too (a proto 2 addition).
6206 */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02006207 if (PyTuple_Check(state) && PyTuple_GET_SIZE(state) == 2) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006208 PyObject *tmp = state;
6209
6210 state = PyTuple_GET_ITEM(tmp, 0);
6211 slotstate = PyTuple_GET_ITEM(tmp, 1);
6212 Py_INCREF(state);
6213 Py_INCREF(slotstate);
6214 Py_DECREF(tmp);
6215 }
6216 else
6217 slotstate = NULL;
6218
6219 /* Set inst.__dict__ from the state dict (if any). */
6220 if (state != Py_None) {
6221 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006222 PyObject *d_key, *d_value;
6223 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006224 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006225
6226 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006227 PickleState *st = _Pickle_GetGlobalState();
6228 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006229 goto error;
6230 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006231 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006232 if (dict == NULL)
6233 goto error;
6234
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006235 i = 0;
6236 while (PyDict_Next(state, &i, &d_key, &d_value)) {
6237 /* normally the keys for instance attributes are
6238 interned. we should try to do that here. */
6239 Py_INCREF(d_key);
6240 if (PyUnicode_CheckExact(d_key))
6241 PyUnicode_InternInPlace(&d_key);
6242 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6243 Py_DECREF(d_key);
6244 goto error;
6245 }
6246 Py_DECREF(d_key);
6247 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006248 Py_DECREF(dict);
6249 }
6250
6251 /* Also set instance attributes from the slotstate dict (if any). */
6252 if (slotstate != NULL) {
6253 PyObject *d_key, *d_value;
6254 Py_ssize_t i;
6255
6256 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006257 PickleState *st = _Pickle_GetGlobalState();
6258 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006259 "slot state is not a dictionary");
6260 goto error;
6261 }
6262 i = 0;
6263 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6264 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6265 goto error;
6266 }
6267 }
6268
6269 if (0) {
6270 error:
6271 status = -1;
6272 }
6273
6274 Py_DECREF(state);
6275 Py_XDECREF(slotstate);
6276 return status;
6277}
6278
6279static int
6280load_mark(UnpicklerObject *self)
6281{
6282
6283 /* Note that we split the (pickle.py) stack into two stacks, an
6284 * object stack and a mark stack. Here we push a mark onto the
6285 * mark stack.
6286 */
6287
6288 if ((self->num_marks + 1) >= self->marks_size) {
6289 size_t alloc;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006290
6291 /* Use the size_t type to check for overflow. */
6292 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006293 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006294 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006295 PyErr_NoMemory();
6296 return -1;
6297 }
6298
6299 if (self->marks == NULL)
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006300 self->marks = PyMem_NEW(Py_ssize_t, alloc);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006301 else
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006302 PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
6303 if (self->marks == NULL) {
6304 self->marks_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305 PyErr_NoMemory();
6306 return -1;
6307 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006308 self->marks_size = (Py_ssize_t)alloc;
6309 }
6310
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006311 self->stack->mark_set = 1;
6312 self->marks[self->num_marks++] = self->stack->fence = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006313
6314 return 0;
6315}
6316
6317static int
6318load_reduce(UnpicklerObject *self)
6319{
6320 PyObject *callable = NULL;
6321 PyObject *argtup = NULL;
6322 PyObject *obj = NULL;
6323
6324 PDATA_POP(self->stack, argtup);
6325 if (argtup == NULL)
6326 return -1;
6327 PDATA_POP(self->stack, callable);
6328 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006329 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006330 Py_DECREF(callable);
6331 }
6332 Py_DECREF(argtup);
6333
6334 if (obj == NULL)
6335 return -1;
6336
6337 PDATA_PUSH(self->stack, obj, -1);
6338 return 0;
6339}
6340
6341/* Just raises an error if we don't know the protocol specified. PROTO
6342 * is the first opcode for protocols >= 2.
6343 */
6344static int
6345load_proto(UnpicklerObject *self)
6346{
6347 char *s;
6348 int i;
6349
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006350 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006351 return -1;
6352
6353 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006354 if (i <= HIGHEST_PROTOCOL) {
6355 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006356 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006357 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006358
6359 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6360 return -1;
6361}
6362
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006363static int
6364load_frame(UnpicklerObject *self)
6365{
6366 char *s;
6367 Py_ssize_t frame_len;
6368
6369 if (_Unpickler_Read(self, &s, 8) < 0)
6370 return -1;
6371
6372 frame_len = calc_binsize(s, 8);
6373 if (frame_len < 0) {
6374 PyErr_Format(PyExc_OverflowError,
6375 "FRAME length exceeds system's maximum of %zd bytes",
6376 PY_SSIZE_T_MAX);
6377 return -1;
6378 }
6379
6380 if (_Unpickler_Read(self, &s, frame_len) < 0)
6381 return -1;
6382
6383 /* Rewind to start of frame */
6384 self->next_read_idx -= frame_len;
6385 return 0;
6386}
6387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006388static PyObject *
6389load(UnpicklerObject *self)
6390{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006391 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006392 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006393
6394 self->num_marks = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006395 self->stack->mark_set = 0;
6396 self->stack->fence = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006397 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006398 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006399 Pdata_clear(self->stack, 0);
6400
6401 /* Convenient macros for the dispatch while-switch loop just below. */
6402#define OP(opcode, load_func) \
6403 case opcode: if (load_func(self) < 0) break; continue;
6404
6405#define OP_ARG(opcode, load_func, arg) \
6406 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6407
6408 while (1) {
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006409 if (_Unpickler_Read(self, &s, 1) < 0) {
6410 PickleState *st = _Pickle_GetGlobalState();
6411 if (PyErr_ExceptionMatches(st->UnpicklingError)) {
6412 PyErr_Format(PyExc_EOFError, "Ran out of input");
6413 }
6414 return NULL;
6415 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006416
6417 switch ((enum opcode)s[0]) {
6418 OP(NONE, load_none)
6419 OP(BININT, load_binint)
6420 OP(BININT1, load_binint1)
6421 OP(BININT2, load_binint2)
6422 OP(INT, load_int)
6423 OP(LONG, load_long)
6424 OP_ARG(LONG1, load_counted_long, 1)
6425 OP_ARG(LONG4, load_counted_long, 4)
6426 OP(FLOAT, load_float)
6427 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006428 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6429 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6430 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6431 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6432 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006433 OP(STRING, load_string)
6434 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006435 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6436 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6437 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006438 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6439 OP_ARG(TUPLE1, load_counted_tuple, 1)
6440 OP_ARG(TUPLE2, load_counted_tuple, 2)
6441 OP_ARG(TUPLE3, load_counted_tuple, 3)
6442 OP(TUPLE, load_tuple)
6443 OP(EMPTY_LIST, load_empty_list)
6444 OP(LIST, load_list)
6445 OP(EMPTY_DICT, load_empty_dict)
6446 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006447 OP(EMPTY_SET, load_empty_set)
6448 OP(ADDITEMS, load_additems)
6449 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006450 OP(OBJ, load_obj)
6451 OP(INST, load_inst)
6452 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006453 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006454 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006455 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006456 OP(APPEND, load_append)
6457 OP(APPENDS, load_appends)
6458 OP(BUILD, load_build)
6459 OP(DUP, load_dup)
6460 OP(BINGET, load_binget)
6461 OP(LONG_BINGET, load_long_binget)
6462 OP(GET, load_get)
6463 OP(MARK, load_mark)
6464 OP(BINPUT, load_binput)
6465 OP(LONG_BINPUT, load_long_binput)
6466 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006467 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006468 OP(POP, load_pop)
6469 OP(POP_MARK, load_pop_mark)
6470 OP(SETITEM, load_setitem)
6471 OP(SETITEMS, load_setitems)
6472 OP(PERSID, load_persid)
6473 OP(BINPERSID, load_binpersid)
6474 OP(REDUCE, load_reduce)
6475 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006476 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006477 OP_ARG(EXT1, load_extension, 1)
6478 OP_ARG(EXT2, load_extension, 2)
6479 OP_ARG(EXT4, load_extension, 4)
6480 OP_ARG(NEWTRUE, load_bool, Py_True)
6481 OP_ARG(NEWFALSE, load_bool, Py_False)
6482
6483 case STOP:
6484 break;
6485
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006486 default:
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006487 {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006488 PickleState *st = _Pickle_GetGlobalState();
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006489 unsigned char c = (unsigned char) *s;
6490 if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') {
6491 PyErr_Format(st->UnpicklingError,
6492 "invalid load key, '%c'.", c);
6493 }
6494 else {
6495 PyErr_Format(st->UnpicklingError,
6496 "invalid load key, '\\x%02x'.", c);
6497 }
6498 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006499 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006500 }
6501
6502 break; /* and we are done! */
6503 }
6504
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006505 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006506 return NULL;
6507 }
6508
Victor Stinner2ae57e32013-10-31 13:39:23 +01006509 if (_Unpickler_SkipConsumed(self) < 0)
6510 return NULL;
6511
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006512 PDATA_POP(self->stack, value);
6513 return value;
6514}
6515
Larry Hastings61272b72014-01-07 12:41:53 -08006516/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006517
6518_pickle.Unpickler.load
6519
6520Load a pickle.
6521
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006522Read a pickled object representation from the open file object given
6523in the constructor, and return the reconstituted object hierarchy
6524specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006525[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006526
Larry Hastings3cceb382014-01-04 11:09:09 -08006527static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006528_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006529/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006530{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006531 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006532
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006533 /* Check whether the Unpickler was initialized correctly. This prevents
6534 segfaulting if a subclass overridden __init__ with a function that does
6535 not call Unpickler.__init__(). Here, we simply ensure that self->read
6536 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006537 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006538 PickleState *st = _Pickle_GetGlobalState();
6539 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006540 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006541 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006542 return NULL;
6543 }
6544
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006545 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006546}
6547
6548/* The name of find_class() is misleading. In newer pickle protocols, this
6549 function is used for loading any global (i.e., functions), not just
6550 classes. The name is kept only for backward compatibility. */
6551
Larry Hastings61272b72014-01-07 12:41:53 -08006552/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006553
6554_pickle.Unpickler.find_class
6555
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006556 module_name: object
6557 global_name: object
6558 /
6559
6560Return an object from a specified module.
6561
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006562If necessary, the module will be imported. Subclasses may override
6563this method (e.g. to restrict unpickling of arbitrary classes and
6564functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006565
6566This method is called whenever a class or a function object is
6567needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006568[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006569
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006570static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006571_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
6572 PyObject *module_name,
6573 PyObject *global_name)
6574/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006575{
6576 PyObject *global;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006577 PyObject *module;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006578
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006579 /* Try to map the old names used in Python 2.x to the new ones used in
6580 Python 3.x. We do this only with old pickle protocols and when the
6581 user has not disabled the feature. */
6582 if (self->proto < 3 && self->fix_imports) {
6583 PyObject *key;
6584 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006585 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006586
6587 /* Check if the global (i.e., a function or a class) was renamed
6588 or moved to another module. */
6589 key = PyTuple_Pack(2, module_name, global_name);
6590 if (key == NULL)
6591 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006592 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006593 Py_DECREF(key);
6594 if (item) {
6595 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6596 PyErr_Format(PyExc_RuntimeError,
6597 "_compat_pickle.NAME_MAPPING values should be "
6598 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6599 return NULL;
6600 }
6601 module_name = PyTuple_GET_ITEM(item, 0);
6602 global_name = PyTuple_GET_ITEM(item, 1);
6603 if (!PyUnicode_Check(module_name) ||
6604 !PyUnicode_Check(global_name)) {
6605 PyErr_Format(PyExc_RuntimeError,
6606 "_compat_pickle.NAME_MAPPING values should be "
6607 "pairs of str, not (%.200s, %.200s)",
6608 Py_TYPE(module_name)->tp_name,
6609 Py_TYPE(global_name)->tp_name);
6610 return NULL;
6611 }
6612 }
6613 else if (PyErr_Occurred()) {
6614 return NULL;
6615 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03006616 else {
6617 /* Check if the module was renamed. */
6618 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
6619 if (item) {
6620 if (!PyUnicode_Check(item)) {
6621 PyErr_Format(PyExc_RuntimeError,
6622 "_compat_pickle.IMPORT_MAPPING values should be "
6623 "strings, not %.200s", Py_TYPE(item)->tp_name);
6624 return NULL;
6625 }
6626 module_name = item;
6627 }
6628 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006629 return NULL;
6630 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006631 }
6632 }
6633
Eric Snow3f9eee62017-09-15 16:35:20 -06006634 module = PyImport_GetModule(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006635 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006636 if (PyErr_Occurred())
6637 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006638 module = PyImport_Import(module_name);
6639 if (module == NULL)
6640 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006641 }
Eric Snow3f9eee62017-09-15 16:35:20 -06006642 global = getattribute(module, global_name, self->proto >= 4);
6643 Py_DECREF(module);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006644 return global;
6645}
6646
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006647/*[clinic input]
6648
6649_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6650
6651Returns size in memory, in bytes.
6652[clinic start generated code]*/
6653
6654static Py_ssize_t
6655_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6656/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6657{
6658 Py_ssize_t res;
6659
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02006660 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006661 if (self->memo != NULL)
6662 res += self->memo_size * sizeof(PyObject *);
6663 if (self->marks != NULL)
6664 res += self->marks_size * sizeof(Py_ssize_t);
6665 if (self->input_line != NULL)
6666 res += strlen(self->input_line) + 1;
6667 if (self->encoding != NULL)
6668 res += strlen(self->encoding) + 1;
6669 if (self->errors != NULL)
6670 res += strlen(self->errors) + 1;
6671 return res;
6672}
6673
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006674static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006675 _PICKLE_UNPICKLER_LOAD_METHODDEF
6676 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006677 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006678 {NULL, NULL} /* sentinel */
6679};
6680
6681static void
6682Unpickler_dealloc(UnpicklerObject *self)
6683{
6684 PyObject_GC_UnTrack((PyObject *)self);
6685 Py_XDECREF(self->readline);
6686 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006687 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006688 Py_XDECREF(self->stack);
6689 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006690 if (self->buffer.buf != NULL) {
6691 PyBuffer_Release(&self->buffer);
6692 self->buffer.buf = NULL;
6693 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006694
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006695 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006696 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006697 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006698 PyMem_Free(self->encoding);
6699 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006700
6701 Py_TYPE(self)->tp_free((PyObject *)self);
6702}
6703
6704static int
6705Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6706{
6707 Py_VISIT(self->readline);
6708 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006709 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006710 Py_VISIT(self->stack);
6711 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006712 return 0;
6713}
6714
6715static int
6716Unpickler_clear(UnpicklerObject *self)
6717{
6718 Py_CLEAR(self->readline);
6719 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006720 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006721 Py_CLEAR(self->stack);
6722 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006723 if (self->buffer.buf != NULL) {
6724 PyBuffer_Release(&self->buffer);
6725 self->buffer.buf = NULL;
6726 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006727
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006728 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006729 PyMem_Free(self->marks);
6730 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006731 PyMem_Free(self->input_line);
6732 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006733 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006734 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006735 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006736 self->errors = NULL;
6737
6738 return 0;
6739}
6740
Larry Hastings61272b72014-01-07 12:41:53 -08006741/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006742
6743_pickle.Unpickler.__init__
6744
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006745 file: object
6746 *
6747 fix_imports: bool = True
6748 encoding: str = 'ASCII'
6749 errors: str = 'strict'
6750
6751This takes a binary file for reading a pickle data stream.
6752
6753The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006754protocol argument is needed. Bytes past the pickled object's
6755representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006756
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006757The argument *file* must have two methods, a read() method that takes
6758an integer argument, and a readline() method that requires no
6759arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00006760binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006761other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006762
6763Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00006764which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006765generated by Python 2. If *fix_imports* is True, pickle will try to
6766map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006767*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006768instances pickled by Python 2; these default to 'ASCII' and 'strict',
6769respectively. The *encoding* can be 'bytes' to read these 8-bit
6770string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006771[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006772
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006773static int
Larry Hastings89964c42015-04-14 18:07:59 -04006774_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6775 int fix_imports, const char *encoding,
6776 const char *errors)
Martin Panter46f50722016-05-26 05:35:26 +00006777/*[clinic end generated code: output=e2c8ce748edc57b0 input=f9b7da04f5f4f335]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006778{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006779 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006780
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006781 /* In case of multiple __init__() calls, clear previous content. */
6782 if (self->read != NULL)
6783 (void)Unpickler_clear(self);
6784
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006785 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006786 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006787
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006788 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006789 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006790
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006791 self->fix_imports = fix_imports;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006792
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006793 if (init_method_ref((PyObject *)self, &PyId_persistent_load,
6794 &self->pers_func, &self->pers_func_self) < 0)
6795 {
6796 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006797 }
6798
6799 self->stack = (Pdata *)Pdata_New();
6800 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006801 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006802
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006803 self->memo_size = 32;
6804 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006805 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006806 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006807
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006808 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006809
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006810 return 0;
6811}
6812
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006813
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006814/* Define a proxy object for the Unpickler's internal memo object. This is to
6815 * avoid breaking code like:
6816 * unpickler.memo.clear()
6817 * and
6818 * unpickler.memo = saved_memo
6819 * Is this a good idea? Not really, but we don't want to break code that uses
6820 * it. Note that we don't implement the entire mapping API here. This is
6821 * intentional, as these should be treated as black-box implementation details.
6822 *
6823 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006824 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006825 */
6826
Larry Hastings61272b72014-01-07 12:41:53 -08006827/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006828_pickle.UnpicklerMemoProxy.clear
6829
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006830Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006831[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006832
Larry Hastings3cceb382014-01-04 11:09:09 -08006833static PyObject *
6834_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006835/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006836{
6837 _Unpickler_MemoCleanup(self->unpickler);
6838 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6839 if (self->unpickler->memo == NULL)
6840 return NULL;
6841 Py_RETURN_NONE;
6842}
6843
Larry Hastings61272b72014-01-07 12:41:53 -08006844/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006845_pickle.UnpicklerMemoProxy.copy
6846
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006847Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006848[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006849
Larry Hastings3cceb382014-01-04 11:09:09 -08006850static PyObject *
6851_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006852/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006853{
6854 Py_ssize_t i;
6855 PyObject *new_memo = PyDict_New();
6856 if (new_memo == NULL)
6857 return NULL;
6858
6859 for (i = 0; i < self->unpickler->memo_size; i++) {
6860 int status;
6861 PyObject *key, *value;
6862
6863 value = self->unpickler->memo[i];
6864 if (value == NULL)
6865 continue;
6866
6867 key = PyLong_FromSsize_t(i);
6868 if (key == NULL)
6869 goto error;
6870 status = PyDict_SetItem(new_memo, key, value);
6871 Py_DECREF(key);
6872 if (status < 0)
6873 goto error;
6874 }
6875 return new_memo;
6876
6877error:
6878 Py_DECREF(new_memo);
6879 return NULL;
6880}
6881
Larry Hastings61272b72014-01-07 12:41:53 -08006882/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006883_pickle.UnpicklerMemoProxy.__reduce__
6884
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006885Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006886[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006887
Larry Hastings3cceb382014-01-04 11:09:09 -08006888static PyObject *
6889_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006890/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006891{
6892 PyObject *reduce_value;
6893 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006894 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006895 if (contents == NULL)
6896 return NULL;
6897
6898 reduce_value = PyTuple_New(2);
6899 if (reduce_value == NULL) {
6900 Py_DECREF(contents);
6901 return NULL;
6902 }
6903 constructor_args = PyTuple_New(1);
6904 if (constructor_args == NULL) {
6905 Py_DECREF(contents);
6906 Py_DECREF(reduce_value);
6907 return NULL;
6908 }
6909 PyTuple_SET_ITEM(constructor_args, 0, contents);
6910 Py_INCREF((PyObject *)&PyDict_Type);
6911 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6912 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6913 return reduce_value;
6914}
6915
6916static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006917 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6918 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6919 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006920 {NULL, NULL} /* sentinel */
6921};
6922
6923static void
6924UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6925{
6926 PyObject_GC_UnTrack(self);
6927 Py_XDECREF(self->unpickler);
6928 PyObject_GC_Del((PyObject *)self);
6929}
6930
6931static int
6932UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6933 visitproc visit, void *arg)
6934{
6935 Py_VISIT(self->unpickler);
6936 return 0;
6937}
6938
6939static int
6940UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6941{
6942 Py_CLEAR(self->unpickler);
6943 return 0;
6944}
6945
6946static PyTypeObject UnpicklerMemoProxyType = {
6947 PyVarObject_HEAD_INIT(NULL, 0)
6948 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6949 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6950 0,
6951 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6952 0, /* tp_print */
6953 0, /* tp_getattr */
6954 0, /* tp_setattr */
6955 0, /* tp_compare */
6956 0, /* tp_repr */
6957 0, /* tp_as_number */
6958 0, /* tp_as_sequence */
6959 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006960 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006961 0, /* tp_call */
6962 0, /* tp_str */
6963 PyObject_GenericGetAttr, /* tp_getattro */
6964 PyObject_GenericSetAttr, /* tp_setattro */
6965 0, /* tp_as_buffer */
6966 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6967 0, /* tp_doc */
6968 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6969 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6970 0, /* tp_richcompare */
6971 0, /* tp_weaklistoffset */
6972 0, /* tp_iter */
6973 0, /* tp_iternext */
6974 unpicklerproxy_methods, /* tp_methods */
6975};
6976
6977static PyObject *
6978UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6979{
6980 UnpicklerMemoProxyObject *self;
6981
6982 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6983 &UnpicklerMemoProxyType);
6984 if (self == NULL)
6985 return NULL;
6986 Py_INCREF(unpickler);
6987 self->unpickler = unpickler;
6988 PyObject_GC_Track(self);
6989 return (PyObject *)self;
6990}
6991
6992/*****************************************************************************/
6993
6994
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006995static PyObject *
6996Unpickler_get_memo(UnpicklerObject *self)
6997{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006998 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006999}
7000
7001static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007002Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007003{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007004 PyObject **new_memo;
7005 Py_ssize_t new_memo_size = 0;
7006 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007007
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007008 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007009 PyErr_SetString(PyExc_TypeError,
7010 "attribute deletion is not supported");
7011 return -1;
7012 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007013
7014 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
7015 UnpicklerObject *unpickler =
7016 ((UnpicklerMemoProxyObject *)obj)->unpickler;
7017
7018 new_memo_size = unpickler->memo_size;
7019 new_memo = _Unpickler_NewMemo(new_memo_size);
7020 if (new_memo == NULL)
7021 return -1;
7022
7023 for (i = 0; i < new_memo_size; i++) {
7024 Py_XINCREF(unpickler->memo[i]);
7025 new_memo[i] = unpickler->memo[i];
7026 }
7027 }
7028 else if (PyDict_Check(obj)) {
7029 Py_ssize_t i = 0;
7030 PyObject *key, *value;
7031
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02007032 new_memo_size = PyDict_GET_SIZE(obj);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007033 new_memo = _Unpickler_NewMemo(new_memo_size);
7034 if (new_memo == NULL)
7035 return -1;
7036
7037 while (PyDict_Next(obj, &i, &key, &value)) {
7038 Py_ssize_t idx;
7039 if (!PyLong_Check(key)) {
7040 PyErr_SetString(PyExc_TypeError,
7041 "memo key must be integers");
7042 goto error;
7043 }
7044 idx = PyLong_AsSsize_t(key);
7045 if (idx == -1 && PyErr_Occurred())
7046 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02007047 if (idx < 0) {
7048 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02007049 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02007050 goto error;
7051 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007052 if (_Unpickler_MemoPut(self, idx, value) < 0)
7053 goto error;
7054 }
7055 }
7056 else {
7057 PyErr_Format(PyExc_TypeError,
7058 "'memo' attribute must be an UnpicklerMemoProxy object"
7059 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007060 return -1;
7061 }
7062
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007063 _Unpickler_MemoCleanup(self);
7064 self->memo_size = new_memo_size;
7065 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007066
7067 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007068
7069 error:
7070 if (new_memo_size) {
7071 i = new_memo_size;
7072 while (--i >= 0) {
7073 Py_XDECREF(new_memo[i]);
7074 }
7075 PyMem_FREE(new_memo);
7076 }
7077 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007078}
7079
7080static PyObject *
7081Unpickler_get_persload(UnpicklerObject *self)
7082{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007083 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007084 PyErr_SetString(PyExc_AttributeError, "persistent_load");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007085 return NULL;
7086 }
7087 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007088}
7089
7090static int
7091Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
7092{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007093 if (value == NULL) {
7094 PyErr_SetString(PyExc_TypeError,
7095 "attribute deletion is not supported");
7096 return -1;
7097 }
7098 if (!PyCallable_Check(value)) {
7099 PyErr_SetString(PyExc_TypeError,
7100 "persistent_load must be a callable taking "
7101 "one argument");
7102 return -1;
7103 }
7104
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007105 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007106 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03007107 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007108
7109 return 0;
7110}
7111
7112static PyGetSetDef Unpickler_getsets[] = {
7113 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
7114 {"persistent_load", (getter)Unpickler_get_persload,
7115 (setter)Unpickler_set_persload},
7116 {NULL}
7117};
7118
7119static PyTypeObject Unpickler_Type = {
7120 PyVarObject_HEAD_INIT(NULL, 0)
7121 "_pickle.Unpickler", /*tp_name*/
7122 sizeof(UnpicklerObject), /*tp_basicsize*/
7123 0, /*tp_itemsize*/
7124 (destructor)Unpickler_dealloc, /*tp_dealloc*/
7125 0, /*tp_print*/
7126 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007127 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00007128 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007129 0, /*tp_repr*/
7130 0, /*tp_as_number*/
7131 0, /*tp_as_sequence*/
7132 0, /*tp_as_mapping*/
7133 0, /*tp_hash*/
7134 0, /*tp_call*/
7135 0, /*tp_str*/
7136 0, /*tp_getattro*/
7137 0, /*tp_setattro*/
7138 0, /*tp_as_buffer*/
7139 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007140 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007141 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7142 (inquiry)Unpickler_clear, /*tp_clear*/
7143 0, /*tp_richcompare*/
7144 0, /*tp_weaklistoffset*/
7145 0, /*tp_iter*/
7146 0, /*tp_iternext*/
7147 Unpickler_methods, /*tp_methods*/
7148 0, /*tp_members*/
7149 Unpickler_getsets, /*tp_getset*/
7150 0, /*tp_base*/
7151 0, /*tp_dict*/
7152 0, /*tp_descr_get*/
7153 0, /*tp_descr_set*/
7154 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007155 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007156 PyType_GenericAlloc, /*tp_alloc*/
7157 PyType_GenericNew, /*tp_new*/
7158 PyObject_GC_Del, /*tp_free*/
7159 0, /*tp_is_gc*/
7160};
7161
Larry Hastings61272b72014-01-07 12:41:53 -08007162/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007163
7164_pickle.dump
7165
7166 obj: object
7167 file: object
7168 protocol: object = NULL
7169 *
7170 fix_imports: bool = True
7171
7172Write a pickled representation of obj to the open file object file.
7173
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007174This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7175be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007176
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007177The optional *protocol* argument tells the pickler to use the given
7178protocol supported protocols are 0, 1, 2, 3 and 4. The default
7179protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007180
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007181Specifying a negative protocol version selects the highest protocol
7182version supported. The higher the protocol used, the more recent the
7183version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007184
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007185The *file* argument must have a write() method that accepts a single
7186bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00007187writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007188this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007189
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007190If *fix_imports* is True and protocol is less than 3, pickle will try
7191to map the new Python 3 names to the old module names used in Python
71922, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007193[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007194
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007195static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007196_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
Larry Hastings89964c42015-04-14 18:07:59 -04007197 PyObject *protocol, int fix_imports)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007198/*[clinic end generated code: output=a4774d5fde7d34de input=830f8a64cef6f042]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007199{
7200 PicklerObject *pickler = _Pickler_New();
7201
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007202 if (pickler == NULL)
7203 return NULL;
7204
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007205 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007206 goto error;
7207
7208 if (_Pickler_SetOutputStream(pickler, file) < 0)
7209 goto error;
7210
7211 if (dump(pickler, obj) < 0)
7212 goto error;
7213
7214 if (_Pickler_FlushToFile(pickler) < 0)
7215 goto error;
7216
7217 Py_DECREF(pickler);
7218 Py_RETURN_NONE;
7219
7220 error:
7221 Py_XDECREF(pickler);
7222 return NULL;
7223}
7224
Larry Hastings61272b72014-01-07 12:41:53 -08007225/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007226
7227_pickle.dumps
7228
7229 obj: object
7230 protocol: object = NULL
7231 *
7232 fix_imports: bool = True
7233
7234Return the pickled representation of the object as a bytes object.
7235
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007236The optional *protocol* argument tells the pickler to use the given
7237protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7238protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007239
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007240Specifying a negative protocol version selects the highest protocol
7241version supported. The higher the protocol used, the more recent the
7242version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007243
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007244If *fix_imports* is True and *protocol* is less than 3, pickle will
7245try to map the new Python 3 names to the old module names used in
7246Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007247[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007248
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007249static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007250_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
Larry Hastings89964c42015-04-14 18:07:59 -04007251 int fix_imports)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007252/*[clinic end generated code: output=d75d5cda456fd261 input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007253{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007254 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007255 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007256
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007257 if (pickler == NULL)
7258 return NULL;
7259
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007260 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007261 goto error;
7262
7263 if (dump(pickler, obj) < 0)
7264 goto error;
7265
7266 result = _Pickler_GetString(pickler);
7267 Py_DECREF(pickler);
7268 return result;
7269
7270 error:
7271 Py_XDECREF(pickler);
7272 return NULL;
7273}
7274
Larry Hastings61272b72014-01-07 12:41:53 -08007275/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007276
7277_pickle.load
7278
7279 file: object
7280 *
7281 fix_imports: bool = True
7282 encoding: str = 'ASCII'
7283 errors: str = 'strict'
7284
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007285Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007286
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007287This is equivalent to ``Unpickler(file).load()``, but may be more
7288efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007289
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007290The protocol version of the pickle is detected automatically, so no
7291protocol argument is needed. Bytes past the pickled object's
7292representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007293
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007294The argument *file* must have two methods, a read() method that takes
7295an integer argument, and a readline() method that requires no
7296arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007297binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007298other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007299
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007300Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007301which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007302generated by Python 2. If *fix_imports* is True, pickle will try to
7303map the old Python 2 names to the new names used in Python 3. The
7304*encoding* and *errors* tell pickle how to decode 8-bit string
7305instances pickled by Python 2; these default to 'ASCII' and 'strict',
7306respectively. The *encoding* can be 'bytes' to read these 8-bit
7307string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007308[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007309
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007310static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007311_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
Larry Hastings89964c42015-04-14 18:07:59 -04007312 const char *encoding, const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007313/*[clinic end generated code: output=69e298160285199e input=01b44dd3fc07afa7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007314{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007315 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007316 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007317
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007318 if (unpickler == NULL)
7319 return NULL;
7320
7321 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7322 goto error;
7323
7324 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7325 goto error;
7326
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007327 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007328
7329 result = load(unpickler);
7330 Py_DECREF(unpickler);
7331 return result;
7332
7333 error:
7334 Py_XDECREF(unpickler);
7335 return NULL;
7336}
7337
Larry Hastings61272b72014-01-07 12:41:53 -08007338/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007339
7340_pickle.loads
7341
7342 data: object
7343 *
7344 fix_imports: bool = True
7345 encoding: str = 'ASCII'
7346 errors: str = 'strict'
7347
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007348Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007349
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007350The protocol version of the pickle is detected automatically, so no
7351protocol argument is needed. Bytes past the pickled object's
7352representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007353
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007354Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007355which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007356generated by Python 2. If *fix_imports* is True, pickle will try to
7357map the old Python 2 names to the new names used in Python 3. The
7358*encoding* and *errors* tell pickle how to decode 8-bit string
7359instances pickled by Python 2; these default to 'ASCII' and 'strict',
7360respectively. The *encoding* can be 'bytes' to read these 8-bit
7361string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007362[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007363
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007364static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007365_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
Larry Hastings89964c42015-04-14 18:07:59 -04007366 const char *encoding, const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007367/*[clinic end generated code: output=1e7cb2343f2c440f input=70605948a719feb9]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007368{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007369 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007370 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007371
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007372 if (unpickler == NULL)
7373 return NULL;
7374
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007375 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007376 goto error;
7377
7378 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7379 goto error;
7380
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007381 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007382
7383 result = load(unpickler);
7384 Py_DECREF(unpickler);
7385 return result;
7386
7387 error:
7388 Py_XDECREF(unpickler);
7389 return NULL;
7390}
7391
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007392static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007393 _PICKLE_DUMP_METHODDEF
7394 _PICKLE_DUMPS_METHODDEF
7395 _PICKLE_LOAD_METHODDEF
7396 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007397 {NULL, NULL} /* sentinel */
7398};
7399
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007400static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007401pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007402{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007403 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007404 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007405}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007406
Stefan Krahf483b0f2013-12-14 13:43:10 +01007407static void
7408pickle_free(PyObject *m)
7409{
7410 _Pickle_ClearState(_Pickle_GetState(m));
7411}
7412
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007413static int
7414pickle_traverse(PyObject *m, visitproc visit, void *arg)
7415{
7416 PickleState *st = _Pickle_GetState(m);
7417 Py_VISIT(st->PickleError);
7418 Py_VISIT(st->PicklingError);
7419 Py_VISIT(st->UnpicklingError);
7420 Py_VISIT(st->dispatch_table);
7421 Py_VISIT(st->extension_registry);
7422 Py_VISIT(st->extension_cache);
7423 Py_VISIT(st->inverted_registry);
7424 Py_VISIT(st->name_mapping_2to3);
7425 Py_VISIT(st->import_mapping_2to3);
7426 Py_VISIT(st->name_mapping_3to2);
7427 Py_VISIT(st->import_mapping_3to2);
7428 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007429 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007430 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007431}
7432
7433static struct PyModuleDef _picklemodule = {
7434 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007435 "_pickle", /* m_name */
7436 pickle_module_doc, /* m_doc */
7437 sizeof(PickleState), /* m_size */
7438 pickle_methods, /* m_methods */
7439 NULL, /* m_reload */
7440 pickle_traverse, /* m_traverse */
7441 pickle_clear, /* m_clear */
7442 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007443};
7444
7445PyMODINIT_FUNC
7446PyInit__pickle(void)
7447{
7448 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007449 PickleState *st;
7450
7451 m = PyState_FindModule(&_picklemodule);
7452 if (m) {
7453 Py_INCREF(m);
7454 return m;
7455 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007456
7457 if (PyType_Ready(&Unpickler_Type) < 0)
7458 return NULL;
7459 if (PyType_Ready(&Pickler_Type) < 0)
7460 return NULL;
7461 if (PyType_Ready(&Pdata_Type) < 0)
7462 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007463 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7464 return NULL;
7465 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7466 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007467
7468 /* Create the module and add the functions. */
7469 m = PyModule_Create(&_picklemodule);
7470 if (m == NULL)
7471 return NULL;
7472
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007473 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007474 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7475 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007476 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007477 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7478 return NULL;
7479
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007480 st = _Pickle_GetState(m);
7481
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007482 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007483 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7484 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007485 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007486 st->PicklingError = \
7487 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7488 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007489 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007490 st->UnpicklingError = \
7491 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7492 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007493 return NULL;
7494
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007495 Py_INCREF(st->PickleError);
7496 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007497 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007498 Py_INCREF(st->PicklingError);
7499 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007500 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007501 Py_INCREF(st->UnpicklingError);
7502 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007503 return NULL;
7504
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007505 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007506 return NULL;
7507
7508 return m;
7509}