blob: 34e11bd5f820cdb9e9b08c031e934f2f0efc5dfd [file] [log] [blame]
Victor Stinner5c75f372019-04-17 23:02:26 +02001/* pickle accelerator C extensor: _pickle module.
2 *
3 * It is built as a built-in module (Py_BUILD_CORE_BUILTIN define) on Windows
4 * and as an extension module (Py_BUILD_CORE_MODULE define) on other
5 * platforms. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06006
Victor Stinner5c75f372019-04-17 23:02:26 +02007#if !defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE_MODULE)
8# error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#endif
10
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000011#include "Python.h"
12#include "structmember.h"
13
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -080014PyDoc_STRVAR(pickle_module_doc,
15"Optimized C implementation for the Python pickle module.");
16
Larry Hastings61272b72014-01-07 12:41:53 -080017/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080018module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -080019class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
20class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
21class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
22class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080023[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030024/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080025
Łukasz Langac51d8c92018-04-03 23:06:53 -070026/* Bump HIGHEST_PROTOCOL when new opcodes are added to the pickle protocol.
27 Bump DEFAULT_PROTOCOL only when the oldest still supported version of Python
28 already includes it. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000029enum {
Antoine Pitrou91f43802019-05-26 17:10:09 +020030 HIGHEST_PROTOCOL = 5,
Łukasz Langac51d8c92018-04-03 23:06:53 -070031 DEFAULT_PROTOCOL = 4
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000032};
33
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000034/* Pickle opcodes. These must be kept updated with pickle.py.
35 Extensive docs are in pickletools.py. */
36enum opcode {
37 MARK = '(',
38 STOP = '.',
39 POP = '0',
40 POP_MARK = '1',
41 DUP = '2',
42 FLOAT = 'F',
43 INT = 'I',
44 BININT = 'J',
45 BININT1 = 'K',
46 LONG = 'L',
47 BININT2 = 'M',
48 NONE = 'N',
49 PERSID = 'P',
50 BINPERSID = 'Q',
51 REDUCE = 'R',
52 STRING = 'S',
53 BINSTRING = 'T',
54 SHORT_BINSTRING = 'U',
55 UNICODE = 'V',
56 BINUNICODE = 'X',
57 APPEND = 'a',
58 BUILD = 'b',
59 GLOBAL = 'c',
60 DICT = 'd',
61 EMPTY_DICT = '}',
62 APPENDS = 'e',
63 GET = 'g',
64 BINGET = 'h',
65 INST = 'i',
66 LONG_BINGET = 'j',
67 LIST = 'l',
68 EMPTY_LIST = ']',
69 OBJ = 'o',
70 PUT = 'p',
71 BINPUT = 'q',
72 LONG_BINPUT = 'r',
73 SETITEM = 's',
74 TUPLE = 't',
75 EMPTY_TUPLE = ')',
76 SETITEMS = 'u',
77 BINFLOAT = 'G',
78
79 /* Protocol 2. */
80 PROTO = '\x80',
81 NEWOBJ = '\x81',
82 EXT1 = '\x82',
83 EXT2 = '\x83',
84 EXT4 = '\x84',
85 TUPLE1 = '\x85',
86 TUPLE2 = '\x86',
87 TUPLE3 = '\x87',
88 NEWTRUE = '\x88',
89 NEWFALSE = '\x89',
90 LONG1 = '\x8a',
91 LONG4 = '\x8b',
92
93 /* Protocol 3 (Python 3.x) */
94 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010095 SHORT_BINBYTES = 'C',
96
97 /* Protocol 4 */
98 SHORT_BINUNICODE = '\x8c',
99 BINUNICODE8 = '\x8d',
100 BINBYTES8 = '\x8e',
101 EMPTY_SET = '\x8f',
102 ADDITEMS = '\x90',
103 FROZENSET = '\x91',
104 NEWOBJ_EX = '\x92',
105 STACK_GLOBAL = '\x93',
106 MEMOIZE = '\x94',
Antoine Pitrou91f43802019-05-26 17:10:09 +0200107 FRAME = '\x95',
108
109 /* Protocol 5 */
110 BYTEARRAY8 = '\x96',
111 NEXT_BUFFER = '\x97',
112 READONLY_BUFFER = '\x98'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000113};
114
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000115enum {
116 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
117 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
118 break if this gets out of synch with pickle.py, but it's unclear that would
119 help anything either. */
120 BATCHSIZE = 1000,
121
122 /* Nesting limit until Pickler, when running in "fast mode", starts
123 checking for self-referential data-structures. */
124 FAST_NESTING_LIMIT = 50,
125
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000126 /* Initial size of the write buffer of Pickler. */
127 WRITE_BUF_SIZE = 4096,
128
Antoine Pitrou04248a82010-10-12 20:51:21 +0000129 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100130 PREFETCH = 8192 * 16,
131
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200132 FRAME_SIZE_MIN = 4,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100133 FRAME_SIZE_TARGET = 64 * 1024,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100134 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000135};
136
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800137/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000138
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800139/* State of the pickle module, per PEP 3121. */
140typedef struct {
141 /* Exception classes for pickle. */
142 PyObject *PickleError;
143 PyObject *PicklingError;
144 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800145
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800146 /* copyreg.dispatch_table, {type_object: pickling_function} */
147 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000148
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800149 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000150
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800151 /* copyreg._extension_registry, {(module_name, function_name): code} */
152 PyObject *extension_registry;
153 /* copyreg._extension_cache, {code: object} */
154 PyObject *extension_cache;
155 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
156 PyObject *inverted_registry;
157
158 /* Import mappings for compatibility with Python 2.x */
159
160 /* _compat_pickle.NAME_MAPPING,
161 {(oldmodule, oldname): (newmodule, newname)} */
162 PyObject *name_mapping_2to3;
163 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
164 PyObject *import_mapping_2to3;
165 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
166 PyObject *name_mapping_3to2;
167 PyObject *import_mapping_3to2;
168
169 /* codecs.encode, used for saving bytes in older protocols */
170 PyObject *codecs_encode;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300171 /* builtins.getattr, used for saving nested names with protocol < 4 */
172 PyObject *getattr;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300173 /* functools.partial, used for implementing __newobj_ex__ with protocols
174 2 and 3 */
175 PyObject *partial;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800176} PickleState;
177
178/* Forward declaration of the _pickle module definition. */
179static struct PyModuleDef _picklemodule;
180
181/* Given a module object, get its per-module state. */
182static PickleState *
183_Pickle_GetState(PyObject *module)
184{
185 return (PickleState *)PyModule_GetState(module);
186}
187
188/* Find the module instance imported in the currently running sub-interpreter
189 and get its state. */
190static PickleState *
191_Pickle_GetGlobalState(void)
192{
193 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
194}
195
196/* Clear the given pickle module state. */
197static void
198_Pickle_ClearState(PickleState *st)
199{
200 Py_CLEAR(st->PickleError);
201 Py_CLEAR(st->PicklingError);
202 Py_CLEAR(st->UnpicklingError);
203 Py_CLEAR(st->dispatch_table);
204 Py_CLEAR(st->extension_registry);
205 Py_CLEAR(st->extension_cache);
206 Py_CLEAR(st->inverted_registry);
207 Py_CLEAR(st->name_mapping_2to3);
208 Py_CLEAR(st->import_mapping_2to3);
209 Py_CLEAR(st->name_mapping_3to2);
210 Py_CLEAR(st->import_mapping_3to2);
211 Py_CLEAR(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300212 Py_CLEAR(st->getattr);
Victor Stinner9ba97df2015-11-17 12:15:07 +0100213 Py_CLEAR(st->partial);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800214}
215
216/* Initialize the given pickle module state. */
217static int
218_Pickle_InitState(PickleState *st)
219{
220 PyObject *copyreg = NULL;
221 PyObject *compat_pickle = NULL;
222 PyObject *codecs = NULL;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300223 PyObject *functools = NULL;
Serhiy Storchakabb86bf42018-12-11 08:28:18 +0200224 _Py_IDENTIFIER(getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800225
Serhiy Storchakabb86bf42018-12-11 08:28:18 +0200226 st->getattr = _PyEval_GetBuiltinId(&PyId_getattr);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300227 if (st->getattr == NULL)
228 goto error;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300229
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800230 copyreg = PyImport_ImportModule("copyreg");
231 if (!copyreg)
232 goto error;
233 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
234 if (!st->dispatch_table)
235 goto error;
236 if (!PyDict_CheckExact(st->dispatch_table)) {
237 PyErr_Format(PyExc_RuntimeError,
238 "copyreg.dispatch_table should be a dict, not %.200s",
239 Py_TYPE(st->dispatch_table)->tp_name);
240 goto error;
241 }
242 st->extension_registry = \
243 PyObject_GetAttrString(copyreg, "_extension_registry");
244 if (!st->extension_registry)
245 goto error;
246 if (!PyDict_CheckExact(st->extension_registry)) {
247 PyErr_Format(PyExc_RuntimeError,
248 "copyreg._extension_registry should be a dict, "
249 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
250 goto error;
251 }
252 st->inverted_registry = \
253 PyObject_GetAttrString(copyreg, "_inverted_registry");
254 if (!st->inverted_registry)
255 goto error;
256 if (!PyDict_CheckExact(st->inverted_registry)) {
257 PyErr_Format(PyExc_RuntimeError,
258 "copyreg._inverted_registry should be a dict, "
259 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
260 goto error;
261 }
262 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
263 if (!st->extension_cache)
264 goto error;
265 if (!PyDict_CheckExact(st->extension_cache)) {
266 PyErr_Format(PyExc_RuntimeError,
267 "copyreg._extension_cache should be a dict, "
268 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
269 goto error;
270 }
271 Py_CLEAR(copyreg);
272
273 /* Load the 2.x -> 3.x stdlib module mapping tables */
274 compat_pickle = PyImport_ImportModule("_compat_pickle");
275 if (!compat_pickle)
276 goto error;
277 st->name_mapping_2to3 = \
278 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
279 if (!st->name_mapping_2to3)
280 goto error;
281 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
282 PyErr_Format(PyExc_RuntimeError,
283 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
284 Py_TYPE(st->name_mapping_2to3)->tp_name);
285 goto error;
286 }
287 st->import_mapping_2to3 = \
288 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
289 if (!st->import_mapping_2to3)
290 goto error;
291 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
292 PyErr_Format(PyExc_RuntimeError,
293 "_compat_pickle.IMPORT_MAPPING should be a dict, "
294 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
295 goto error;
296 }
297 /* ... and the 3.x -> 2.x mapping tables */
298 st->name_mapping_3to2 = \
299 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
300 if (!st->name_mapping_3to2)
301 goto error;
302 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
303 PyErr_Format(PyExc_RuntimeError,
304 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
305 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
306 goto error;
307 }
308 st->import_mapping_3to2 = \
309 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
310 if (!st->import_mapping_3to2)
311 goto error;
312 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
313 PyErr_Format(PyExc_RuntimeError,
314 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
315 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
316 goto error;
317 }
318 Py_CLEAR(compat_pickle);
319
320 codecs = PyImport_ImportModule("codecs");
321 if (codecs == NULL)
322 goto error;
323 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
324 if (st->codecs_encode == NULL) {
325 goto error;
326 }
327 if (!PyCallable_Check(st->codecs_encode)) {
328 PyErr_Format(PyExc_RuntimeError,
329 "codecs.encode should be a callable, not %.200s",
330 Py_TYPE(st->codecs_encode)->tp_name);
331 goto error;
332 }
333 Py_CLEAR(codecs);
334
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300335 functools = PyImport_ImportModule("functools");
336 if (!functools)
337 goto error;
338 st->partial = PyObject_GetAttrString(functools, "partial");
339 if (!st->partial)
340 goto error;
341 Py_CLEAR(functools);
342
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800343 return 0;
344
345 error:
346 Py_CLEAR(copyreg);
347 Py_CLEAR(compat_pickle);
348 Py_CLEAR(codecs);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300349 Py_CLEAR(functools);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800350 _Pickle_ClearState(st);
351 return -1;
352}
353
354/* Helper for calling a function with a single argument quickly.
355
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800356 This function steals the reference of the given argument. */
357static PyObject *
358_Pickle_FastCall(PyObject *func, PyObject *obj)
359{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800360 PyObject *result;
361
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100362 result = PyObject_CallFunctionObjArgs(func, obj, NULL);
Victor Stinner75210692016-08-19 18:59:15 +0200363 Py_DECREF(obj);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800364 return result;
365}
366
367/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000368
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200369/* Retrieve and deconstruct a method for avoiding a reference cycle
370 (pickler -> bound method of pickler -> pickler) */
371static int
372init_method_ref(PyObject *self, _Py_Identifier *name,
373 PyObject **method_func, PyObject **method_self)
374{
375 PyObject *func, *func2;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200376 int ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200377
378 /* *method_func and *method_self should be consistent. All refcount decrements
379 should be occurred after setting *method_self and *method_func. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200380 ret = _PyObject_LookupAttrId(self, name, &func);
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200381 if (func == NULL) {
382 *method_self = NULL;
383 Py_CLEAR(*method_func);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200384 return ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200385 }
386
387 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
388 /* Deconstruct a bound Python method */
389 func2 = PyMethod_GET_FUNCTION(func);
390 Py_INCREF(func2);
391 *method_self = self; /* borrowed */
392 Py_XSETREF(*method_func, func2);
393 Py_DECREF(func);
394 return 0;
395 }
396 else {
397 *method_self = NULL;
398 Py_XSETREF(*method_func, func);
399 return 0;
400 }
401}
402
403/* Bind a method if it was deconstructed */
404static PyObject *
405reconstruct_method(PyObject *func, PyObject *self)
406{
407 if (self) {
408 return PyMethod_New(func, self);
409 }
410 else {
411 Py_INCREF(func);
412 return func;
413 }
414}
415
416static PyObject *
417call_method(PyObject *func, PyObject *self, PyObject *obj)
418{
419 if (self) {
420 return PyObject_CallFunctionObjArgs(func, self, obj, NULL);
421 }
422 else {
423 return PyObject_CallFunctionObjArgs(func, obj, NULL);
424 }
425}
426
427/*************************************************************************/
428
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000429/* Internal data type used as the unpickling stack. */
430typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000431 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000432 PyObject **data;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200433 int mark_set; /* is MARK set? */
434 Py_ssize_t fence; /* position of top MARK or 0 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000435 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000436} Pdata;
437
438static void
439Pdata_dealloc(Pdata *self)
440{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200441 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000442 while (--i >= 0) {
443 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000444 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000445 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000446 PyObject_Del(self);
447}
448
449static PyTypeObject Pdata_Type = {
450 PyVarObject_HEAD_INIT(NULL, 0)
451 "_pickle.Pdata", /*tp_name*/
452 sizeof(Pdata), /*tp_basicsize*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200453 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000454 (destructor)Pdata_dealloc, /*tp_dealloc*/
455};
456
457static PyObject *
458Pdata_New(void)
459{
460 Pdata *self;
461
462 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
463 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000464 Py_SIZE(self) = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200465 self->mark_set = 0;
466 self->fence = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000467 self->allocated = 8;
468 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000469 if (self->data)
470 return (PyObject *)self;
471 Py_DECREF(self);
472 return PyErr_NoMemory();
473}
474
475
476/* Retain only the initial clearto items. If clearto >= the current
477 * number of items, this is a (non-erroneous) NOP.
478 */
479static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200480Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000481{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200482 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000483
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200484 assert(clearto >= self->fence);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000485 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000486 return 0;
487
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000488 while (--i >= clearto) {
489 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000490 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000491 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000492 return 0;
493}
494
495static int
496Pdata_grow(Pdata *self)
497{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000498 PyObject **data = self->data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200499 size_t allocated = (size_t)self->allocated;
500 size_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000501
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000502 new_allocated = (allocated >> 3) + 6;
503 /* check for integer overflow */
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200504 if (new_allocated > (size_t)PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000505 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000506 new_allocated += allocated;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500507 PyMem_RESIZE(data, PyObject *, new_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000508 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000509 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000510
511 self->data = data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200512 self->allocated = (Py_ssize_t)new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000513 return 0;
514
515 nomemory:
516 PyErr_NoMemory();
517 return -1;
518}
519
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200520static int
521Pdata_stack_underflow(Pdata *self)
522{
523 PickleState *st = _Pickle_GetGlobalState();
524 PyErr_SetString(st->UnpicklingError,
525 self->mark_set ?
526 "unexpected MARK found" :
527 "unpickling stack underflow");
528 return -1;
529}
530
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000531/* D is a Pdata*. Pop the topmost element and store it into V, which
532 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
533 * is raised and V is set to NULL.
534 */
535static PyObject *
536Pdata_pop(Pdata *self)
537{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200538 if (Py_SIZE(self) <= self->fence) {
539 Pdata_stack_underflow(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000540 return NULL;
541 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000542 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000543}
544#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
545
546static int
547Pdata_push(Pdata *self, PyObject *obj)
548{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000549 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000550 return -1;
551 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000552 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000553 return 0;
554}
555
556/* Push an object on stack, transferring its ownership to the stack. */
557#define PDATA_PUSH(D, O, ER) do { \
558 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
559
560/* Push an object on stack, adding a new reference to the object. */
561#define PDATA_APPEND(D, O, ER) do { \
562 Py_INCREF((O)); \
563 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
564
565static PyObject *
566Pdata_poptuple(Pdata *self, Py_ssize_t start)
567{
568 PyObject *tuple;
569 Py_ssize_t len, i, j;
570
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200571 if (start < self->fence) {
572 Pdata_stack_underflow(self);
573 return NULL;
574 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000575 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000576 tuple = PyTuple_New(len);
577 if (tuple == NULL)
578 return NULL;
579 for (i = start, j = 0; j < len; i++, j++)
580 PyTuple_SET_ITEM(tuple, j, self->data[i]);
581
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000582 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000583 return tuple;
584}
585
586static PyObject *
587Pdata_poplist(Pdata *self, Py_ssize_t start)
588{
589 PyObject *list;
590 Py_ssize_t len, i, j;
591
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000592 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000593 list = PyList_New(len);
594 if (list == NULL)
595 return NULL;
596 for (i = start, j = 0; j < len; i++, j++)
597 PyList_SET_ITEM(list, j, self->data[i]);
598
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000599 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000600 return list;
601}
602
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000603typedef struct {
604 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200605 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000606} PyMemoEntry;
607
608typedef struct {
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700609 size_t mt_mask;
610 size_t mt_used;
611 size_t mt_allocated;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000612 PyMemoEntry *mt_table;
613} PyMemoTable;
614
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000615typedef struct PicklerObject {
616 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000617 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000618 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000619 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000620 PyObject *pers_func; /* persistent_id() method, can be NULL */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200621 PyObject *pers_func_self; /* borrowed reference to self if pers_func
622 is an unbound method, NULL otherwise */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100623 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Pierre Glaser289f1f82019-05-08 23:08:25 +0200624 PyObject *reducer_override; /* hook for invoking user-defined callbacks
625 instead of save_global when pickling
626 functions and classes*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000627
628 PyObject *write; /* write() method of the output stream. */
629 PyObject *output_buffer; /* Write into a local bytearray buffer before
630 flushing to the stream. */
631 Py_ssize_t output_len; /* Length of output_buffer. */
632 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000633 int proto; /* Pickle protocol number, >= 0 */
634 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100635 int framing; /* True when framing is enabled, proto >= 4 */
636 Py_ssize_t frame_start; /* Position in output_buffer where the
Martin Pantera90a4a92016-05-30 04:04:50 +0000637 current frame begins. -1 if there
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100638 is no frame currently open. */
639
640 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000641 int fast; /* Enable fast mode if set to a true value.
642 The fast mode disable the usage of memo,
643 therefore speeding the pickling process by
644 not generating superfluous PUT opcodes. It
645 should not be used if with self-referential
646 objects. */
647 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000648 int fix_imports; /* Indicate whether Pickler should fix
649 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000650 PyObject *fast_memo;
Antoine Pitrou91f43802019-05-26 17:10:09 +0200651 PyObject *buffer_callback; /* Callback for out-of-band buffers, or NULL */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000652} PicklerObject;
653
654typedef struct UnpicklerObject {
655 PyObject_HEAD
656 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000657
658 /* The unpickler memo is just an array of PyObject *s. Using a dict
659 is unnecessary, since the keys are contiguous ints. */
660 PyObject **memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700661 size_t memo_size; /* Capacity of the memo array */
662 size_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000663
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000664 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200665 PyObject *pers_func_self; /* borrowed reference to self if pers_func
666 is an unbound method, NULL otherwise */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000667
668 Py_buffer buffer;
669 char *input_buffer;
670 char *input_line;
671 Py_ssize_t input_len;
672 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000673 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100674
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000675 PyObject *read; /* read() method of the input stream. */
Antoine Pitrou91f43802019-05-26 17:10:09 +0200676 PyObject *readinto; /* readinto() method of the input stream. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000677 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000678 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrou91f43802019-05-26 17:10:09 +0200679 PyObject *buffers; /* iterable of out-of-band buffers, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000680
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000681 char *encoding; /* Name of the encoding to be used for
682 decoding strings pickled using Python
683 2.x. The default value is "ASCII" */
684 char *errors; /* Name of errors handling scheme to used when
685 decoding strings. The default value is
686 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500687 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000688 objects. */
689 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
690 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000691 int proto; /* Protocol of the pickle loaded. */
692 int fix_imports; /* Indicate whether Unpickler should fix
693 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000694} UnpicklerObject;
695
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200696typedef struct {
697 PyObject_HEAD
698 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
699} PicklerMemoProxyObject;
700
701typedef struct {
702 PyObject_HEAD
703 UnpicklerObject *unpickler;
704} UnpicklerMemoProxyObject;
705
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000706/* Forward declarations */
707static int save(PicklerObject *, PyObject *, int);
708static int save_reduce(PicklerObject *, PyObject *, PyObject *);
709static PyTypeObject Pickler_Type;
710static PyTypeObject Unpickler_Type;
711
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200712#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000713
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000714/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300715 A custom hashtable mapping void* to Python ints. This is used by the pickler
716 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000717 a bunch of unnecessary object creation. This makes a huge performance
718 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000719
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000720#define MT_MINSIZE 8
721#define PERTURB_SHIFT 5
722
723
724static PyMemoTable *
725PyMemoTable_New(void)
726{
727 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
728 if (memo == NULL) {
729 PyErr_NoMemory();
730 return NULL;
731 }
732
733 memo->mt_used = 0;
734 memo->mt_allocated = MT_MINSIZE;
735 memo->mt_mask = MT_MINSIZE - 1;
736 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
737 if (memo->mt_table == NULL) {
738 PyMem_FREE(memo);
739 PyErr_NoMemory();
740 return NULL;
741 }
742 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
743
744 return memo;
745}
746
747static PyMemoTable *
748PyMemoTable_Copy(PyMemoTable *self)
749{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000750 PyMemoTable *new = PyMemoTable_New();
751 if (new == NULL)
752 return NULL;
753
754 new->mt_used = self->mt_used;
755 new->mt_allocated = self->mt_allocated;
756 new->mt_mask = self->mt_mask;
757 /* The table we get from _New() is probably smaller than we wanted.
758 Free it and allocate one that's the right size. */
759 PyMem_FREE(new->mt_table);
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500760 new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000761 if (new->mt_table == NULL) {
762 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200763 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000764 return NULL;
765 }
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700766 for (size_t i = 0; i < self->mt_allocated; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000767 Py_XINCREF(self->mt_table[i].me_key);
768 }
769 memcpy(new->mt_table, self->mt_table,
770 sizeof(PyMemoEntry) * self->mt_allocated);
771
772 return new;
773}
774
775static Py_ssize_t
776PyMemoTable_Size(PyMemoTable *self)
777{
778 return self->mt_used;
779}
780
781static int
782PyMemoTable_Clear(PyMemoTable *self)
783{
784 Py_ssize_t i = self->mt_allocated;
785
786 while (--i >= 0) {
787 Py_XDECREF(self->mt_table[i].me_key);
788 }
789 self->mt_used = 0;
790 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
791 return 0;
792}
793
794static void
795PyMemoTable_Del(PyMemoTable *self)
796{
797 if (self == NULL)
798 return;
799 PyMemoTable_Clear(self);
800
801 PyMem_FREE(self->mt_table);
802 PyMem_FREE(self);
803}
804
805/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
806 can be considerably simpler than dictobject.c's lookdict(). */
807static PyMemoEntry *
808_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
809{
810 size_t i;
811 size_t perturb;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700812 size_t mask = self->mt_mask;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000813 PyMemoEntry *table = self->mt_table;
814 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000815 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000816
817 i = hash & mask;
818 entry = &table[i];
819 if (entry->me_key == NULL || entry->me_key == key)
820 return entry;
821
822 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
823 i = (i << 2) + i + perturb + 1;
824 entry = &table[i & mask];
825 if (entry->me_key == NULL || entry->me_key == key)
826 return entry;
827 }
Barry Warsawb2e57942017-09-14 18:13:16 -0700828 Py_UNREACHABLE();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000829}
830
831/* Returns -1 on failure, 0 on success. */
832static int
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700833_PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000834{
835 PyMemoEntry *oldtable = NULL;
836 PyMemoEntry *oldentry, *newentry;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700837 size_t new_size = MT_MINSIZE;
838 size_t to_process;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000839
840 assert(min_size > 0);
841
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700842 if (min_size > PY_SSIZE_T_MAX) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000843 PyErr_NoMemory();
844 return -1;
845 }
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700846
847 /* Find the smallest valid table size >= min_size. */
848 while (new_size < min_size) {
849 new_size <<= 1;
850 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000851 /* new_size needs to be a power of two. */
852 assert((new_size & (new_size - 1)) == 0);
853
854 /* Allocate new table. */
855 oldtable = self->mt_table;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500856 self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000857 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200858 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000859 PyErr_NoMemory();
860 return -1;
861 }
862 self->mt_allocated = new_size;
863 self->mt_mask = new_size - 1;
864 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
865
866 /* Copy entries from the old table. */
867 to_process = self->mt_used;
868 for (oldentry = oldtable; to_process > 0; oldentry++) {
869 if (oldentry->me_key != NULL) {
870 to_process--;
871 /* newentry is a pointer to a chunk of the new
872 mt_table, so we're setting the key:value pair
873 in-place. */
874 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
875 newentry->me_key = oldentry->me_key;
876 newentry->me_value = oldentry->me_value;
877 }
878 }
879
880 /* Deallocate the old table. */
881 PyMem_FREE(oldtable);
882 return 0;
883}
884
885/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200886static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000887PyMemoTable_Get(PyMemoTable *self, PyObject *key)
888{
889 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
890 if (entry->me_key == NULL)
891 return NULL;
892 return &entry->me_value;
893}
894
895/* Returns -1 on failure, 0 on success. */
896static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200897PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000898{
899 PyMemoEntry *entry;
900
901 assert(key != NULL);
902
903 entry = _PyMemoTable_Lookup(self, key);
904 if (entry->me_key != NULL) {
905 entry->me_value = value;
906 return 0;
907 }
908 Py_INCREF(key);
909 entry->me_key = key;
910 entry->me_value = value;
911 self->mt_used++;
912
913 /* If we added a key, we can safely resize. Otherwise just return!
914 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
915 *
916 * Quadrupling the size improves average table sparseness
917 * (reducing collisions) at the cost of some memory. It also halves
918 * the number of expensive resize operations in a growing memo table.
919 *
920 * Very large memo tables (over 50K items) use doubling instead.
921 * This may help applications with severe memory constraints.
922 */
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700923 if (SIZE_MAX / 3 >= self->mt_used && self->mt_used * 3 < self->mt_allocated * 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000924 return 0;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700925 }
926 // self->mt_used is always < PY_SSIZE_T_MAX, so this can't overflow.
927 size_t desired_size = (self->mt_used > 50000 ? 2 : 4) * self->mt_used;
928 return _PyMemoTable_ResizeTable(self, desired_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000929}
930
931#undef MT_MINSIZE
932#undef PERTURB_SHIFT
933
934/*************************************************************************/
935
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000936
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000937static int
938_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000939{
Serhiy Storchaka48842712016-04-06 09:45:48 +0300940 Py_XSETREF(self->output_buffer,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +0200941 PyBytes_FromStringAndSize(NULL, self->max_output_len));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000942 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000943 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000944 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100945 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000946 return 0;
947}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000948
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100949static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100950_write_size64(char *out, size_t value)
951{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200952 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800953
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200954 Py_BUILD_ASSERT(sizeof(size_t) <= 8);
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800955
956 for (i = 0; i < sizeof(size_t); i++) {
957 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
958 }
959 for (i = sizeof(size_t); i < 8; i++) {
960 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800961 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100962}
963
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100964static int
965_Pickler_CommitFrame(PicklerObject *self)
966{
967 size_t frame_len;
968 char *qdata;
969
970 if (!self->framing || self->frame_start == -1)
971 return 0;
972 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
973 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200974 if (frame_len >= FRAME_SIZE_MIN) {
975 qdata[0] = FRAME;
976 _write_size64(qdata + 1, frame_len);
977 }
978 else {
979 memmove(qdata, qdata + FRAME_HEADER_SIZE, frame_len);
980 self->output_len -= FRAME_HEADER_SIZE;
981 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100982 self->frame_start = -1;
983 return 0;
984}
985
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000986static PyObject *
987_Pickler_GetString(PicklerObject *self)
988{
989 PyObject *output_buffer = self->output_buffer;
990
991 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100992
993 if (_Pickler_CommitFrame(self))
994 return NULL;
995
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000996 self->output_buffer = NULL;
997 /* Resize down to exact size */
998 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
999 return NULL;
1000 return output_buffer;
1001}
1002
1003static int
1004_Pickler_FlushToFile(PicklerObject *self)
1005{
1006 PyObject *output, *result;
1007
1008 assert(self->write != NULL);
1009
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001010 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001011 output = _Pickler_GetString(self);
1012 if (output == NULL)
1013 return -1;
1014
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001015 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001016 Py_XDECREF(result);
1017 return (result == NULL) ? -1 : 0;
1018}
1019
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001020static int
1021_Pickler_OpcodeBoundary(PicklerObject *self)
1022{
1023 Py_ssize_t frame_len;
1024
1025 if (!self->framing || self->frame_start == -1) {
1026 return 0;
1027 }
1028 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
1029 if (frame_len >= FRAME_SIZE_TARGET) {
1030 if(_Pickler_CommitFrame(self)) {
1031 return -1;
1032 }
Leo Ariasc3d95082018-02-03 18:36:10 -06001033 /* Flush the content of the committed frame to the underlying
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001034 * file and reuse the pickler buffer for the next frame so as
1035 * to limit memory usage when dumping large complex objects to
1036 * a file.
1037 *
1038 * self->write is NULL when called via dumps.
1039 */
1040 if (self->write != NULL) {
1041 if (_Pickler_FlushToFile(self) < 0) {
1042 return -1;
1043 }
1044 if (_Pickler_ClearBuffer(self) < 0) {
1045 return -1;
1046 }
1047 }
1048 }
1049 return 0;
1050}
1051
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001052static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001053_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001054{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001055 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001056 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001057 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001058
1059 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001060 need_new_frame = (self->framing && self->frame_start == -1);
1061
1062 if (need_new_frame)
1063 n = data_len + FRAME_HEADER_SIZE;
1064 else
1065 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001066
1067 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001068 if (required > self->max_output_len) {
1069 /* Make place in buffer for the pickle chunk */
1070 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
1071 PyErr_NoMemory();
1072 return -1;
1073 }
1074 self->max_output_len = (self->output_len + n) / 2 * 3;
1075 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
1076 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001077 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001078 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001079 if (need_new_frame) {
1080 /* Setup new frame */
1081 Py_ssize_t frame_start = self->output_len;
1082 self->frame_start = frame_start;
1083 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
1084 /* Write an invalid value, for debugging */
1085 buffer[frame_start + i] = 0xFE;
1086 }
1087 self->output_len += FRAME_HEADER_SIZE;
1088 }
1089 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001090 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001091 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001092 buffer[self->output_len + i] = s[i];
1093 }
1094 }
1095 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001096 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001097 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001098 self->output_len += data_len;
1099 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001100}
1101
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001102static PicklerObject *
1103_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001104{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001105 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001106
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001107 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1108 if (self == NULL)
1109 return NULL;
1110
1111 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01001112 self->dispatch_table = NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02001113 self->buffer_callback = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001114 self->write = NULL;
1115 self->proto = 0;
1116 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001117 self->framing = 0;
1118 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001119 self->fast = 0;
1120 self->fast_nesting = 0;
1121 self->fix_imports = 0;
1122 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001123 self->max_output_len = WRITE_BUF_SIZE;
1124 self->output_len = 0;
Pierre Glaser289f1f82019-05-08 23:08:25 +02001125 self->reducer_override = NULL;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001126
1127 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001128 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1129 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001130
1131 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001132 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001133 return NULL;
1134 }
Zackery Spytz359bd4f2019-04-23 05:56:08 -06001135
1136 PyObject_GC_Track(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001137 return self;
1138}
1139
1140static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001141_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001142{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001143 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001144
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001145 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001146 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001147 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001148 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001149 proto = PyLong_AsLong(protocol);
1150 if (proto < 0) {
1151 if (proto == -1 && PyErr_Occurred())
1152 return -1;
1153 proto = HIGHEST_PROTOCOL;
1154 }
1155 else if (proto > HIGHEST_PROTOCOL) {
1156 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1157 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001158 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001159 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001160 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001161 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001162 self->bin = proto > 0;
1163 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001164 return 0;
1165}
1166
1167/* Returns -1 (with an exception set) on failure, 0 on success. This may
1168 be called once on a freshly created Pickler. */
1169static int
1170_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1171{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001172 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001173 assert(file != NULL);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001174 if (_PyObject_LookupAttrId(file, &PyId_write, &self->write) < 0) {
1175 return -1;
1176 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001177 if (self->write == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001178 PyErr_SetString(PyExc_TypeError,
1179 "file must have a 'write' attribute");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001180 return -1;
1181 }
1182
1183 return 0;
1184}
1185
Antoine Pitrou91f43802019-05-26 17:10:09 +02001186static int
1187_Pickler_SetBufferCallback(PicklerObject *self, PyObject *buffer_callback)
1188{
1189 if (buffer_callback == Py_None) {
1190 buffer_callback = NULL;
1191 }
1192 if (buffer_callback != NULL && self->proto < 5) {
1193 PyErr_SetString(PyExc_ValueError,
1194 "buffer_callback needs protocol >= 5");
1195 return -1;
1196 }
1197
1198 Py_XINCREF(buffer_callback);
1199 self->buffer_callback = buffer_callback;
1200 return 0;
1201}
1202
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001203/* Returns the size of the input on success, -1 on failure. This takes its
1204 own reference to `input`. */
1205static Py_ssize_t
1206_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1207{
1208 if (self->buffer.buf != NULL)
1209 PyBuffer_Release(&self->buffer);
1210 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1211 return -1;
1212 self->input_buffer = self->buffer.buf;
1213 self->input_len = self->buffer.len;
1214 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001215 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001216 return self->input_len;
1217}
1218
Antoine Pitrou04248a82010-10-12 20:51:21 +00001219static int
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001220bad_readline(void)
1221{
1222 PickleState *st = _Pickle_GetGlobalState();
1223 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
1224 return -1;
1225}
1226
Antoine Pitrou91f43802019-05-26 17:10:09 +02001227/* Skip any consumed data that was only prefetched using peek() */
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001228static int
Antoine Pitrou04248a82010-10-12 20:51:21 +00001229_Unpickler_SkipConsumed(UnpicklerObject *self)
1230{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001231 Py_ssize_t consumed;
1232 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001233
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001234 consumed = self->next_read_idx - self->prefetched_idx;
1235 if (consumed <= 0)
1236 return 0;
1237
1238 assert(self->peek); /* otherwise we did something wrong */
Martin Panter6245cb32016-04-15 02:14:19 +00001239 /* This makes a useless copy... */
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001240 r = PyObject_CallFunction(self->read, "n", consumed);
1241 if (r == NULL)
1242 return -1;
1243 Py_DECREF(r);
1244
1245 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001246 return 0;
1247}
1248
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001249static const Py_ssize_t READ_WHOLE_LINE = -1;
1250
1251/* If reading from a file, we need to only pull the bytes we need, since there
1252 may be multiple pickle objects arranged contiguously in the same input
1253 buffer.
1254
1255 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1256 bytes from the input stream/buffer.
1257
1258 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1259 failure; on success, returns the number of bytes read from the file.
1260
1261 On success, self->input_len will be 0; this is intentional so that when
1262 unpickling from a file, the "we've run out of data" code paths will trigger,
1263 causing the Unpickler to go back to the file for more data. Use the returned
1264 size to tell you how much data you can process. */
1265static Py_ssize_t
1266_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1267{
1268 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001269 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001270
1271 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001272
Antoine Pitrou04248a82010-10-12 20:51:21 +00001273 if (_Unpickler_SkipConsumed(self) < 0)
1274 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001275
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001276 if (n == READ_WHOLE_LINE) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02001277 data = _PyObject_CallNoArg(self->readline);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001278 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001279 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001280 PyObject *len;
1281 /* Prefetch some data without advancing the file pointer, if possible */
1282 if (self->peek && n < PREFETCH) {
1283 len = PyLong_FromSsize_t(PREFETCH);
1284 if (len == NULL)
1285 return -1;
1286 data = _Pickle_FastCall(self->peek, len);
1287 if (data == NULL) {
1288 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1289 return -1;
1290 /* peek() is probably not supported by the given file object */
1291 PyErr_Clear();
1292 Py_CLEAR(self->peek);
1293 }
1294 else {
1295 read_size = _Unpickler_SetStringInput(self, data);
1296 Py_DECREF(data);
1297 self->prefetched_idx = 0;
1298 if (n <= read_size)
1299 return n;
1300 }
1301 }
1302 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001303 if (len == NULL)
1304 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001305 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001306 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001307 if (data == NULL)
1308 return -1;
1309
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001310 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001311 Py_DECREF(data);
1312 return read_size;
1313}
1314
Victor Stinner19ed27e2016-05-20 11:42:37 +02001315/* Don't call it directly: use _Unpickler_Read() */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001316static Py_ssize_t
Victor Stinner19ed27e2016-05-20 11:42:37 +02001317_Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001318{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001319 Py_ssize_t num_read;
1320
Benjamin Peterson6aa15642015-09-27 01:16:03 -07001321 *s = NULL;
Benjamin Petersone48cf7e2015-09-26 00:08:34 -07001322 if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1323 PickleState *st = _Pickle_GetGlobalState();
1324 PyErr_SetString(st->UnpicklingError,
1325 "read would overflow (invalid bytecode)");
1326 return -1;
1327 }
Victor Stinner19ed27e2016-05-20 11:42:37 +02001328
1329 /* This case is handled by the _Unpickler_Read() macro for efficiency */
1330 assert(self->next_read_idx + n > self->input_len);
1331
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001332 if (!self->read)
1333 return bad_readline();
1334
Antoine Pitrou91f43802019-05-26 17:10:09 +02001335 /* Extend the buffer to satisfy desired size */
Antoine Pitrou04248a82010-10-12 20:51:21 +00001336 num_read = _Unpickler_ReadFromFile(self, n);
1337 if (num_read < 0)
1338 return -1;
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001339 if (num_read < n)
1340 return bad_readline();
Antoine Pitrou04248a82010-10-12 20:51:21 +00001341 *s = self->input_buffer;
1342 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001343 return n;
1344}
1345
Antoine Pitrou91f43802019-05-26 17:10:09 +02001346/* Read `n` bytes from the unpickler's data source, storing the result in `buf`.
1347 *
1348 * This should only be used for non-small data reads where potentially
1349 * avoiding a copy is beneficial. This method does not try to prefetch
1350 * more data into the input buffer.
1351 *
1352 * _Unpickler_Read() is recommended in most cases.
1353 */
1354static Py_ssize_t
1355_Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n)
1356{
1357 assert(n != READ_WHOLE_LINE);
1358
1359 /* Read from available buffer data, if any */
1360 Py_ssize_t in_buffer = self->input_len - self->next_read_idx;
1361 if (in_buffer > 0) {
1362 Py_ssize_t to_read = Py_MIN(in_buffer, n);
1363 memcpy(buf, self->input_buffer + self->next_read_idx, to_read);
1364 self->next_read_idx += to_read;
1365 buf += to_read;
1366 n -= to_read;
1367 if (n == 0) {
1368 /* Entire read was satisfied from buffer */
1369 return n;
1370 }
1371 }
1372
1373 /* Read from file */
1374 if (!self->readinto) {
1375 return bad_readline();
1376 }
1377 if (_Unpickler_SkipConsumed(self) < 0) {
1378 return -1;
1379 }
1380
1381 /* Call readinto() into user buffer */
1382 PyObject *buf_obj = PyMemoryView_FromMemory(buf, n, PyBUF_WRITE);
1383 if (buf_obj == NULL) {
1384 return -1;
1385 }
1386 PyObject *read_size_obj = _Pickle_FastCall(self->readinto, buf_obj);
1387 if (read_size_obj == NULL) {
1388 return -1;
1389 }
1390 Py_ssize_t read_size = PyLong_AsSsize_t(read_size_obj);
1391 Py_DECREF(read_size_obj);
1392
1393 if (read_size < 0) {
1394 if (!PyErr_Occurred()) {
1395 PyErr_SetString(PyExc_ValueError,
1396 "readinto() returned negative size");
1397 }
1398 return -1;
1399 }
1400 if (read_size < n) {
1401 return bad_readline();
1402 }
1403 return n;
1404}
1405
Victor Stinner19ed27e2016-05-20 11:42:37 +02001406/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1407
1408 This should be used for all data reads, rather than accessing the unpickler's
1409 input buffer directly. This method deals correctly with reading from input
1410 streams, which the input buffer doesn't deal with.
1411
1412 Note that when reading from a file-like object, self->next_read_idx won't
1413 be updated (it should remain at 0 for the entire unpickling process). You
1414 should use this function's return value to know how many bytes you can
1415 consume.
1416
1417 Returns -1 (with an exception set) on failure. On success, return the
1418 number of chars read. */
1419#define _Unpickler_Read(self, s, n) \
Victor Stinnerda230562016-05-20 21:16:59 +02001420 (((n) <= (self)->input_len - (self)->next_read_idx) \
Victor Stinner19ed27e2016-05-20 11:42:37 +02001421 ? (*(s) = (self)->input_buffer + (self)->next_read_idx, \
1422 (self)->next_read_idx += (n), \
1423 (n)) \
1424 : _Unpickler_ReadImpl(self, (s), (n)))
1425
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001426static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001427_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1428 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001429{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001430 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001431 if (input_line == NULL) {
1432 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001433 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001434 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001435
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001436 memcpy(input_line, line, len);
1437 input_line[len] = '\0';
1438 self->input_line = input_line;
1439 *result = self->input_line;
1440 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001441}
1442
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001443/* Read a line from the input stream/buffer. If we run off the end of the input
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001444 before hitting \n, raise an error.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001445
1446 Returns the number of chars read, or -1 on failure. */
1447static Py_ssize_t
1448_Unpickler_Readline(UnpicklerObject *self, char **result)
1449{
1450 Py_ssize_t i, num_read;
1451
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001452 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001453 if (self->input_buffer[i] == '\n') {
1454 char *line_start = self->input_buffer + self->next_read_idx;
1455 num_read = i - self->next_read_idx + 1;
1456 self->next_read_idx = i + 1;
1457 return _Unpickler_CopyLine(self, line_start, num_read, result);
1458 }
1459 }
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001460 if (!self->read)
1461 return bad_readline();
Victor Stinner121aab42011-09-29 23:40:53 +02001462
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001463 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1464 if (num_read < 0)
1465 return -1;
1466 if (num_read == 0 || self->input_buffer[num_read - 1] != '\n')
1467 return bad_readline();
1468 self->next_read_idx = num_read;
1469 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001470}
1471
1472/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1473 will be modified in place. */
1474static int
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001475_Unpickler_ResizeMemoList(UnpicklerObject *self, size_t new_size)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001476{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001477 size_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001478
1479 assert(new_size > self->memo_size);
1480
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05001481 PyObject **memo_new = self->memo;
1482 PyMem_RESIZE(memo_new, PyObject *, new_size);
1483 if (memo_new == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001484 PyErr_NoMemory();
1485 return -1;
1486 }
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05001487 self->memo = memo_new;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001488 for (i = self->memo_size; i < new_size; i++)
1489 self->memo[i] = NULL;
1490 self->memo_size = new_size;
1491 return 0;
1492}
1493
1494/* Returns NULL if idx is out of bounds. */
1495static PyObject *
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001496_Unpickler_MemoGet(UnpicklerObject *self, size_t idx)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001497{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001498 if (idx >= self->memo_size)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001499 return NULL;
1500
1501 return self->memo[idx];
1502}
1503
1504/* Returns -1 (with an exception set) on failure, 0 on success.
1505 This takes its own reference to `value`. */
1506static int
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001507_Unpickler_MemoPut(UnpicklerObject *self, size_t idx, PyObject *value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001508{
1509 PyObject *old_item;
1510
1511 if (idx >= self->memo_size) {
1512 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1513 return -1;
1514 assert(idx < self->memo_size);
1515 }
1516 Py_INCREF(value);
1517 old_item = self->memo[idx];
1518 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001519 if (old_item != NULL) {
1520 Py_DECREF(old_item);
1521 }
1522 else {
1523 self->memo_len++;
1524 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001525 return 0;
1526}
1527
1528static PyObject **
1529_Unpickler_NewMemo(Py_ssize_t new_size)
1530{
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001531 PyObject **memo = PyMem_NEW(PyObject *, new_size);
Victor Stinner42024562013-07-12 00:53:57 +02001532 if (memo == NULL) {
1533 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001534 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001535 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001536 memset(memo, 0, new_size * sizeof(PyObject *));
1537 return memo;
1538}
1539
1540/* Free the unpickler's memo, taking care to decref any items left in it. */
1541static void
1542_Unpickler_MemoCleanup(UnpicklerObject *self)
1543{
1544 Py_ssize_t i;
1545 PyObject **memo = self->memo;
1546
1547 if (self->memo == NULL)
1548 return;
1549 self->memo = NULL;
1550 i = self->memo_size;
1551 while (--i >= 0) {
1552 Py_XDECREF(memo[i]);
1553 }
1554 PyMem_FREE(memo);
1555}
1556
1557static UnpicklerObject *
1558_Unpickler_New(void)
1559{
1560 UnpicklerObject *self;
1561
1562 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1563 if (self == NULL)
1564 return NULL;
1565
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001566 self->pers_func = NULL;
1567 self->input_buffer = NULL;
1568 self->input_line = NULL;
1569 self->input_len = 0;
1570 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001571 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001572 self->read = NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02001573 self->readinto = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001574 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001575 self->peek = NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02001576 self->buffers = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001577 self->encoding = NULL;
1578 self->errors = NULL;
1579 self->marks = NULL;
1580 self->num_marks = 0;
1581 self->marks_size = 0;
1582 self->proto = 0;
1583 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001584 memset(&self->buffer, 0, sizeof(Py_buffer));
1585 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001586 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001587 self->memo = _Unpickler_NewMemo(self->memo_size);
1588 self->stack = (Pdata *)Pdata_New();
1589
1590 if (self->memo == NULL || self->stack == NULL) {
1591 Py_DECREF(self);
1592 return NULL;
1593 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001594
Zackery Spytz359bd4f2019-04-23 05:56:08 -06001595 PyObject_GC_Track(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001596 return self;
1597}
1598
1599/* Returns -1 (with an exception set) on failure, 0 on success. This may
Antoine Pitrou91f43802019-05-26 17:10:09 +02001600 be called once on a freshly created Unpickler. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001601static int
1602_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1603{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001604 _Py_IDENTIFIER(peek);
1605 _Py_IDENTIFIER(read);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001606 _Py_IDENTIFIER(readinto);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001607 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001608
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001609 if (_PyObject_LookupAttrId(file, &PyId_peek, &self->peek) < 0) {
1610 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001611 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001612 (void)_PyObject_LookupAttrId(file, &PyId_read, &self->read);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001613 (void)_PyObject_LookupAttrId(file, &PyId_readinto, &self->readinto);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001614 (void)_PyObject_LookupAttrId(file, &PyId_readline, &self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001615 if (!self->readline || !self->readinto || !self->read) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001616 if (!PyErr_Occurred()) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001617 PyErr_SetString(PyExc_TypeError,
Antoine Pitrou91f43802019-05-26 17:10:09 +02001618 "file must have 'read', 'readinto' and "
1619 "'readline' attributes");
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001620 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001621 Py_CLEAR(self->read);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001622 Py_CLEAR(self->readinto);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001623 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001624 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001625 return -1;
1626 }
1627 return 0;
1628}
1629
1630/* Returns -1 (with an exception set) on failure, 0 on success. This may
Antoine Pitrou91f43802019-05-26 17:10:09 +02001631 be called once on a freshly created Unpickler. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001632static int
1633_Unpickler_SetInputEncoding(UnpicklerObject *self,
1634 const char *encoding,
1635 const char *errors)
1636{
1637 if (encoding == NULL)
1638 encoding = "ASCII";
1639 if (errors == NULL)
1640 errors = "strict";
1641
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001642 self->encoding = _PyMem_Strdup(encoding);
1643 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001644 if (self->encoding == NULL || self->errors == NULL) {
1645 PyErr_NoMemory();
1646 return -1;
1647 }
1648 return 0;
1649}
1650
Antoine Pitrou91f43802019-05-26 17:10:09 +02001651/* Returns -1 (with an exception set) on failure, 0 on success. This may
1652 be called once on a freshly created Unpickler. */
1653static int
1654_Unpickler_SetBuffers(UnpicklerObject *self, PyObject *buffers)
1655{
1656 if (buffers == NULL) {
1657 self->buffers = NULL;
1658 }
1659 else {
1660 self->buffers = PyObject_GetIter(buffers);
1661 if (self->buffers == NULL) {
1662 return -1;
1663 }
1664 }
1665 return 0;
1666}
1667
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001668/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001669static int
1670memo_get(PicklerObject *self, PyObject *key)
1671{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001672 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001673 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001674 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001675
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001676 value = PyMemoTable_Get(self->memo, key);
1677 if (value == NULL) {
1678 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001679 return -1;
1680 }
1681
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001682 if (!self->bin) {
1683 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001684 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1685 "%" PY_FORMAT_SIZE_T "d\n", *value);
1686 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001687 }
1688 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001689 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001690 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001691 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001692 len = 2;
1693 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001694 else if ((size_t)*value <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001695 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001696 pdata[1] = (unsigned char)(*value & 0xff);
1697 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1698 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1699 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001700 len = 5;
1701 }
1702 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001703 PickleState *st = _Pickle_GetGlobalState();
1704 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001705 "memo id too large for LONG_BINGET");
1706 return -1;
1707 }
1708 }
1709
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001710 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001711 return -1;
1712
1713 return 0;
1714}
1715
1716/* Store an object in the memo, assign it a new unique ID based on the number
1717 of objects currently stored in the memo and generate a PUT opcode. */
1718static int
1719memo_put(PicklerObject *self, PyObject *obj)
1720{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001721 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001722 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001723 Py_ssize_t idx;
1724
1725 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001726
1727 if (self->fast)
1728 return 0;
1729
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001730 idx = PyMemoTable_Size(self->memo);
1731 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1732 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001733
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001734 if (self->proto >= 4) {
1735 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1736 return -1;
1737 return 0;
1738 }
1739 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001740 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001741 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001742 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001743 len = strlen(pdata);
1744 }
1745 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001746 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001747 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001748 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001749 len = 2;
1750 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001751 else if ((size_t)idx <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001752 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001753 pdata[1] = (unsigned char)(idx & 0xff);
1754 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1755 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1756 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001757 len = 5;
1758 }
1759 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001760 PickleState *st = _Pickle_GetGlobalState();
1761 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001762 "memo id too large for LONG_BINPUT");
1763 return -1;
1764 }
1765 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001766 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001767 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001768
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001769 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001770}
1771
1772static PyObject *
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001773get_dotted_path(PyObject *obj, PyObject *name)
1774{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001775 _Py_static_string(PyId_dot, ".");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001776 PyObject *dotted_path;
1777 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001778
1779 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001780 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001781 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001782 n = PyList_GET_SIZE(dotted_path);
1783 assert(n >= 1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001784 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001785 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001786 if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001787 if (obj == NULL)
1788 PyErr_Format(PyExc_AttributeError,
1789 "Can't pickle local object %R", name);
1790 else
1791 PyErr_Format(PyExc_AttributeError,
1792 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001793 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001794 return NULL;
1795 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001796 }
1797 return dotted_path;
1798}
1799
1800static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001801get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001802{
1803 Py_ssize_t i, n;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001804 PyObject *parent = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001805
1806 assert(PyList_CheckExact(names));
1807 Py_INCREF(obj);
1808 n = PyList_GET_SIZE(names);
1809 for (i = 0; i < n; i++) {
1810 PyObject *name = PyList_GET_ITEM(names, i);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001811 Py_XDECREF(parent);
1812 parent = obj;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001813 (void)_PyObject_LookupAttr(parent, name, &obj);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001814 if (obj == NULL) {
1815 Py_DECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001816 return NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001817 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001818 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001819 if (pparent != NULL)
1820 *pparent = parent;
1821 else
1822 Py_XDECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001823 return obj;
1824}
1825
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001826
1827static PyObject *
1828getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1829{
1830 PyObject *dotted_path, *attr;
1831
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001832 if (allow_qualname) {
1833 dotted_path = get_dotted_path(obj, name);
1834 if (dotted_path == NULL)
1835 return NULL;
1836 attr = get_deep_attribute(obj, dotted_path, NULL);
1837 Py_DECREF(dotted_path);
1838 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001839 else {
1840 (void)_PyObject_LookupAttr(obj, name, &attr);
1841 }
1842 if (attr == NULL && !PyErr_Occurred()) {
1843 PyErr_Format(PyExc_AttributeError,
1844 "Can't get attribute %R on %R", name, obj);
1845 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001846 return attr;
1847}
1848
Eric Snow3f9eee62017-09-15 16:35:20 -06001849static int
1850_checkmodule(PyObject *module_name, PyObject *module,
1851 PyObject *global, PyObject *dotted_path)
1852{
1853 if (module == Py_None) {
1854 return -1;
1855 }
1856 if (PyUnicode_Check(module_name) &&
1857 _PyUnicode_EqualToASCIIString(module_name, "__main__")) {
1858 return -1;
1859 }
1860
1861 PyObject *candidate = get_deep_attribute(module, dotted_path, NULL);
1862 if (candidate == NULL) {
Eric Snow3f9eee62017-09-15 16:35:20 -06001863 return -1;
1864 }
1865 if (candidate != global) {
1866 Py_DECREF(candidate);
1867 return -1;
1868 }
1869 Py_DECREF(candidate);
1870 return 0;
1871}
1872
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001873static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001874whichmodule(PyObject *global, PyObject *dotted_path)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001875{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001876 PyObject *module_name;
Eric Snow3f9eee62017-09-15 16:35:20 -06001877 PyObject *module = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001878 Py_ssize_t i;
Eric Snow3f9eee62017-09-15 16:35:20 -06001879 PyObject *modules;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001880 _Py_IDENTIFIER(__module__);
1881 _Py_IDENTIFIER(modules);
1882 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001883
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001884 if (_PyObject_LookupAttrId(global, &PyId___module__, &module_name) < 0) {
1885 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001886 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001887 if (module_name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001888 /* In some rare cases (e.g., bound methods of extension types),
1889 __module__ can be None. If it is so, then search sys.modules for
1890 the module of global. */
1891 if (module_name != Py_None)
1892 return module_name;
1893 Py_CLEAR(module_name);
1894 }
1895 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001896
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001897 /* Fallback on walking sys.modules */
Eric Snow3f9eee62017-09-15 16:35:20 -06001898 modules = _PySys_GetObjectId(&PyId_modules);
1899 if (modules == NULL) {
Victor Stinner1e53bba2013-07-16 22:26:05 +02001900 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001901 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001902 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001903 if (PyDict_CheckExact(modules)) {
1904 i = 0;
1905 while (PyDict_Next(modules, &i, &module_name, &module)) {
1906 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1907 Py_INCREF(module_name);
1908 return module_name;
1909 }
1910 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001911 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001912 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001913 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001914 }
1915 else {
1916 PyObject *iterator = PyObject_GetIter(modules);
1917 if (iterator == NULL) {
1918 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001919 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001920 while ((module_name = PyIter_Next(iterator))) {
1921 module = PyObject_GetItem(modules, module_name);
1922 if (module == NULL) {
1923 Py_DECREF(module_name);
1924 Py_DECREF(iterator);
1925 return NULL;
1926 }
1927 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1928 Py_DECREF(module);
1929 Py_DECREF(iterator);
1930 return module_name;
1931 }
1932 Py_DECREF(module);
1933 Py_DECREF(module_name);
1934 if (PyErr_Occurred()) {
1935 Py_DECREF(iterator);
1936 return NULL;
1937 }
1938 }
1939 Py_DECREF(iterator);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001940 }
1941
1942 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001943 module_name = _PyUnicode_FromId(&PyId___main__);
Victor Stinneraf46eb82017-09-05 23:30:16 +02001944 Py_XINCREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001945 return module_name;
1946}
1947
1948/* fast_save_enter() and fast_save_leave() are guards against recursive
1949 objects when Pickler is used with the "fast mode" (i.e., with object
1950 memoization disabled). If the nesting of a list or dict object exceed
1951 FAST_NESTING_LIMIT, these guards will start keeping an internal
1952 reference to the seen list or dict objects and check whether these objects
1953 are recursive. These are not strictly necessary, since save() has a
1954 hard-coded recursion limit, but they give a nicer error message than the
1955 typical RuntimeError. */
1956static int
1957fast_save_enter(PicklerObject *self, PyObject *obj)
1958{
1959 /* if fast_nesting < 0, we're doing an error exit. */
1960 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1961 PyObject *key = NULL;
1962 if (self->fast_memo == NULL) {
1963 self->fast_memo = PyDict_New();
1964 if (self->fast_memo == NULL) {
1965 self->fast_nesting = -1;
1966 return 0;
1967 }
1968 }
1969 key = PyLong_FromVoidPtr(obj);
Mat Mf76231f2017-11-13 02:50:16 -05001970 if (key == NULL) {
1971 self->fast_nesting = -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 return 0;
Mat Mf76231f2017-11-13 02:50:16 -05001973 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001974 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001975 Py_DECREF(key);
1976 PyErr_Format(PyExc_ValueError,
1977 "fast mode: can't pickle cyclic objects "
1978 "including object type %.200s at %p",
1979 obj->ob_type->tp_name, obj);
1980 self->fast_nesting = -1;
1981 return 0;
1982 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001983 if (PyErr_Occurred()) {
Mat Mf76231f2017-11-13 02:50:16 -05001984 Py_DECREF(key);
1985 self->fast_nesting = -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001986 return 0;
1987 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001988 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1989 Py_DECREF(key);
1990 self->fast_nesting = -1;
1991 return 0;
1992 }
1993 Py_DECREF(key);
1994 }
1995 return 1;
1996}
1997
1998static int
1999fast_save_leave(PicklerObject *self, PyObject *obj)
2000{
2001 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
2002 PyObject *key = PyLong_FromVoidPtr(obj);
2003 if (key == NULL)
2004 return 0;
2005 if (PyDict_DelItem(self->fast_memo, key) < 0) {
2006 Py_DECREF(key);
2007 return 0;
2008 }
2009 Py_DECREF(key);
2010 }
2011 return 1;
2012}
2013
2014static int
2015save_none(PicklerObject *self, PyObject *obj)
2016{
2017 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002018 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002019 return -1;
2020
2021 return 0;
2022}
2023
2024static int
2025save_bool(PicklerObject *self, PyObject *obj)
2026{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002027 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08002028 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002029 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002030 return -1;
2031 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08002032 else {
2033 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
2034 * so that unpicklers written before bools were introduced unpickle them
2035 * as ints, but unpicklers after can recognize that bools were intended.
2036 * Note that protocol 2 added direct ways to pickle bools.
2037 */
2038 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
2039 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
2040 return -1;
2041 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002042 return 0;
2043}
2044
2045static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002046save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002047{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002048 PyObject *repr = NULL;
2049 Py_ssize_t size;
2050 long val;
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002051 int overflow;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002052 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002053
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002054 val= PyLong_AsLongAndOverflow(obj, &overflow);
2055 if (!overflow && (sizeof(long) <= 4 ||
2056 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1))))
2057 {
Larry Hastings61272b72014-01-07 12:41:53 -08002058 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002059
2060 Note: we can't use -0x80000000L in the above condition because some
2061 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
2062 before applying the unary minus when sizeof(long) <= 4. The
2063 resulting value stays unsigned which is commonly not what we want,
2064 so MSVC happily warns us about it. However, that result would have
2065 been fine because we guard for sizeof(long) <= 4 which turns the
2066 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002067 char pdata[32];
2068 Py_ssize_t len = 0;
2069
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002070 if (self->bin) {
2071 pdata[1] = (unsigned char)(val & 0xff);
2072 pdata[2] = (unsigned char)((val >> 8) & 0xff);
2073 pdata[3] = (unsigned char)((val >> 16) & 0xff);
2074 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002075
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002076 if ((pdata[4] != 0) || (pdata[3] != 0)) {
2077 pdata[0] = BININT;
2078 len = 5;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002079 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002080 else if (pdata[2] != 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002081 pdata[0] = BININT2;
2082 len = 3;
2083 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002084 else {
2085 pdata[0] = BININT1;
2086 len = 2;
2087 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002088 }
2089 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002090 sprintf(pdata, "%c%ld\n", INT, val);
2091 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002092 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002093 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002094 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002095
2096 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002097 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002098 assert(!PyErr_Occurred());
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002099
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002100 if (self->proto >= 2) {
2101 /* Linear-time pickling. */
2102 size_t nbits;
2103 size_t nbytes;
2104 unsigned char *pdata;
2105 char header[5];
2106 int i;
2107 int sign = _PyLong_Sign(obj);
2108
2109 if (sign == 0) {
2110 header[0] = LONG1;
2111 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002112 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002113 goto error;
2114 return 0;
2115 }
2116 nbits = _PyLong_NumBits(obj);
2117 if (nbits == (size_t)-1 && PyErr_Occurred())
2118 goto error;
2119 /* How many bytes do we need? There are nbits >> 3 full
2120 * bytes of data, and nbits & 7 leftover bits. If there
2121 * are any leftover bits, then we clearly need another
2122 * byte. Wnat's not so obvious is that we *probably*
2123 * need another byte even if there aren't any leftovers:
2124 * the most-significant bit of the most-significant byte
2125 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03002126 * opposite of the one we need. The exception is ints
2127 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002128 * its own 256's-complement, so has the right sign bit
2129 * even without the extra byte. That's a pain to check
2130 * for in advance, though, so we always grab an extra
2131 * byte at the start, and cut it back later if possible.
2132 */
2133 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01002134 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002135 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03002136 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002137 goto error;
2138 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002139 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002140 if (repr == NULL)
2141 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002142 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002143 i = _PyLong_AsByteArray((PyLongObject *)obj,
2144 pdata, nbytes,
2145 1 /* little endian */ , 1 /* signed */ );
2146 if (i < 0)
2147 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03002148 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002149 * needed. This is so iff the MSB is all redundant sign
2150 * bits.
2151 */
2152 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02002153 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002154 pdata[nbytes - 1] == 0xff &&
2155 (pdata[nbytes - 2] & 0x80) != 0) {
2156 nbytes--;
2157 }
2158
2159 if (nbytes < 256) {
2160 header[0] = LONG1;
2161 header[1] = (unsigned char)nbytes;
2162 size = 2;
2163 }
2164 else {
2165 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002166 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002167 for (i = 1; i < 5; i++) {
2168 header[i] = (unsigned char)(size & 0xff);
2169 size >>= 8;
2170 }
2171 size = 5;
2172 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002173 if (_Pickler_Write(self, header, size) < 0 ||
2174 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002175 goto error;
2176 }
2177 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002178 const char long_op = LONG;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002179 const char *string;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002180
Mark Dickinson8dd05142009-01-20 20:43:58 +00002181 /* proto < 2: write the repr and newline. This is quadratic-time (in
2182 the number of digits), in both directions. We add a trailing 'L'
2183 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002184
2185 repr = PyObject_Repr(obj);
2186 if (repr == NULL)
2187 goto error;
2188
Serhiy Storchaka06515832016-11-20 09:13:07 +02002189 string = PyUnicode_AsUTF8AndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002190 if (string == NULL)
2191 goto error;
2192
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002193 if (_Pickler_Write(self, &long_op, 1) < 0 ||
2194 _Pickler_Write(self, string, size) < 0 ||
2195 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002196 goto error;
2197 }
2198
2199 if (0) {
2200 error:
2201 status = -1;
2202 }
2203 Py_XDECREF(repr);
2204
2205 return status;
2206}
2207
2208static int
2209save_float(PicklerObject *self, PyObject *obj)
2210{
2211 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
2212
2213 if (self->bin) {
2214 char pdata[9];
2215 pdata[0] = BINFLOAT;
2216 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
2217 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002218 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002219 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02002220 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002221 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00002222 int result = -1;
2223 char *buf = NULL;
2224 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002225
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002226 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002227 goto done;
2228
Serhiy Storchakac86ca262015-02-15 14:18:32 +02002229 buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00002230 if (!buf) {
2231 PyErr_NoMemory();
2232 goto done;
2233 }
2234
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002235 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002236 goto done;
2237
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002238 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002239 goto done;
2240
2241 result = 0;
2242done:
2243 PyMem_Free(buf);
2244 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002245 }
2246
2247 return 0;
2248}
2249
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002250/* Perform direct write of the header and payload of the binary object.
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002251
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002252 The large contiguous data is written directly into the underlying file
2253 object, bypassing the output_buffer of the Pickler. We intentionally
2254 do not insert a protocol 4 frame opcode to make it possible to optimize
2255 file.read calls in the loader.
2256 */
2257static int
2258_Pickler_write_bytes(PicklerObject *self,
2259 const char *header, Py_ssize_t header_size,
2260 const char *data, Py_ssize_t data_size,
2261 PyObject *payload)
2262{
2263 int bypass_buffer = (data_size >= FRAME_SIZE_TARGET);
2264 int framing = self->framing;
2265
2266 if (bypass_buffer) {
2267 assert(self->output_buffer != NULL);
2268 /* Commit the previous frame. */
2269 if (_Pickler_CommitFrame(self)) {
2270 return -1;
2271 }
2272 /* Disable framing temporarily */
2273 self->framing = 0;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002274 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002275
2276 if (_Pickler_Write(self, header, header_size) < 0) {
2277 return -1;
2278 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002279
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002280 if (bypass_buffer && self->write != NULL) {
2281 /* Bypass the in-memory buffer to directly stream large data
2282 into the underlying file object. */
2283 PyObject *result, *mem = NULL;
2284 /* Dump the output buffer to the file. */
2285 if (_Pickler_FlushToFile(self) < 0) {
2286 return -1;
2287 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002288
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002289 /* Stream write the payload into the file without going through the
2290 output buffer. */
2291 if (payload == NULL) {
Serhiy Storchaka5b76bdb2018-01-13 00:28:31 +02002292 /* TODO: It would be better to use a memoryview with a linked
2293 original string if this is possible. */
2294 payload = mem = PyBytes_FromStringAndSize(data, data_size);
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002295 if (payload == NULL) {
2296 return -1;
2297 }
2298 }
2299 result = PyObject_CallFunctionObjArgs(self->write, payload, NULL);
2300 Py_XDECREF(mem);
2301 if (result == NULL) {
2302 return -1;
2303 }
2304 Py_DECREF(result);
2305
2306 /* Reinitialize the buffer for subsequent calls to _Pickler_Write. */
2307 if (_Pickler_ClearBuffer(self) < 0) {
2308 return -1;
2309 }
2310 }
2311 else {
2312 if (_Pickler_Write(self, data, data_size) < 0) {
2313 return -1;
2314 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002315 }
2316
2317 /* Re-enable framing for subsequent calls to _Pickler_Write. */
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002318 self->framing = framing;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002319
2320 return 0;
2321}
2322
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002323static int
Antoine Pitrou91f43802019-05-26 17:10:09 +02002324_save_bytes_data(PicklerObject *self, PyObject *obj, const char *data,
2325 Py_ssize_t size)
2326{
2327 assert(self->proto >= 3);
2328
2329 char header[9];
2330 Py_ssize_t len;
2331
2332 if (size < 0)
2333 return -1;
2334
2335 if (size <= 0xff) {
2336 header[0] = SHORT_BINBYTES;
2337 header[1] = (unsigned char)size;
2338 len = 2;
2339 }
2340 else if ((size_t)size <= 0xffffffffUL) {
2341 header[0] = BINBYTES;
2342 header[1] = (unsigned char)(size & 0xff);
2343 header[2] = (unsigned char)((size >> 8) & 0xff);
2344 header[3] = (unsigned char)((size >> 16) & 0xff);
2345 header[4] = (unsigned char)((size >> 24) & 0xff);
2346 len = 5;
2347 }
2348 else if (self->proto >= 4) {
2349 header[0] = BINBYTES8;
2350 _write_size64(header + 1, size);
2351 len = 9;
2352 }
2353 else {
2354 PyErr_SetString(PyExc_OverflowError,
2355 "serializing a bytes object larger than 4 GiB "
2356 "requires pickle protocol 4 or higher");
2357 return -1;
2358 }
2359
2360 if (_Pickler_write_bytes(self, header, len, data, size, obj) < 0) {
2361 return -1;
2362 }
2363
2364 if (memo_put(self, obj) < 0) {
2365 return -1;
2366 }
2367
2368 return 0;
2369}
2370
2371static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002372save_bytes(PicklerObject *self, PyObject *obj)
2373{
2374 if (self->proto < 3) {
2375 /* Older pickle protocols do not have an opcode for pickling bytes
2376 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002377 the __reduce__ method) to permit bytes object unpickling.
2378
2379 Here we use a hack to be compatible with Python 2. Since in Python
2380 2 'bytes' is just an alias for 'str' (which has different
2381 parameters than the actual bytes object), we use codecs.encode
2382 to create the appropriate 'str' object when unpickled using
2383 Python 2 *and* the appropriate 'bytes' object when unpickled
2384 using Python 3. Again this is a hack and we don't need to do this
2385 with newer protocols. */
Pierre Glaser289f1f82019-05-08 23:08:25 +02002386 PyObject *reduce_value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002387 int status;
2388
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002389 if (PyBytes_GET_SIZE(obj) == 0) {
2390 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2391 }
2392 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002393 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002394 PyObject *unicode_str =
2395 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2396 PyBytes_GET_SIZE(obj),
2397 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002398 _Py_IDENTIFIER(latin1);
2399
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002400 if (unicode_str == NULL)
2401 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002402 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002403 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002404 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002405 Py_DECREF(unicode_str);
2406 }
2407
2408 if (reduce_value == NULL)
2409 return -1;
2410
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002411 /* save_reduce() will memoize the object automatically. */
2412 status = save_reduce(self, reduce_value, obj);
2413 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002414 return status;
2415 }
2416 else {
Antoine Pitrou91f43802019-05-26 17:10:09 +02002417 return _save_bytes_data(self, obj, PyBytes_AS_STRING(obj),
2418 PyBytes_GET_SIZE(obj));
2419 }
2420}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002421
Antoine Pitrou91f43802019-05-26 17:10:09 +02002422static int
2423_save_bytearray_data(PicklerObject *self, PyObject *obj, const char *data,
2424 Py_ssize_t size)
2425{
2426 assert(self->proto >= 5);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002427
Antoine Pitrou91f43802019-05-26 17:10:09 +02002428 char header[9];
2429 Py_ssize_t len;
2430
2431 if (size < 0)
2432 return -1;
2433
2434 header[0] = BYTEARRAY8;
2435 _write_size64(header + 1, size);
2436 len = 9;
2437
2438 if (_Pickler_write_bytes(self, header, len, data, size, obj) < 0) {
2439 return -1;
2440 }
2441
2442 if (memo_put(self, obj) < 0) {
2443 return -1;
2444 }
2445
2446 return 0;
2447}
2448
2449static int
2450save_bytearray(PicklerObject *self, PyObject *obj)
2451{
2452 if (self->proto < 5) {
2453 /* Older pickle protocols do not have an opcode for pickling
2454 * bytearrays. */
2455 PyObject *reduce_value = NULL;
2456 int status;
2457
2458 if (PyByteArray_GET_SIZE(obj) == 0) {
2459 reduce_value = Py_BuildValue("(O())",
2460 (PyObject *) &PyByteArray_Type);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002461 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002462 else {
Antoine Pitrou91f43802019-05-26 17:10:09 +02002463 PyObject *bytes_obj = PyBytes_FromObject(obj);
2464 if (bytes_obj != NULL) {
2465 reduce_value = Py_BuildValue("(O(O))",
2466 (PyObject *) &PyByteArray_Type,
2467 bytes_obj);
2468 Py_DECREF(bytes_obj);
2469 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002470 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02002471 if (reduce_value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002472 return -1;
2473
Antoine Pitrou91f43802019-05-26 17:10:09 +02002474 /* save_reduce() will memoize the object automatically. */
2475 status = save_reduce(self, reduce_value, obj);
2476 Py_DECREF(reduce_value);
2477 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002478 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02002479 else {
2480 return _save_bytearray_data(self, obj, PyByteArray_AS_STRING(obj),
2481 PyByteArray_GET_SIZE(obj));
2482 }
2483}
2484
2485static int
2486save_picklebuffer(PicklerObject *self, PyObject *obj)
2487{
2488 if (self->proto < 5) {
2489 PickleState *st = _Pickle_GetGlobalState();
2490 PyErr_SetString(st->PicklingError,
2491 "PickleBuffer can only pickled with protocol >= 5");
2492 return -1;
2493 }
2494 const Py_buffer* view = PyPickleBuffer_GetBuffer(obj);
2495 if (view == NULL) {
2496 return -1;
2497 }
2498 if (view->suboffsets != NULL || !PyBuffer_IsContiguous(view, 'A')) {
2499 PickleState *st = _Pickle_GetGlobalState();
2500 PyErr_SetString(st->PicklingError,
2501 "PickleBuffer can not be pickled when "
2502 "pointing to a non-contiguous buffer");
2503 return -1;
2504 }
2505 int in_band = 1;
2506 if (self->buffer_callback != NULL) {
2507 PyObject *ret = PyObject_CallFunctionObjArgs(self->buffer_callback,
2508 obj, NULL);
2509 if (ret == NULL) {
2510 return -1;
2511 }
2512 in_band = PyObject_IsTrue(ret);
2513 Py_DECREF(ret);
2514 if (in_band == -1) {
2515 return -1;
2516 }
2517 }
2518 if (in_band) {
2519 /* Write data in-band */
2520 if (view->readonly) {
2521 return _save_bytes_data(self, obj, (const char*) view->buf,
2522 view->len);
2523 }
2524 else {
2525 return _save_bytearray_data(self, obj, (const char*) view->buf,
2526 view->len);
2527 }
2528 }
2529 else {
2530 /* Write data out-of-band */
2531 const char next_buffer_op = NEXT_BUFFER;
2532 if (_Pickler_Write(self, &next_buffer_op, 1) < 0) {
2533 return -1;
2534 }
2535 if (view->readonly) {
2536 const char readonly_buffer_op = READONLY_BUFFER;
2537 if (_Pickler_Write(self, &readonly_buffer_op, 1) < 0) {
2538 return -1;
2539 }
2540 }
2541 }
2542 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002543}
2544
2545/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2546 backslash and newline characters to \uXXXX escapes. */
2547static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002548raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002549{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002550 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002551 Py_ssize_t i, size;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002552 void *data;
2553 unsigned int kind;
Victor Stinner358af132015-10-12 22:36:57 +02002554 _PyBytesWriter writer;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002555
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002556 if (PyUnicode_READY(obj))
2557 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002558
Victor Stinner358af132015-10-12 22:36:57 +02002559 _PyBytesWriter_Init(&writer);
2560
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002561 size = PyUnicode_GET_LENGTH(obj);
2562 data = PyUnicode_DATA(obj);
2563 kind = PyUnicode_KIND(obj);
Victor Stinner121aab42011-09-29 23:40:53 +02002564
Victor Stinner358af132015-10-12 22:36:57 +02002565 p = _PyBytesWriter_Alloc(&writer, size);
2566 if (p == NULL)
2567 goto error;
2568 writer.overallocate = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002569
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002570 for (i=0; i < size; i++) {
2571 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002572 /* Map 32-bit characters to '\Uxxxxxxxx' */
2573 if (ch >= 0x10000) {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002574 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002575 p = _PyBytesWriter_Prepare(&writer, p, 10-1);
2576 if (p == NULL)
2577 goto error;
2578
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002579 *p++ = '\\';
2580 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002581 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2582 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2583 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2584 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2585 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2586 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2587 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2588 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002589 }
Victor Stinner358af132015-10-12 22:36:57 +02002590 /* Map 16-bit characters, '\\' and '\n' to '\uxxxx' */
Serhiy Storchaka38ab7d42019-05-31 11:29:39 +03002591 else if (ch >= 256 ||
2592 ch == '\\' || ch == 0 || ch == '\n' || ch == '\r' ||
2593 ch == 0x1a)
2594 {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002595 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002596 p = _PyBytesWriter_Prepare(&writer, p, 6-1);
2597 if (p == NULL)
2598 goto error;
2599
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002600 *p++ = '\\';
2601 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002602 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2603 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2604 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2605 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002606 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002607 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002608 else
2609 *p++ = (char) ch;
2610 }
Victor Stinner358af132015-10-12 22:36:57 +02002611
2612 return _PyBytesWriter_Finish(&writer, p);
2613
2614error:
2615 _PyBytesWriter_Dealloc(&writer);
2616 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002617}
2618
2619static int
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002620write_unicode_binary(PicklerObject *self, PyObject *obj)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002621{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002622 char header[9];
2623 Py_ssize_t len;
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002624 PyObject *encoded = NULL;
2625 Py_ssize_t size;
2626 const char *data;
2627
2628 if (PyUnicode_READY(obj))
2629 return -1;
2630
2631 data = PyUnicode_AsUTF8AndSize(obj, &size);
2632 if (data == NULL) {
2633 /* Issue #8383: for strings with lone surrogates, fallback on the
2634 "surrogatepass" error handler. */
2635 PyErr_Clear();
2636 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2637 if (encoded == NULL)
2638 return -1;
2639
2640 data = PyBytes_AS_STRING(encoded);
2641 size = PyBytes_GET_SIZE(encoded);
2642 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002643
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002644 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002645 if (size <= 0xff && self->proto >= 4) {
2646 header[0] = SHORT_BINUNICODE;
2647 header[1] = (unsigned char)(size & 0xff);
2648 len = 2;
2649 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002650 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002651 header[0] = BINUNICODE;
2652 header[1] = (unsigned char)(size & 0xff);
2653 header[2] = (unsigned char)((size >> 8) & 0xff);
2654 header[3] = (unsigned char)((size >> 16) & 0xff);
2655 header[4] = (unsigned char)((size >> 24) & 0xff);
2656 len = 5;
2657 }
2658 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002659 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002660 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002661 len = 9;
2662 }
2663 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002664 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou91f43802019-05-26 17:10:09 +02002665 "serializing a string larger than 4 GiB "
2666 "requires pickle protocol 4 or higher");
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002667 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002668 return -1;
2669 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002670
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002671 if (_Pickler_write_bytes(self, header, len, data, size, encoded) < 0) {
2672 Py_XDECREF(encoded);
2673 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002674 }
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002675 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002676 return 0;
2677}
2678
2679static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002680save_unicode(PicklerObject *self, PyObject *obj)
2681{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002682 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002683 if (write_unicode_binary(self, obj) < 0)
2684 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002685 }
2686 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002687 PyObject *encoded;
2688 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002689 const char unicode_op = UNICODE;
2690
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002691 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002692 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002693 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002694
Antoine Pitrou299978d2013-04-07 17:38:11 +02002695 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2696 Py_DECREF(encoded);
2697 return -1;
2698 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002699
2700 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002701 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2702 Py_DECREF(encoded);
2703 return -1;
2704 }
2705 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002706
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002707 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002708 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002709 }
2710 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002711 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002712
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002713 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002714}
2715
2716/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2717static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002718store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002719{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002720 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002721
2722 assert(PyTuple_Size(t) == len);
2723
2724 for (i = 0; i < len; i++) {
2725 PyObject *element = PyTuple_GET_ITEM(t, i);
2726
2727 if (element == NULL)
2728 return -1;
2729 if (save(self, element, 0) < 0)
2730 return -1;
2731 }
2732
2733 return 0;
2734}
2735
2736/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2737 * used across protocols to minimize the space needed to pickle them.
2738 * Tuples are also the only builtin immutable type that can be recursive
2739 * (a tuple can be reached from itself), and that requires some subtle
2740 * magic so that it works in all cases. IOW, this is a long routine.
2741 */
2742static int
2743save_tuple(PicklerObject *self, PyObject *obj)
2744{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002745 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002746
2747 const char mark_op = MARK;
2748 const char tuple_op = TUPLE;
2749 const char pop_op = POP;
2750 const char pop_mark_op = POP_MARK;
2751 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2752
2753 if ((len = PyTuple_Size(obj)) < 0)
2754 return -1;
2755
2756 if (len == 0) {
2757 char pdata[2];
2758
2759 if (self->proto) {
2760 pdata[0] = EMPTY_TUPLE;
2761 len = 1;
2762 }
2763 else {
2764 pdata[0] = MARK;
2765 pdata[1] = TUPLE;
2766 len = 2;
2767 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002768 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002769 return -1;
2770 return 0;
2771 }
2772
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002773 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002774 * saving the tuple elements, the tuple must be recursive, in
2775 * which case we'll pop everything we put on the stack, and fetch
2776 * its value from the memo.
2777 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002778 if (len <= 3 && self->proto >= 2) {
2779 /* Use TUPLE{1,2,3} opcodes. */
2780 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002781 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002782
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002783 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002784 /* pop the len elements */
2785 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002786 if (_Pickler_Write(self, &pop_op, 1) < 0)
2787 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002788 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002789 if (memo_get(self, obj) < 0)
2790 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002791
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002792 return 0;
2793 }
2794 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002795 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2796 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002797 }
2798 goto memoize;
2799 }
2800
2801 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2802 * Generate MARK e1 e2 ... TUPLE
2803 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002804 if (_Pickler_Write(self, &mark_op, 1) < 0)
2805 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002806
2807 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002808 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002809
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002810 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002811 /* pop the stack stuff we pushed */
2812 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002813 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2814 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002815 }
2816 else {
2817 /* Note that we pop one more than len, to remove
2818 * the MARK too.
2819 */
2820 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002821 if (_Pickler_Write(self, &pop_op, 1) < 0)
2822 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002823 }
2824 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002825 if (memo_get(self, obj) < 0)
2826 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002827
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002828 return 0;
2829 }
2830 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002831 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2832 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002833 }
2834
2835 memoize:
2836 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002837 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002838
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002839 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002840}
2841
2842/* iter is an iterator giving items, and we batch up chunks of
2843 * MARK item item ... item APPENDS
2844 * opcode sequences. Calling code should have arranged to first create an
2845 * empty list, or list-like object, for the APPENDS to operate on.
2846 * Returns 0 on success, <0 on error.
2847 */
2848static int
2849batch_list(PicklerObject *self, PyObject *iter)
2850{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002851 PyObject *obj = NULL;
2852 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002853 int i, n;
2854
2855 const char mark_op = MARK;
2856 const char append_op = APPEND;
2857 const char appends_op = APPENDS;
2858
2859 assert(iter != NULL);
2860
2861 /* XXX: I think this function could be made faster by avoiding the
2862 iterator interface and fetching objects directly from list using
2863 PyList_GET_ITEM.
2864 */
2865
2866 if (self->proto == 0) {
2867 /* APPENDS isn't available; do one at a time. */
2868 for (;;) {
2869 obj = PyIter_Next(iter);
2870 if (obj == NULL) {
2871 if (PyErr_Occurred())
2872 return -1;
2873 break;
2874 }
2875 i = save(self, obj, 0);
2876 Py_DECREF(obj);
2877 if (i < 0)
2878 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002879 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002880 return -1;
2881 }
2882 return 0;
2883 }
2884
2885 /* proto > 0: write in batches of BATCHSIZE. */
2886 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002887 /* Get first item */
2888 firstitem = PyIter_Next(iter);
2889 if (firstitem == NULL) {
2890 if (PyErr_Occurred())
2891 goto error;
2892
2893 /* nothing more to add */
2894 break;
2895 }
2896
2897 /* Try to get a second item */
2898 obj = PyIter_Next(iter);
2899 if (obj == NULL) {
2900 if (PyErr_Occurred())
2901 goto error;
2902
2903 /* Only one item to write */
2904 if (save(self, firstitem, 0) < 0)
2905 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002906 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002907 goto error;
2908 Py_CLEAR(firstitem);
2909 break;
2910 }
2911
2912 /* More than one item to write */
2913
2914 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002915 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002916 goto error;
2917
2918 if (save(self, firstitem, 0) < 0)
2919 goto error;
2920 Py_CLEAR(firstitem);
2921 n = 1;
2922
2923 /* Fetch and save up to BATCHSIZE items */
2924 while (obj) {
2925 if (save(self, obj, 0) < 0)
2926 goto error;
2927 Py_CLEAR(obj);
2928 n += 1;
2929
2930 if (n == BATCHSIZE)
2931 break;
2932
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002933 obj = PyIter_Next(iter);
2934 if (obj == NULL) {
2935 if (PyErr_Occurred())
2936 goto error;
2937 break;
2938 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002939 }
2940
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002941 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002942 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002943
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002944 } while (n == BATCHSIZE);
2945 return 0;
2946
2947 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002948 Py_XDECREF(firstitem);
2949 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002950 return -1;
2951}
2952
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002953/* This is a variant of batch_list() above, specialized for lists (with no
2954 * support for list subclasses). Like batch_list(), we batch up chunks of
2955 * MARK item item ... item APPENDS
2956 * opcode sequences. Calling code should have arranged to first create an
2957 * empty list, or list-like object, for the APPENDS to operate on.
2958 * Returns 0 on success, -1 on error.
2959 *
2960 * This version is considerably faster than batch_list(), if less general.
2961 *
2962 * Note that this only works for protocols > 0.
2963 */
2964static int
2965batch_list_exact(PicklerObject *self, PyObject *obj)
2966{
2967 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002968 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002969
2970 const char append_op = APPEND;
2971 const char appends_op = APPENDS;
2972 const char mark_op = MARK;
2973
2974 assert(obj != NULL);
2975 assert(self->proto > 0);
2976 assert(PyList_CheckExact(obj));
2977
2978 if (PyList_GET_SIZE(obj) == 1) {
2979 item = PyList_GET_ITEM(obj, 0);
2980 if (save(self, item, 0) < 0)
2981 return -1;
2982 if (_Pickler_Write(self, &append_op, 1) < 0)
2983 return -1;
2984 return 0;
2985 }
2986
2987 /* Write in batches of BATCHSIZE. */
2988 total = 0;
2989 do {
2990 this_batch = 0;
2991 if (_Pickler_Write(self, &mark_op, 1) < 0)
2992 return -1;
2993 while (total < PyList_GET_SIZE(obj)) {
2994 item = PyList_GET_ITEM(obj, total);
2995 if (save(self, item, 0) < 0)
2996 return -1;
2997 total++;
2998 if (++this_batch == BATCHSIZE)
2999 break;
3000 }
3001 if (_Pickler_Write(self, &appends_op, 1) < 0)
3002 return -1;
3003
3004 } while (total < PyList_GET_SIZE(obj));
3005
3006 return 0;
3007}
3008
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003009static int
3010save_list(PicklerObject *self, PyObject *obj)
3011{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003012 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003013 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003014 int status = 0;
3015
3016 if (self->fast && !fast_save_enter(self, obj))
3017 goto error;
3018
3019 /* Create an empty list. */
3020 if (self->bin) {
3021 header[0] = EMPTY_LIST;
3022 len = 1;
3023 }
3024 else {
3025 header[0] = MARK;
3026 header[1] = LIST;
3027 len = 2;
3028 }
3029
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003030 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003031 goto error;
3032
3033 /* Get list length, and bow out early if empty. */
3034 if ((len = PyList_Size(obj)) < 0)
3035 goto error;
3036
3037 if (memo_put(self, obj) < 0)
3038 goto error;
3039
3040 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003041 /* Materialize the list elements. */
3042 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003043 if (Py_EnterRecursiveCall(" while pickling an object"))
3044 goto error;
3045 status = batch_list_exact(self, obj);
3046 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003047 } else {
3048 PyObject *iter = PyObject_GetIter(obj);
3049 if (iter == NULL)
3050 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003051
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003052 if (Py_EnterRecursiveCall(" while pickling an object")) {
3053 Py_DECREF(iter);
3054 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003055 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003056 status = batch_list(self, iter);
3057 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003058 Py_DECREF(iter);
3059 }
3060 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003061 if (0) {
3062 error:
3063 status = -1;
3064 }
3065
3066 if (self->fast && !fast_save_leave(self, obj))
3067 status = -1;
3068
3069 return status;
3070}
3071
3072/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
3073 * MARK key value ... key value SETITEMS
3074 * opcode sequences. Calling code should have arranged to first create an
3075 * empty dict, or dict-like object, for the SETITEMS to operate on.
3076 * Returns 0 on success, <0 on error.
3077 *
3078 * This is very much like batch_list(). The difference between saving
3079 * elements directly, and picking apart two-tuples, is so long-winded at
3080 * the C level, though, that attempts to combine these routines were too
3081 * ugly to bear.
3082 */
3083static int
3084batch_dict(PicklerObject *self, PyObject *iter)
3085{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003086 PyObject *obj = NULL;
3087 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003088 int i, n;
3089
3090 const char mark_op = MARK;
3091 const char setitem_op = SETITEM;
3092 const char setitems_op = SETITEMS;
3093
3094 assert(iter != NULL);
3095
3096 if (self->proto == 0) {
3097 /* SETITEMS isn't available; do one at a time. */
3098 for (;;) {
3099 obj = PyIter_Next(iter);
3100 if (obj == NULL) {
3101 if (PyErr_Occurred())
3102 return -1;
3103 break;
3104 }
3105 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
3106 PyErr_SetString(PyExc_TypeError, "dict items "
3107 "iterator must return 2-tuples");
3108 return -1;
3109 }
3110 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
3111 if (i >= 0)
3112 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
3113 Py_DECREF(obj);
3114 if (i < 0)
3115 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003116 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003117 return -1;
3118 }
3119 return 0;
3120 }
3121
3122 /* proto > 0: write in batches of BATCHSIZE. */
3123 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003124 /* Get first item */
3125 firstitem = PyIter_Next(iter);
3126 if (firstitem == NULL) {
3127 if (PyErr_Occurred())
3128 goto error;
3129
3130 /* nothing more to add */
3131 break;
3132 }
3133 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
3134 PyErr_SetString(PyExc_TypeError, "dict items "
3135 "iterator must return 2-tuples");
3136 goto error;
3137 }
3138
3139 /* Try to get a second item */
3140 obj = PyIter_Next(iter);
3141 if (obj == NULL) {
3142 if (PyErr_Occurred())
3143 goto error;
3144
3145 /* Only one item to write */
3146 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
3147 goto error;
3148 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
3149 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003150 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003151 goto error;
3152 Py_CLEAR(firstitem);
3153 break;
3154 }
3155
3156 /* More than one item to write */
3157
3158 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003159 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003160 goto error;
3161
3162 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
3163 goto error;
3164 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
3165 goto error;
3166 Py_CLEAR(firstitem);
3167 n = 1;
3168
3169 /* Fetch and save up to BATCHSIZE items */
3170 while (obj) {
3171 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
3172 PyErr_SetString(PyExc_TypeError, "dict items "
3173 "iterator must return 2-tuples");
3174 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003175 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003176 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
3177 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
3178 goto error;
3179 Py_CLEAR(obj);
3180 n += 1;
3181
3182 if (n == BATCHSIZE)
3183 break;
3184
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003185 obj = PyIter_Next(iter);
3186 if (obj == NULL) {
3187 if (PyErr_Occurred())
3188 goto error;
3189 break;
3190 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003191 }
3192
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003193 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003194 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003195
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003196 } while (n == BATCHSIZE);
3197 return 0;
3198
3199 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003200 Py_XDECREF(firstitem);
3201 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003202 return -1;
3203}
3204
Collin Winter5c9b02d2009-05-25 05:43:30 +00003205/* This is a variant of batch_dict() above that specializes for dicts, with no
3206 * support for dict subclasses. Like batch_dict(), we batch up chunks of
3207 * MARK key value ... key value SETITEMS
3208 * opcode sequences. Calling code should have arranged to first create an
3209 * empty dict, or dict-like object, for the SETITEMS to operate on.
3210 * Returns 0 on success, -1 on error.
3211 *
3212 * Note that this currently doesn't work for protocol 0.
3213 */
3214static int
3215batch_dict_exact(PicklerObject *self, PyObject *obj)
3216{
3217 PyObject *key = NULL, *value = NULL;
3218 int i;
3219 Py_ssize_t dict_size, ppos = 0;
3220
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00003221 const char mark_op = MARK;
3222 const char setitem_op = SETITEM;
3223 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00003224
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003225 assert(obj != NULL && PyDict_CheckExact(obj));
Collin Winter5c9b02d2009-05-25 05:43:30 +00003226 assert(self->proto > 0);
3227
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003228 dict_size = PyDict_GET_SIZE(obj);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003229
3230 /* Special-case len(d) == 1 to save space. */
3231 if (dict_size == 1) {
3232 PyDict_Next(obj, &ppos, &key, &value);
3233 if (save(self, key, 0) < 0)
3234 return -1;
3235 if (save(self, value, 0) < 0)
3236 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003237 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003238 return -1;
3239 return 0;
3240 }
3241
3242 /* Write in batches of BATCHSIZE. */
3243 do {
3244 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003245 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003246 return -1;
3247 while (PyDict_Next(obj, &ppos, &key, &value)) {
3248 if (save(self, key, 0) < 0)
3249 return -1;
3250 if (save(self, value, 0) < 0)
3251 return -1;
3252 if (++i == BATCHSIZE)
3253 break;
3254 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003255 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003256 return -1;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003257 if (PyDict_GET_SIZE(obj) != dict_size) {
Collin Winter5c9b02d2009-05-25 05:43:30 +00003258 PyErr_Format(
3259 PyExc_RuntimeError,
3260 "dictionary changed size during iteration");
3261 return -1;
3262 }
3263
3264 } while (i == BATCHSIZE);
3265 return 0;
3266}
3267
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003268static int
3269save_dict(PicklerObject *self, PyObject *obj)
3270{
3271 PyObject *items, *iter;
3272 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003273 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003274 int status = 0;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003275 assert(PyDict_Check(obj));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003276
3277 if (self->fast && !fast_save_enter(self, obj))
3278 goto error;
3279
3280 /* Create an empty dict. */
3281 if (self->bin) {
3282 header[0] = EMPTY_DICT;
3283 len = 1;
3284 }
3285 else {
3286 header[0] = MARK;
3287 header[1] = DICT;
3288 len = 2;
3289 }
3290
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003291 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003292 goto error;
3293
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003294 if (memo_put(self, obj) < 0)
3295 goto error;
3296
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003297 if (PyDict_GET_SIZE(obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003298 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00003299 if (PyDict_CheckExact(obj) && self->proto > 0) {
3300 /* We can take certain shortcuts if we know this is a dict and
3301 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003302 if (Py_EnterRecursiveCall(" while pickling an object"))
3303 goto error;
3304 status = batch_dict_exact(self, obj);
3305 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003306 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003307 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003308
Victor Stinnerad8c83a2016-09-05 17:53:15 -07003309 items = _PyObject_CallMethodId(obj, &PyId_items, NULL);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003310 if (items == NULL)
3311 goto error;
3312 iter = PyObject_GetIter(items);
3313 Py_DECREF(items);
3314 if (iter == NULL)
3315 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003316 if (Py_EnterRecursiveCall(" while pickling an object")) {
3317 Py_DECREF(iter);
3318 goto error;
3319 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00003320 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003321 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003322 Py_DECREF(iter);
3323 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003324 }
3325
3326 if (0) {
3327 error:
3328 status = -1;
3329 }
3330
3331 if (self->fast && !fast_save_leave(self, obj))
3332 status = -1;
3333
3334 return status;
3335}
3336
3337static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003338save_set(PicklerObject *self, PyObject *obj)
3339{
3340 PyObject *item;
3341 int i;
3342 Py_ssize_t set_size, ppos = 0;
3343 Py_hash_t hash;
3344
3345 const char empty_set_op = EMPTY_SET;
3346 const char mark_op = MARK;
3347 const char additems_op = ADDITEMS;
3348
3349 if (self->proto < 4) {
3350 PyObject *items;
3351 PyObject *reduce_value;
3352 int status;
3353
3354 items = PySequence_List(obj);
3355 if (items == NULL) {
3356 return -1;
3357 }
3358 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
3359 Py_DECREF(items);
3360 if (reduce_value == NULL) {
3361 return -1;
3362 }
3363 /* save_reduce() will memoize the object automatically. */
3364 status = save_reduce(self, reduce_value, obj);
3365 Py_DECREF(reduce_value);
3366 return status;
3367 }
3368
3369 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
3370 return -1;
3371
3372 if (memo_put(self, obj) < 0)
3373 return -1;
3374
3375 set_size = PySet_GET_SIZE(obj);
3376 if (set_size == 0)
3377 return 0; /* nothing to do */
3378
3379 /* Write in batches of BATCHSIZE. */
3380 do {
3381 i = 0;
3382 if (_Pickler_Write(self, &mark_op, 1) < 0)
3383 return -1;
3384 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
3385 if (save(self, item, 0) < 0)
3386 return -1;
3387 if (++i == BATCHSIZE)
3388 break;
3389 }
3390 if (_Pickler_Write(self, &additems_op, 1) < 0)
3391 return -1;
3392 if (PySet_GET_SIZE(obj) != set_size) {
3393 PyErr_Format(
3394 PyExc_RuntimeError,
3395 "set changed size during iteration");
3396 return -1;
3397 }
3398 } while (i == BATCHSIZE);
3399
3400 return 0;
3401}
3402
3403static int
3404save_frozenset(PicklerObject *self, PyObject *obj)
3405{
3406 PyObject *iter;
3407
3408 const char mark_op = MARK;
3409 const char frozenset_op = FROZENSET;
3410
3411 if (self->fast && !fast_save_enter(self, obj))
3412 return -1;
3413
3414 if (self->proto < 4) {
3415 PyObject *items;
3416 PyObject *reduce_value;
3417 int status;
3418
3419 items = PySequence_List(obj);
3420 if (items == NULL) {
3421 return -1;
3422 }
3423 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
3424 items);
3425 Py_DECREF(items);
3426 if (reduce_value == NULL) {
3427 return -1;
3428 }
3429 /* save_reduce() will memoize the object automatically. */
3430 status = save_reduce(self, reduce_value, obj);
3431 Py_DECREF(reduce_value);
3432 return status;
3433 }
3434
3435 if (_Pickler_Write(self, &mark_op, 1) < 0)
3436 return -1;
3437
3438 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003439 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01003440 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003441 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003442 for (;;) {
3443 PyObject *item;
3444
3445 item = PyIter_Next(iter);
3446 if (item == NULL) {
3447 if (PyErr_Occurred()) {
3448 Py_DECREF(iter);
3449 return -1;
3450 }
3451 break;
3452 }
3453 if (save(self, item, 0) < 0) {
3454 Py_DECREF(item);
3455 Py_DECREF(iter);
3456 return -1;
3457 }
3458 Py_DECREF(item);
3459 }
3460 Py_DECREF(iter);
3461
3462 /* If the object is already in the memo, this means it is
3463 recursive. In this case, throw away everything we put on the
3464 stack, and fetch the object back from the memo. */
3465 if (PyMemoTable_Get(self->memo, obj)) {
3466 const char pop_mark_op = POP_MARK;
3467
3468 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3469 return -1;
3470 if (memo_get(self, obj) < 0)
3471 return -1;
3472 return 0;
3473 }
3474
3475 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3476 return -1;
3477 if (memo_put(self, obj) < 0)
3478 return -1;
3479
3480 return 0;
3481}
3482
3483static int
3484fix_imports(PyObject **module_name, PyObject **global_name)
3485{
3486 PyObject *key;
3487 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003488 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003489
3490 key = PyTuple_Pack(2, *module_name, *global_name);
3491 if (key == NULL)
3492 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003493 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003494 Py_DECREF(key);
3495 if (item) {
3496 PyObject *fixed_module_name;
3497 PyObject *fixed_global_name;
3498
3499 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3500 PyErr_Format(PyExc_RuntimeError,
3501 "_compat_pickle.REVERSE_NAME_MAPPING values "
3502 "should be 2-tuples, not %.200s",
3503 Py_TYPE(item)->tp_name);
3504 return -1;
3505 }
3506 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3507 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3508 if (!PyUnicode_Check(fixed_module_name) ||
3509 !PyUnicode_Check(fixed_global_name)) {
3510 PyErr_Format(PyExc_RuntimeError,
3511 "_compat_pickle.REVERSE_NAME_MAPPING values "
3512 "should be pairs of str, not (%.200s, %.200s)",
3513 Py_TYPE(fixed_module_name)->tp_name,
3514 Py_TYPE(fixed_global_name)->tp_name);
3515 return -1;
3516 }
3517
3518 Py_CLEAR(*module_name);
3519 Py_CLEAR(*global_name);
3520 Py_INCREF(fixed_module_name);
3521 Py_INCREF(fixed_global_name);
3522 *module_name = fixed_module_name;
3523 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003524 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003525 }
3526 else if (PyErr_Occurred()) {
3527 return -1;
3528 }
3529
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003530 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003531 if (item) {
3532 if (!PyUnicode_Check(item)) {
3533 PyErr_Format(PyExc_RuntimeError,
3534 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3535 "should be strings, not %.200s",
3536 Py_TYPE(item)->tp_name);
3537 return -1;
3538 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003539 Py_INCREF(item);
Serhiy Storchaka48842712016-04-06 09:45:48 +03003540 Py_XSETREF(*module_name, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003541 }
3542 else if (PyErr_Occurred()) {
3543 return -1;
3544 }
3545
3546 return 0;
3547}
3548
3549static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003550save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3551{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003552 PyObject *global_name = NULL;
3553 PyObject *module_name = NULL;
3554 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003555 PyObject *parent = NULL;
3556 PyObject *dotted_path = NULL;
3557 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003558 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003559 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003560 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003561 _Py_IDENTIFIER(__name__);
3562 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003563
3564 const char global_op = GLOBAL;
3565
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003566 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003567 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003568 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003569 }
3570 else {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003571 if (_PyObject_LookupAttrId(obj, &PyId___qualname__, &global_name) < 0)
3572 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003573 if (global_name == NULL) {
3574 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3575 if (global_name == NULL)
3576 goto error;
3577 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003578 }
3579
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003580 dotted_path = get_dotted_path(module, global_name);
3581 if (dotted_path == NULL)
3582 goto error;
3583 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003584 if (module_name == NULL)
3585 goto error;
3586
3587 /* XXX: Change to use the import C API directly with level=0 to disallow
3588 relative imports.
3589
3590 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3591 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3592 custom import functions (IMHO, this would be a nice security
3593 feature). The import C API would need to be extended to support the
3594 extra parameters of __import__ to fix that. */
3595 module = PyImport_Import(module_name);
3596 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003597 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003598 "Can't pickle %R: import of module %R failed",
3599 obj, module_name);
3600 goto error;
3601 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003602 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3603 Py_INCREF(lastname);
3604 cls = get_deep_attribute(module, dotted_path, &parent);
3605 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003606 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003607 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003608 "Can't pickle %R: attribute lookup %S on %S failed",
3609 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003610 goto error;
3611 }
3612 if (cls != obj) {
3613 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003614 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003615 "Can't pickle %R: it's not the same object as %S.%S",
3616 obj, module_name, global_name);
3617 goto error;
3618 }
3619 Py_DECREF(cls);
3620
3621 if (self->proto >= 2) {
3622 /* See whether this is in the extension registry, and if
3623 * so generate an EXT opcode.
3624 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003625 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003626 PyObject *code_obj; /* extension code as Python object */
3627 long code; /* extension code as C value */
3628 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003629 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003630
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003631 extension_key = PyTuple_Pack(2, module_name, global_name);
3632 if (extension_key == NULL) {
3633 goto error;
3634 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003635 code_obj = PyDict_GetItemWithError(st->extension_registry,
3636 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003637 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003638 /* The object is not registered in the extension registry.
3639 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003640 if (code_obj == NULL) {
3641 if (PyErr_Occurred()) {
3642 goto error;
3643 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003644 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003645 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003646
3647 /* XXX: pickle.py doesn't check neither the type, nor the range
3648 of the value returned by the extension_registry. It should for
3649 consistency. */
3650
3651 /* Verify code_obj has the right type and value. */
3652 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003653 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003654 "Can't pickle %R: extension code %R isn't an integer",
3655 obj, code_obj);
3656 goto error;
3657 }
3658 code = PyLong_AS_LONG(code_obj);
3659 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003660 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003661 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3662 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003663 goto error;
3664 }
3665
3666 /* Generate an EXT opcode. */
3667 if (code <= 0xff) {
3668 pdata[0] = EXT1;
3669 pdata[1] = (unsigned char)code;
3670 n = 2;
3671 }
3672 else if (code <= 0xffff) {
3673 pdata[0] = EXT2;
3674 pdata[1] = (unsigned char)(code & 0xff);
3675 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3676 n = 3;
3677 }
3678 else {
3679 pdata[0] = EXT4;
3680 pdata[1] = (unsigned char)(code & 0xff);
3681 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3682 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3683 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3684 n = 5;
3685 }
3686
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003687 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003688 goto error;
3689 }
3690 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003691 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003692 if (parent == module) {
3693 Py_INCREF(lastname);
3694 Py_DECREF(global_name);
3695 global_name = lastname;
3696 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003697 if (self->proto >= 4) {
3698 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003699
Christian Heimese8b1ba12013-11-23 21:13:39 +01003700 if (save(self, module_name, 0) < 0)
3701 goto error;
3702 if (save(self, global_name, 0) < 0)
3703 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003704
3705 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3706 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003707 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003708 else if (parent != module) {
3709 PickleState *st = _Pickle_GetGlobalState();
3710 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3711 st->getattr, parent, lastname);
Alexey Izbyshevf8c06b02018-08-22 07:51:25 +03003712 if (reduce_value == NULL)
3713 goto error;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003714 status = save_reduce(self, reduce_value, NULL);
3715 Py_DECREF(reduce_value);
3716 if (status < 0)
3717 goto error;
3718 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003719 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003720 /* Generate a normal global opcode if we are using a pickle
3721 protocol < 4, or if the object is not registered in the
3722 extension registry. */
3723 PyObject *encoded;
3724 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003725
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003726 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003727 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003728
3729 /* For protocol < 3 and if the user didn't request against doing
3730 so, we convert module names to the old 2.x module names. */
3731 if (self->proto < 3 && self->fix_imports) {
3732 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003733 goto error;
3734 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003735 }
3736
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003737 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3738 both the module name and the global name using UTF-8. We do so
3739 only when we are using the pickle protocol newer than version
3740 3. This is to ensure compatibility with older Unpickler running
3741 on Python 2.x. */
3742 if (self->proto == 3) {
3743 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003744 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003745 else {
3746 unicode_encoder = PyUnicode_AsASCIIString;
3747 }
3748 encoded = unicode_encoder(module_name);
3749 if (encoded == NULL) {
3750 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003751 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003752 "can't pickle module identifier '%S' using "
3753 "pickle protocol %i",
3754 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003755 goto error;
3756 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003757 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3758 PyBytes_GET_SIZE(encoded)) < 0) {
3759 Py_DECREF(encoded);
3760 goto error;
3761 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003762 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003763 if(_Pickler_Write(self, "\n", 1) < 0)
3764 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003766 /* Save the name of the module. */
3767 encoded = unicode_encoder(global_name);
3768 if (encoded == NULL) {
3769 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003770 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003771 "can't pickle global identifier '%S' using "
3772 "pickle protocol %i",
3773 global_name, self->proto);
3774 goto error;
3775 }
3776 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3777 PyBytes_GET_SIZE(encoded)) < 0) {
3778 Py_DECREF(encoded);
3779 goto error;
3780 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003781 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003782 if (_Pickler_Write(self, "\n", 1) < 0)
3783 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003784 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003785 /* Memoize the object. */
3786 if (memo_put(self, obj) < 0)
3787 goto error;
3788 }
3789
3790 if (0) {
3791 error:
3792 status = -1;
3793 }
3794 Py_XDECREF(module_name);
3795 Py_XDECREF(global_name);
3796 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003797 Py_XDECREF(parent);
3798 Py_XDECREF(dotted_path);
3799 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003800
3801 return status;
3802}
3803
3804static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003805save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3806{
3807 PyObject *reduce_value;
3808 int status;
3809
3810 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3811 if (reduce_value == NULL) {
3812 return -1;
3813 }
3814 status = save_reduce(self, reduce_value, obj);
3815 Py_DECREF(reduce_value);
3816 return status;
3817}
3818
3819static int
3820save_type(PicklerObject *self, PyObject *obj)
3821{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003822 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003823 return save_singleton_type(self, obj, Py_None);
3824 }
3825 else if (obj == (PyObject *)&PyEllipsis_Type) {
3826 return save_singleton_type(self, obj, Py_Ellipsis);
3827 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003828 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003829 return save_singleton_type(self, obj, Py_NotImplemented);
3830 }
3831 return save_global(self, obj, NULL);
3832}
3833
3834static int
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003835save_pers(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003836{
3837 PyObject *pid = NULL;
3838 int status = 0;
3839
3840 const char persid_op = PERSID;
3841 const char binpersid_op = BINPERSID;
3842
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003843 pid = call_method(self->pers_func, self->pers_func_self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003844 if (pid == NULL)
3845 return -1;
3846
3847 if (pid != Py_None) {
3848 if (self->bin) {
3849 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003850 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003851 goto error;
3852 }
3853 else {
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003854 PyObject *pid_str;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003855
3856 pid_str = PyObject_Str(pid);
3857 if (pid_str == NULL)
3858 goto error;
3859
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003860 /* XXX: Should it check whether the pid contains embedded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003861 newlines? */
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003862 if (!PyUnicode_IS_ASCII(pid_str)) {
3863 PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
3864 "persistent IDs in protocol 0 must be "
3865 "ASCII strings");
3866 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003867 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003868 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003869
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003870 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003871 _Pickler_Write(self, PyUnicode_DATA(pid_str),
3872 PyUnicode_GET_LENGTH(pid_str)) < 0 ||
3873 _Pickler_Write(self, "\n", 1) < 0) {
3874 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003875 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003876 }
3877 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003878 }
3879 status = 1;
3880 }
3881
3882 if (0) {
3883 error:
3884 status = -1;
3885 }
3886 Py_XDECREF(pid);
3887
3888 return status;
3889}
3890
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003891static PyObject *
3892get_class(PyObject *obj)
3893{
3894 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003895 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003896
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003897 if (_PyObject_LookupAttrId(obj, &PyId___class__, &cls) == 0) {
3898 cls = (PyObject *) Py_TYPE(obj);
3899 Py_INCREF(cls);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003900 }
3901 return cls;
3902}
3903
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003904/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3905 * appropriate __reduce__ method for obj.
3906 */
3907static int
3908save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3909{
3910 PyObject *callable;
3911 PyObject *argtup;
3912 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003913 PyObject *listitems = Py_None;
3914 PyObject *dictitems = Py_None;
Pierre Glaser65d98d02019-05-08 21:40:25 +02003915 PyObject *state_setter = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003916 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003917 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003918 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003919
3920 const char reduce_op = REDUCE;
3921 const char build_op = BUILD;
3922 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003923 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003924
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003925 size = PyTuple_Size(args);
Pierre Glaser65d98d02019-05-08 21:40:25 +02003926 if (size < 2 || size > 6) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003927 PyErr_SetString(st->PicklingError, "tuple returned by "
Pierre Glaser65d98d02019-05-08 21:40:25 +02003928 "__reduce__ must contain 2 through 6 elements");
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003929 return -1;
3930 }
3931
Pierre Glaser65d98d02019-05-08 21:40:25 +02003932 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 6,
3933 &callable, &argtup, &state, &listitems, &dictitems,
3934 &state_setter))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003935 return -1;
3936
3937 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003938 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003939 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003940 return -1;
3941 }
3942 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003943 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003944 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003945 return -1;
3946 }
3947
3948 if (state == Py_None)
3949 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003950
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003951 if (listitems == Py_None)
3952 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003953 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003954 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003955 "returned by __reduce__ must be an iterator, not %s",
3956 Py_TYPE(listitems)->tp_name);
3957 return -1;
3958 }
3959
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003960 if (dictitems == Py_None)
3961 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003962 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003963 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003964 "returned by __reduce__ must be an iterator, not %s",
3965 Py_TYPE(dictitems)->tp_name);
3966 return -1;
3967 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003968
Pierre Glaser65d98d02019-05-08 21:40:25 +02003969 if (state_setter == Py_None)
3970 state_setter = NULL;
3971 else if (!PyCallable_Check(state_setter)) {
3972 PyErr_Format(st->PicklingError, "sixth element of the tuple "
3973 "returned by __reduce__ must be a function, not %s",
3974 Py_TYPE(state_setter)->tp_name);
3975 return -1;
3976 }
3977
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003978 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003979 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003980 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003981
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003982 if (_PyObject_LookupAttrId(callable, &PyId___name__, &name) < 0) {
3983 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003984 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003985 if (name != NULL && PyUnicode_Check(name)) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003986 _Py_IDENTIFIER(__newobj_ex__);
Serhiy Storchakaf0f35a62017-01-09 10:09:43 +02003987 use_newobj_ex = _PyUnicode_EqualToASCIIId(
3988 name, &PyId___newobj_ex__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003989 if (!use_newobj_ex) {
3990 _Py_IDENTIFIER(__newobj__);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02003991 use_newobj = _PyUnicode_EqualToASCIIId(name, &PyId___newobj__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003992 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003993 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003994 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003995 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003996
3997 if (use_newobj_ex) {
3998 PyObject *cls;
3999 PyObject *args;
4000 PyObject *kwargs;
4001
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004002 if (PyTuple_GET_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004003 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004004 "length of the NEWOBJ_EX argument tuple must be "
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004005 "exactly 3, not %zd", PyTuple_GET_SIZE(argtup));
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004006 return -1;
4007 }
4008
4009 cls = PyTuple_GET_ITEM(argtup, 0);
4010 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004011 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004012 "first item from NEWOBJ_EX argument tuple must "
4013 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
4014 return -1;
4015 }
4016 args = PyTuple_GET_ITEM(argtup, 1);
4017 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004018 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004019 "second item from NEWOBJ_EX argument tuple must "
4020 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
4021 return -1;
4022 }
4023 kwargs = PyTuple_GET_ITEM(argtup, 2);
4024 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004025 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004026 "third item from NEWOBJ_EX argument tuple must "
4027 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
4028 return -1;
4029 }
4030
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004031 if (self->proto >= 4) {
4032 if (save(self, cls, 0) < 0 ||
4033 save(self, args, 0) < 0 ||
4034 save(self, kwargs, 0) < 0 ||
4035 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
4036 return -1;
4037 }
4038 }
4039 else {
4040 PyObject *newargs;
4041 PyObject *cls_new;
4042 Py_ssize_t i;
4043 _Py_IDENTIFIER(__new__);
4044
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004045 newargs = PyTuple_New(PyTuple_GET_SIZE(args) + 2);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004046 if (newargs == NULL)
4047 return -1;
4048
4049 cls_new = _PyObject_GetAttrId(cls, &PyId___new__);
4050 if (cls_new == NULL) {
4051 Py_DECREF(newargs);
4052 return -1;
4053 }
4054 PyTuple_SET_ITEM(newargs, 0, cls_new);
4055 Py_INCREF(cls);
4056 PyTuple_SET_ITEM(newargs, 1, cls);
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004057 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004058 PyObject *item = PyTuple_GET_ITEM(args, i);
4059 Py_INCREF(item);
4060 PyTuple_SET_ITEM(newargs, i + 2, item);
4061 }
4062
4063 callable = PyObject_Call(st->partial, newargs, kwargs);
4064 Py_DECREF(newargs);
4065 if (callable == NULL)
4066 return -1;
4067
4068 newargs = PyTuple_New(0);
4069 if (newargs == NULL) {
4070 Py_DECREF(callable);
4071 return -1;
4072 }
4073
4074 if (save(self, callable, 0) < 0 ||
4075 save(self, newargs, 0) < 0 ||
4076 _Pickler_Write(self, &reduce_op, 1) < 0) {
4077 Py_DECREF(newargs);
4078 Py_DECREF(callable);
4079 return -1;
4080 }
4081 Py_DECREF(newargs);
4082 Py_DECREF(callable);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004083 }
4084 }
4085 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004086 PyObject *cls;
4087 PyObject *newargtup;
4088 PyObject *obj_class;
4089 int p;
4090
4091 /* Sanity checks. */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004092 if (PyTuple_GET_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004093 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004094 return -1;
4095 }
4096
4097 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004098 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004099 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004100 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004101 return -1;
4102 }
4103
4104 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004105 obj_class = get_class(obj);
Zackery Spytz25d38972018-12-05 11:29:20 -07004106 if (obj_class == NULL) {
4107 return -1;
4108 }
4109 p = obj_class != cls;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004110 Py_DECREF(obj_class);
4111 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004112 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004113 "__newobj__ args has the wrong class");
4114 return -1;
4115 }
4116 }
4117 /* XXX: These calls save() are prone to infinite recursion. Imagine
4118 what happen if the value returned by the __reduce__() method of
4119 some extension type contains another object of the same type. Ouch!
4120
4121 Here is a quick example, that I ran into, to illustrate what I
4122 mean:
4123
4124 >>> import pickle, copyreg
4125 >>> copyreg.dispatch_table.pop(complex)
4126 >>> pickle.dumps(1+2j)
4127 Traceback (most recent call last):
4128 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04004129 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004130
4131 Removing the complex class from copyreg.dispatch_table made the
4132 __reduce_ex__() method emit another complex object:
4133
4134 >>> (1+1j).__reduce_ex__(2)
4135 (<function __newobj__ at 0xb7b71c3c>,
4136 (<class 'complex'>, (1+1j)), None, None, None)
4137
4138 Thus when save() was called on newargstup (the 2nd item) recursion
4139 ensued. Of course, the bug was in the complex class which had a
4140 broken __getnewargs__() that emitted another complex object. But,
4141 the point, here, is it is quite easy to end up with a broken reduce
4142 function. */
4143
4144 /* Save the class and its __new__ arguments. */
4145 if (save(self, cls, 0) < 0)
4146 return -1;
4147
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004148 newargtup = PyTuple_GetSlice(argtup, 1, PyTuple_GET_SIZE(argtup));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004149 if (newargtup == NULL)
4150 return -1;
4151
4152 p = save(self, newargtup, 0);
4153 Py_DECREF(newargtup);
4154 if (p < 0)
4155 return -1;
4156
4157 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004158 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004159 return -1;
4160 }
4161 else { /* Not using NEWOBJ. */
4162 if (save(self, callable, 0) < 0 ||
4163 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004164 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004165 return -1;
4166 }
4167
4168 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
4169 the caller do not want to memoize the object. Not particularly useful,
4170 but that is to mimic the behavior save_reduce() in pickle.py when
4171 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004172 if (obj != NULL) {
4173 /* If the object is already in the memo, this means it is
4174 recursive. In this case, throw away everything we put on the
4175 stack, and fetch the object back from the memo. */
4176 if (PyMemoTable_Get(self->memo, obj)) {
4177 const char pop_op = POP;
4178
4179 if (_Pickler_Write(self, &pop_op, 1) < 0)
4180 return -1;
4181 if (memo_get(self, obj) < 0)
4182 return -1;
4183
4184 return 0;
4185 }
4186 else if (memo_put(self, obj) < 0)
4187 return -1;
4188 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004189
4190 if (listitems && batch_list(self, listitems) < 0)
4191 return -1;
4192
4193 if (dictitems && batch_dict(self, dictitems) < 0)
4194 return -1;
4195
4196 if (state) {
Pierre Glaser65d98d02019-05-08 21:40:25 +02004197 if (state_setter == NULL) {
4198 if (save(self, state, 0) < 0 ||
4199 _Pickler_Write(self, &build_op, 1) < 0)
4200 return -1;
4201 }
4202 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004203
Pierre Glaser65d98d02019-05-08 21:40:25 +02004204 /* If a state_setter is specified, call it instead of load_build to
4205 * update obj's with its previous state.
4206 * The first 4 save/write instructions push state_setter and its
4207 * tuple of expected arguments (obj, state) onto the stack. The
4208 * REDUCE opcode triggers the state_setter(obj, state) function
4209 * call. Finally, because state-updating routines only do in-place
4210 * modification, the whole operation has to be stack-transparent.
4211 * Thus, we finally pop the call's output from the stack.*/
4212
4213 const char tupletwo_op = TUPLE2;
4214 const char pop_op = POP;
4215 if (save(self, state_setter, 0) < 0 ||
4216 save(self, obj, 0) < 0 || save(self, state, 0) < 0 ||
4217 _Pickler_Write(self, &tupletwo_op, 1) < 0 ||
4218 _Pickler_Write(self, &reduce_op, 1) < 0 ||
4219 _Pickler_Write(self, &pop_op, 1) < 0)
4220 return -1;
4221 }
4222 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004223 return 0;
4224}
4225
4226static int
4227save(PicklerObject *self, PyObject *obj, int pers_save)
4228{
4229 PyTypeObject *type;
4230 PyObject *reduce_func = NULL;
4231 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004232 int status = 0;
4233
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004234 if (_Pickler_OpcodeBoundary(self) < 0)
4235 return -1;
4236
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004237 /* The extra pers_save argument is necessary to avoid calling save_pers()
4238 on its returned object. */
4239 if (!pers_save && self->pers_func) {
4240 /* save_pers() returns:
4241 -1 to signal an error;
4242 0 if it did nothing successfully;
4243 1 if a persistent id was saved.
4244 */
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004245 if ((status = save_pers(self, obj)) != 0)
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004246 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004247 }
4248
4249 type = Py_TYPE(obj);
4250
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004251 /* The old cPickle had an optimization that used switch-case statement
4252 dispatching on the first letter of the type name. This has was removed
4253 since benchmarks shown that this optimization was actually slowing
4254 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004255
4256 /* Atom types; these aren't memoized, so don't check the memo. */
4257
4258 if (obj == Py_None) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004259 return save_none(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004260 }
4261 else if (obj == Py_False || obj == Py_True) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004262 return save_bool(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004263 }
4264 else if (type == &PyLong_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004265 return save_long(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004266 }
4267 else if (type == &PyFloat_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004268 return save_float(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004269 }
4270
4271 /* Check the memo to see if it has the object. If so, generate
4272 a GET (or BINGET) opcode, instead of pickling the object
4273 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004274 if (PyMemoTable_Get(self->memo, obj)) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004275 return memo_get(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004276 }
4277
4278 if (type == &PyBytes_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004279 return save_bytes(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004280 }
4281 else if (type == &PyUnicode_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004282 return save_unicode(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004283 }
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004284
4285 /* We're only calling Py_EnterRecursiveCall here so that atomic
4286 types above are pickled faster. */
4287 if (Py_EnterRecursiveCall(" while pickling an object")) {
4288 return -1;
4289 }
4290
4291 if (type == &PyDict_Type) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004292 status = save_dict(self, obj);
4293 goto done;
4294 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004295 else if (type == &PySet_Type) {
4296 status = save_set(self, obj);
4297 goto done;
4298 }
4299 else if (type == &PyFrozenSet_Type) {
4300 status = save_frozenset(self, obj);
4301 goto done;
4302 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004303 else if (type == &PyList_Type) {
4304 status = save_list(self, obj);
4305 goto done;
4306 }
4307 else if (type == &PyTuple_Type) {
4308 status = save_tuple(self, obj);
4309 goto done;
4310 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02004311 else if (type == &PyByteArray_Type) {
4312 status = save_bytearray(self, obj);
4313 goto done;
4314 }
4315 else if (type == &PyPickleBuffer_Type) {
4316 status = save_picklebuffer(self, obj);
4317 goto done;
4318 }
Pierre Glaser289f1f82019-05-08 23:08:25 +02004319
4320 /* Now, check reducer_override. If it returns NotImplemented,
4321 * fallback to save_type or save_global, and then perhaps to the
4322 * regular reduction mechanism.
4323 */
4324 if (self->reducer_override != NULL) {
4325 reduce_value = PyObject_CallFunctionObjArgs(self->reducer_override,
4326 obj, NULL);
4327 if (reduce_value == NULL) {
4328 goto error;
4329 }
4330 if (reduce_value != Py_NotImplemented) {
4331 goto reduce;
4332 }
4333 Py_DECREF(reduce_value);
4334 reduce_value = NULL;
4335 }
4336
4337 if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08004338 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004339 goto done;
4340 }
4341 else if (type == &PyFunction_Type) {
4342 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08004343 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004344 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004345
4346 /* XXX: This part needs some unit tests. */
4347
4348 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004349 * self.dispatch_table, copyreg.dispatch_table, the object's
4350 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004351 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004352 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004353 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004354 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
4355 (PyObject *)type);
4356 if (reduce_func == NULL) {
4357 if (PyErr_Occurred()) {
4358 goto error;
4359 }
4360 } else {
4361 /* PyDict_GetItemWithError() returns a borrowed reference.
4362 Increase the reference count to be consistent with
4363 PyObject_GetItem and _PyObject_GetAttrId used below. */
4364 Py_INCREF(reduce_func);
4365 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004366 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004367 reduce_func = PyObject_GetItem(self->dispatch_table,
4368 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004369 if (reduce_func == NULL) {
4370 if (PyErr_ExceptionMatches(PyExc_KeyError))
4371 PyErr_Clear();
4372 else
4373 goto error;
4374 }
4375 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004376 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004377 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004378 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004379 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02004380 else if (PyType_IsSubtype(type, &PyType_Type)) {
4381 status = save_global(self, obj, NULL);
4382 goto done;
4383 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004384 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004385 _Py_IDENTIFIER(__reduce__);
4386 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004388
4389 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
4390 automatically defined as __reduce__. While this is convenient, this
4391 make it impossible to know which method was actually called. Of
4392 course, this is not a big deal. But still, it would be nice to let
4393 the user know which method was called when something go
4394 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
4395 don't actually have to check for a __reduce__ method. */
4396
4397 /* Check for a __reduce_ex__ method. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004398 if (_PyObject_LookupAttrId(obj, &PyId___reduce_ex__, &reduce_func) < 0) {
4399 goto error;
4400 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004401 if (reduce_func != NULL) {
4402 PyObject *proto;
4403 proto = PyLong_FromLong(self->proto);
4404 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004405 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004406 }
4407 }
4408 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004409 PickleState *st = _Pickle_GetGlobalState();
4410
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004411 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004412 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004413 if (reduce_func != NULL) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02004414 reduce_value = _PyObject_CallNoArg(reduce_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004415 }
4416 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004417 PyErr_Format(st->PicklingError,
4418 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004419 type->tp_name, obj);
4420 goto error;
4421 }
4422 }
4423 }
4424
4425 if (reduce_value == NULL)
4426 goto error;
4427
Pierre Glaser289f1f82019-05-08 23:08:25 +02004428 reduce:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004429 if (PyUnicode_Check(reduce_value)) {
4430 status = save_global(self, obj, reduce_value);
4431 goto done;
4432 }
4433
4434 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004435 PickleState *st = _Pickle_GetGlobalState();
4436 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004437 "__reduce__ must return a string or tuple");
4438 goto error;
4439 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004440
4441 status = save_reduce(self, reduce_value, obj);
4442
4443 if (0) {
4444 error:
4445 status = -1;
4446 }
4447 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004448
Alexandre Vassalottidff18342008-07-13 18:48:30 +00004449 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004450 Py_XDECREF(reduce_func);
4451 Py_XDECREF(reduce_value);
4452
4453 return status;
4454}
4455
4456static int
4457dump(PicklerObject *self, PyObject *obj)
4458{
4459 const char stop_op = STOP;
Pierre Glaser289f1f82019-05-08 23:08:25 +02004460 PyObject *tmp;
4461 _Py_IDENTIFIER(reducer_override);
4462
4463 if (_PyObject_LookupAttrId((PyObject *)self, &PyId_reducer_override,
4464 &tmp) < 0) {
4465 return -1;
4466 }
4467 /* Cache the reducer_override method, if it exists. */
4468 if (tmp != NULL) {
4469 Py_XSETREF(self->reducer_override, tmp);
4470 }
4471 else {
4472 Py_CLEAR(self->reducer_override);
4473 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004474
4475 if (self->proto >= 2) {
4476 char header[2];
4477
4478 header[0] = PROTO;
4479 assert(self->proto >= 0 && self->proto < 256);
4480 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004481 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004482 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004483 if (self->proto >= 4)
4484 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004485 }
4486
4487 if (save(self, obj, 0) < 0 ||
Serhiy Storchakac8695292018-04-04 00:11:27 +03004488 _Pickler_Write(self, &stop_op, 1) < 0 ||
4489 _Pickler_CommitFrame(self) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004490 return -1;
Serhiy Storchakac8695292018-04-04 00:11:27 +03004491 self->framing = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004492 return 0;
4493}
4494
Larry Hastings61272b72014-01-07 12:41:53 -08004495/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004496
4497_pickle.Pickler.clear_memo
4498
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004499Clears the pickler's "memo".
4500
4501The memo is the data structure that remembers which objects the
4502pickler has already seen, so that shared or recursive objects are
4503pickled by reference and not by value. This method is useful when
4504re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08004505[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004506
Larry Hastings3cceb382014-01-04 11:09:09 -08004507static PyObject *
4508_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004509/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004510{
4511 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004512 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004513
4514 Py_RETURN_NONE;
4515}
4516
Larry Hastings61272b72014-01-07 12:41:53 -08004517/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004518
4519_pickle.Pickler.dump
4520
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004521 obj: object
4522 /
4523
4524Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08004525[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004526
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004527static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004528_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08004529/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004530{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004531 /* Check whether the Pickler was initialized correctly (issue3664).
4532 Developers often forget to call __init__() in their subclasses, which
4533 would trigger a segfault without this check. */
4534 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004535 PickleState *st = _Pickle_GetGlobalState();
4536 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004537 "Pickler.__init__() was not called by %s.__init__()",
4538 Py_TYPE(self)->tp_name);
4539 return NULL;
4540 }
4541
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004542 if (_Pickler_ClearBuffer(self) < 0)
4543 return NULL;
4544
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004545 if (dump(self, obj) < 0)
4546 return NULL;
4547
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004548 if (_Pickler_FlushToFile(self) < 0)
4549 return NULL;
4550
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004551 Py_RETURN_NONE;
4552}
4553
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004554/*[clinic input]
4555
4556_pickle.Pickler.__sizeof__ -> Py_ssize_t
4557
4558Returns size in memory, in bytes.
4559[clinic start generated code]*/
4560
4561static Py_ssize_t
4562_pickle_Pickler___sizeof___impl(PicklerObject *self)
4563/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4564{
4565 Py_ssize_t res, s;
4566
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004567 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004568 if (self->memo != NULL) {
4569 res += sizeof(PyMemoTable);
4570 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4571 }
4572 if (self->output_buffer != NULL) {
4573 s = _PySys_GetSizeOf(self->output_buffer);
4574 if (s == -1)
4575 return -1;
4576 res += s;
4577 }
4578 return res;
4579}
4580
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004581static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004582 _PICKLE_PICKLER_DUMP_METHODDEF
4583 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004584 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004585 {NULL, NULL} /* sentinel */
4586};
4587
4588static void
4589Pickler_dealloc(PicklerObject *self)
4590{
4591 PyObject_GC_UnTrack(self);
4592
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004593 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004594 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004595 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004596 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004597 Py_XDECREF(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004598 Py_XDECREF(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004599 Py_XDECREF(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004600
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004601 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004602
4603 Py_TYPE(self)->tp_free((PyObject *)self);
4604}
4605
4606static int
4607Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4608{
4609 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004610 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004611 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004612 Py_VISIT(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004613 Py_VISIT(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004614 Py_VISIT(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004615 return 0;
4616}
4617
4618static int
4619Pickler_clear(PicklerObject *self)
4620{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004621 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004622 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004623 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004624 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004625 Py_CLEAR(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004626 Py_CLEAR(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004627 Py_CLEAR(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004628
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004629 if (self->memo != NULL) {
4630 PyMemoTable *memo = self->memo;
4631 self->memo = NULL;
4632 PyMemoTable_Del(memo);
4633 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004634 return 0;
4635}
4636
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004637
Larry Hastings61272b72014-01-07 12:41:53 -08004638/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004639
4640_pickle.Pickler.__init__
4641
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004642 file: object
4643 protocol: object = NULL
4644 fix_imports: bool = True
Antoine Pitrou91f43802019-05-26 17:10:09 +02004645 buffer_callback: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004646
4647This takes a binary file for writing a pickle data stream.
4648
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004649The optional *protocol* argument tells the pickler to use the given
4650protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4651protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004652
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004653Specifying a negative protocol version selects the highest protocol
4654version supported. The higher the protocol used, the more recent the
4655version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004656
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004657The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004658bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004659writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004660this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004661
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004662If *fix_imports* is True and protocol is less than 3, pickle will try
4663to map the new Python 3 names to the old module names used in Python
46642, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02004665
4666If *buffer_callback* is None (the default), buffer views are
4667serialized into *file* as part of the pickle stream.
4668
4669If *buffer_callback* is not None, then it can be called any number
4670of times with a buffer view. If the callback returns a false value
4671(such as None), the given buffer is out-of-band; otherwise the
4672buffer is serialized in-band, i.e. inside the pickle stream.
4673
4674It is an error if *buffer_callback* is not None and *protocol*
4675is None or smaller than 5.
4676
Larry Hastings61272b72014-01-07 12:41:53 -08004677[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004678
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004679static int
Larry Hastings89964c42015-04-14 18:07:59 -04004680_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
Antoine Pitrou91f43802019-05-26 17:10:09 +02004681 PyObject *protocol, int fix_imports,
4682 PyObject *buffer_callback)
4683/*[clinic end generated code: output=0abedc50590d259b input=9a43a1c50ab91652]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004684{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004685 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004686 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004687
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004688 /* In case of multiple __init__() calls, clear previous content. */
4689 if (self->write != NULL)
4690 (void)Pickler_clear(self);
4691
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004692 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004693 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004694
4695 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004696 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004697
Antoine Pitrou91f43802019-05-26 17:10:09 +02004698 if (_Pickler_SetBufferCallback(self, buffer_callback) < 0)
4699 return -1;
4700
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004701 /* memo and output_buffer may have already been created in _Pickler_New */
4702 if (self->memo == NULL) {
4703 self->memo = PyMemoTable_New();
4704 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004705 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004706 }
4707 self->output_len = 0;
4708 if (self->output_buffer == NULL) {
4709 self->max_output_len = WRITE_BUF_SIZE;
4710 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4711 self->max_output_len);
4712 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004713 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004714 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004715
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004716 self->fast = 0;
4717 self->fast_nesting = 0;
4718 self->fast_memo = NULL;
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004719
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004720 if (init_method_ref((PyObject *)self, &PyId_persistent_id,
4721 &self->pers_func, &self->pers_func_self) < 0)
4722 {
4723 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004724 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004725
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004726 if (_PyObject_LookupAttrId((PyObject *)self,
4727 &PyId_dispatch_table, &self->dispatch_table) < 0) {
4728 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004729 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004730
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004731 return 0;
4732}
4733
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004734
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004735/* Define a proxy object for the Pickler's internal memo object. This is to
4736 * avoid breaking code like:
4737 * pickler.memo.clear()
4738 * and
4739 * pickler.memo = saved_memo
4740 * Is this a good idea? Not really, but we don't want to break code that uses
4741 * it. Note that we don't implement the entire mapping API here. This is
4742 * intentional, as these should be treated as black-box implementation details.
4743 */
4744
Larry Hastings61272b72014-01-07 12:41:53 -08004745/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004746_pickle.PicklerMemoProxy.clear
4747
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004748Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004749[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004750
Larry Hastings3cceb382014-01-04 11:09:09 -08004751static PyObject *
4752_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004753/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004754{
4755 if (self->pickler->memo)
4756 PyMemoTable_Clear(self->pickler->memo);
4757 Py_RETURN_NONE;
4758}
4759
Larry Hastings61272b72014-01-07 12:41:53 -08004760/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004761_pickle.PicklerMemoProxy.copy
4762
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004763Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004764[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004765
Larry Hastings3cceb382014-01-04 11:09:09 -08004766static PyObject *
4767_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004768/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004769{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004770 PyMemoTable *memo;
4771 PyObject *new_memo = PyDict_New();
4772 if (new_memo == NULL)
4773 return NULL;
4774
4775 memo = self->pickler->memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -07004776 for (size_t i = 0; i < memo->mt_allocated; ++i) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004777 PyMemoEntry entry = memo->mt_table[i];
4778 if (entry.me_key != NULL) {
4779 int status;
4780 PyObject *key, *value;
4781
4782 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004783 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004784
4785 if (key == NULL || value == NULL) {
4786 Py_XDECREF(key);
4787 Py_XDECREF(value);
4788 goto error;
4789 }
4790 status = PyDict_SetItem(new_memo, key, value);
4791 Py_DECREF(key);
4792 Py_DECREF(value);
4793 if (status < 0)
4794 goto error;
4795 }
4796 }
4797 return new_memo;
4798
4799 error:
4800 Py_XDECREF(new_memo);
4801 return NULL;
4802}
4803
Larry Hastings61272b72014-01-07 12:41:53 -08004804/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004805_pickle.PicklerMemoProxy.__reduce__
4806
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004807Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004808[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004809
Larry Hastings3cceb382014-01-04 11:09:09 -08004810static PyObject *
4811_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004812/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004813{
4814 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004815 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004816 if (contents == NULL)
4817 return NULL;
4818
4819 reduce_value = PyTuple_New(2);
4820 if (reduce_value == NULL) {
4821 Py_DECREF(contents);
4822 return NULL;
4823 }
4824 dict_args = PyTuple_New(1);
4825 if (dict_args == NULL) {
4826 Py_DECREF(contents);
4827 Py_DECREF(reduce_value);
4828 return NULL;
4829 }
4830 PyTuple_SET_ITEM(dict_args, 0, contents);
4831 Py_INCREF((PyObject *)&PyDict_Type);
4832 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4833 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4834 return reduce_value;
4835}
4836
4837static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004838 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4839 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4840 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004841 {NULL, NULL} /* sentinel */
4842};
4843
4844static void
4845PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4846{
4847 PyObject_GC_UnTrack(self);
4848 Py_XDECREF(self->pickler);
4849 PyObject_GC_Del((PyObject *)self);
4850}
4851
4852static int
4853PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4854 visitproc visit, void *arg)
4855{
4856 Py_VISIT(self->pickler);
4857 return 0;
4858}
4859
4860static int
4861PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4862{
4863 Py_CLEAR(self->pickler);
4864 return 0;
4865}
4866
4867static PyTypeObject PicklerMemoProxyType = {
4868 PyVarObject_HEAD_INIT(NULL, 0)
4869 "_pickle.PicklerMemoProxy", /*tp_name*/
4870 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4871 0,
4872 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02004873 0, /* tp_vectorcall_offset */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004874 0, /* tp_getattr */
4875 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02004876 0, /* tp_as_async */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004877 0, /* tp_repr */
4878 0, /* tp_as_number */
4879 0, /* tp_as_sequence */
4880 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004881 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004882 0, /* tp_call */
4883 0, /* tp_str */
4884 PyObject_GenericGetAttr, /* tp_getattro */
4885 PyObject_GenericSetAttr, /* tp_setattro */
4886 0, /* tp_as_buffer */
4887 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4888 0, /* tp_doc */
4889 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4890 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4891 0, /* tp_richcompare */
4892 0, /* tp_weaklistoffset */
4893 0, /* tp_iter */
4894 0, /* tp_iternext */
4895 picklerproxy_methods, /* tp_methods */
4896};
4897
4898static PyObject *
4899PicklerMemoProxy_New(PicklerObject *pickler)
4900{
4901 PicklerMemoProxyObject *self;
4902
4903 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4904 if (self == NULL)
4905 return NULL;
4906 Py_INCREF(pickler);
4907 self->pickler = pickler;
4908 PyObject_GC_Track(self);
4909 return (PyObject *)self;
4910}
4911
4912/*****************************************************************************/
4913
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004914static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004915Pickler_get_memo(PicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004916{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004917 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004918}
4919
4920static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004921Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004922{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004923 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004924
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004925 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004926 PyErr_SetString(PyExc_TypeError,
4927 "attribute deletion is not supported");
4928 return -1;
4929 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004930
4931 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4932 PicklerObject *pickler =
4933 ((PicklerMemoProxyObject *)obj)->pickler;
4934
4935 new_memo = PyMemoTable_Copy(pickler->memo);
4936 if (new_memo == NULL)
4937 return -1;
4938 }
4939 else if (PyDict_Check(obj)) {
4940 Py_ssize_t i = 0;
4941 PyObject *key, *value;
4942
4943 new_memo = PyMemoTable_New();
4944 if (new_memo == NULL)
4945 return -1;
4946
4947 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004948 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004949 PyObject *memo_obj;
4950
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004951 if (!PyTuple_Check(value) || PyTuple_GET_SIZE(value) != 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004952 PyErr_SetString(PyExc_TypeError,
4953 "'memo' values must be 2-item tuples");
4954 goto error;
4955 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004956 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004957 if (memo_id == -1 && PyErr_Occurred())
4958 goto error;
4959 memo_obj = PyTuple_GET_ITEM(value, 1);
4960 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4961 goto error;
4962 }
4963 }
4964 else {
4965 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02004966 "'memo' attribute must be a PicklerMemoProxy object "
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004967 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004968 return -1;
4969 }
4970
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004971 PyMemoTable_Del(self->memo);
4972 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004973
4974 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004975
4976 error:
4977 if (new_memo)
4978 PyMemoTable_Del(new_memo);
4979 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004980}
4981
4982static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004983Pickler_get_persid(PicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004984{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004985 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004986 PyErr_SetString(PyExc_AttributeError, "persistent_id");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004987 return NULL;
4988 }
4989 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004990}
4991
4992static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004993Pickler_set_persid(PicklerObject *self, PyObject *value, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004994{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004995 if (value == NULL) {
4996 PyErr_SetString(PyExc_TypeError,
4997 "attribute deletion is not supported");
4998 return -1;
4999 }
5000 if (!PyCallable_Check(value)) {
5001 PyErr_SetString(PyExc_TypeError,
5002 "persistent_id must be a callable taking one argument");
5003 return -1;
5004 }
5005
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005006 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005007 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03005008 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005009
5010 return 0;
5011}
5012
5013static PyMemberDef Pickler_members[] = {
5014 {"bin", T_INT, offsetof(PicklerObject, bin)},
5015 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01005016 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005017 {NULL}
5018};
5019
5020static PyGetSetDef Pickler_getsets[] = {
5021 {"memo", (getter)Pickler_get_memo,
5022 (setter)Pickler_set_memo},
5023 {"persistent_id", (getter)Pickler_get_persid,
5024 (setter)Pickler_set_persid},
5025 {NULL}
5026};
5027
5028static PyTypeObject Pickler_Type = {
5029 PyVarObject_HEAD_INIT(NULL, 0)
5030 "_pickle.Pickler" , /*tp_name*/
5031 sizeof(PicklerObject), /*tp_basicsize*/
5032 0, /*tp_itemsize*/
5033 (destructor)Pickler_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005034 0, /*tp_vectorcall_offset*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005035 0, /*tp_getattr*/
5036 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005037 0, /*tp_as_async*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005038 0, /*tp_repr*/
5039 0, /*tp_as_number*/
5040 0, /*tp_as_sequence*/
5041 0, /*tp_as_mapping*/
5042 0, /*tp_hash*/
5043 0, /*tp_call*/
5044 0, /*tp_str*/
5045 0, /*tp_getattro*/
5046 0, /*tp_setattro*/
5047 0, /*tp_as_buffer*/
5048 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08005049 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005050 (traverseproc)Pickler_traverse, /*tp_traverse*/
5051 (inquiry)Pickler_clear, /*tp_clear*/
5052 0, /*tp_richcompare*/
5053 0, /*tp_weaklistoffset*/
5054 0, /*tp_iter*/
5055 0, /*tp_iternext*/
5056 Pickler_methods, /*tp_methods*/
5057 Pickler_members, /*tp_members*/
5058 Pickler_getsets, /*tp_getset*/
5059 0, /*tp_base*/
5060 0, /*tp_dict*/
5061 0, /*tp_descr_get*/
5062 0, /*tp_descr_set*/
5063 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08005064 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005065 PyType_GenericAlloc, /*tp_alloc*/
5066 PyType_GenericNew, /*tp_new*/
5067 PyObject_GC_Del, /*tp_free*/
5068 0, /*tp_is_gc*/
5069};
5070
Victor Stinner121aab42011-09-29 23:40:53 +02005071/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005072
5073 XXX: It would be nice to able to avoid Python function call overhead, by
5074 using directly the C version of find_class(), when find_class() is not
5075 overridden by a subclass. Although, this could become rather hackish. A
5076 simpler optimization would be to call the C function when self is not a
5077 subclass instance. */
5078static PyObject *
5079find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
5080{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005081 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005082
Victor Stinner55ba38a2016-12-09 16:09:30 +01005083 return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_find_class,
5084 module_name, global_name, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005085}
5086
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005087static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005088marker(UnpicklerObject *self)
5089{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005090 Py_ssize_t mark;
5091
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005092 if (self->num_marks < 1) {
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005093 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005094 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005095 return -1;
5096 }
5097
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005098 mark = self->marks[--self->num_marks];
5099 self->stack->mark_set = self->num_marks != 0;
5100 self->stack->fence = self->num_marks ?
5101 self->marks[self->num_marks - 1] : 0;
5102 return mark;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005103}
5104
5105static int
5106load_none(UnpicklerObject *self)
5107{
5108 PDATA_APPEND(self->stack, Py_None, -1);
5109 return 0;
5110}
5111
5112static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005113load_int(UnpicklerObject *self)
5114{
5115 PyObject *value;
5116 char *endptr, *s;
5117 Py_ssize_t len;
5118 long x;
5119
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005120 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005121 return -1;
5122 if (len < 2)
5123 return bad_readline();
5124
5125 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005126 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005127 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005128 x = strtol(s, &endptr, 0);
5129
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005130 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005131 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03005132 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005133 errno = 0;
5134 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005135 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005136 if (value == NULL) {
5137 PyErr_SetString(PyExc_ValueError,
5138 "could not convert string to int");
5139 return -1;
5140 }
5141 }
5142 else {
5143 if (len == 3 && (x == 0 || x == 1)) {
5144 if ((value = PyBool_FromLong(x)) == NULL)
5145 return -1;
5146 }
5147 else {
5148 if ((value = PyLong_FromLong(x)) == NULL)
5149 return -1;
5150 }
5151 }
5152
5153 PDATA_PUSH(self->stack, value, -1);
5154 return 0;
5155}
5156
5157static int
5158load_bool(UnpicklerObject *self, PyObject *boolean)
5159{
5160 assert(boolean == Py_True || boolean == Py_False);
5161 PDATA_APPEND(self->stack, boolean, -1);
5162 return 0;
5163}
5164
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005165/* s contains x bytes of an unsigned little-endian integer. Return its value
5166 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
5167 */
5168static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005169calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005170{
5171 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005172 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005173 size_t x = 0;
5174
Serhiy Storchakae0606192015-09-29 22:10:07 +03005175 if (nbytes > (int)sizeof(size_t)) {
5176 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
5177 * have 64-bit size that can't be represented on 32-bit platform.
5178 */
5179 for (i = (int)sizeof(size_t); i < nbytes; i++) {
5180 if (s[i])
5181 return -1;
5182 }
5183 nbytes = (int)sizeof(size_t);
5184 }
5185 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005186 x |= (size_t) s[i] << (8 * i);
5187 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005188
5189 if (x > PY_SSIZE_T_MAX)
5190 return -1;
5191 else
5192 return (Py_ssize_t) x;
5193}
5194
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005195/* s contains x bytes of a little-endian integer. Return its value as a
5196 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03005197 * int, but when x is 4 it's a signed one. This is a historical source
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005198 * of x-platform bugs.
5199 */
5200static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005201calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005202{
5203 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02005204 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005205 long x = 0;
5206
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005207 for (i = 0; i < nbytes; i++) {
5208 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005209 }
5210
5211 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
5212 * is signed, so on a box with longs bigger than 4 bytes we need
5213 * to extend a BININT's sign bit to the full width.
5214 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005215 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005216 x |= -(x & (1L << 31));
5217 }
5218
5219 return x;
5220}
5221
5222static int
5223load_binintx(UnpicklerObject *self, char *s, int size)
5224{
5225 PyObject *value;
5226 long x;
5227
5228 x = calc_binint(s, size);
5229
5230 if ((value = PyLong_FromLong(x)) == NULL)
5231 return -1;
5232
5233 PDATA_PUSH(self->stack, value, -1);
5234 return 0;
5235}
5236
5237static int
5238load_binint(UnpicklerObject *self)
5239{
5240 char *s;
5241
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005242 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005243 return -1;
5244
5245 return load_binintx(self, s, 4);
5246}
5247
5248static int
5249load_binint1(UnpicklerObject *self)
5250{
5251 char *s;
5252
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005253 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005254 return -1;
5255
5256 return load_binintx(self, s, 1);
5257}
5258
5259static int
5260load_binint2(UnpicklerObject *self)
5261{
5262 char *s;
5263
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005264 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005265 return -1;
5266
5267 return load_binintx(self, s, 2);
5268}
5269
5270static int
5271load_long(UnpicklerObject *self)
5272{
5273 PyObject *value;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005274 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005275 Py_ssize_t len;
5276
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005277 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005278 return -1;
5279 if (len < 2)
5280 return bad_readline();
5281
Mark Dickinson8dd05142009-01-20 20:43:58 +00005282 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
5283 the 'L' before calling PyLong_FromString. In order to maintain
5284 compatibility with Python 3.0.0, we don't actually *require*
5285 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005286 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00005287 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00005288 /* XXX: Should the base argument explicitly set to 10? */
5289 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00005290 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005291 return -1;
5292
5293 PDATA_PUSH(self->stack, value, -1);
5294 return 0;
5295}
5296
5297/* 'size' bytes contain the # of bytes of little-endian 256's-complement
5298 * data following.
5299 */
5300static int
5301load_counted_long(UnpicklerObject *self, int size)
5302{
5303 PyObject *value;
5304 char *nbytes;
5305 char *pdata;
5306
5307 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005308 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005309 return -1;
5310
5311 size = calc_binint(nbytes, size);
5312 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005313 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005314 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005315 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005316 "LONG pickle has negative byte count");
5317 return -1;
5318 }
5319
5320 if (size == 0)
5321 value = PyLong_FromLong(0L);
5322 else {
5323 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005324 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005325 return -1;
5326 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
5327 1 /* little endian */ , 1 /* signed */ );
5328 }
5329 if (value == NULL)
5330 return -1;
5331 PDATA_PUSH(self->stack, value, -1);
5332 return 0;
5333}
5334
5335static int
5336load_float(UnpicklerObject *self)
5337{
5338 PyObject *value;
5339 char *endptr, *s;
5340 Py_ssize_t len;
5341 double d;
5342
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005343 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005344 return -1;
5345 if (len < 2)
5346 return bad_readline();
5347
5348 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00005349 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
5350 if (d == -1.0 && PyErr_Occurred())
5351 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005352 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005353 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
5354 return -1;
5355 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00005356 value = PyFloat_FromDouble(d);
5357 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005358 return -1;
5359
5360 PDATA_PUSH(self->stack, value, -1);
5361 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005362}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005363
5364static int
5365load_binfloat(UnpicklerObject *self)
5366{
5367 PyObject *value;
5368 double x;
5369 char *s;
5370
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005371 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005372 return -1;
5373
5374 x = _PyFloat_Unpack8((unsigned char *)s, 0);
5375 if (x == -1.0 && PyErr_Occurred())
5376 return -1;
5377
5378 if ((value = PyFloat_FromDouble(x)) == NULL)
5379 return -1;
5380
5381 PDATA_PUSH(self->stack, value, -1);
5382 return 0;
5383}
5384
5385static int
5386load_string(UnpicklerObject *self)
5387{
5388 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005389 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005390 Py_ssize_t len;
5391 char *s, *p;
5392
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005393 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005394 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005395 /* Strip the newline */
5396 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005397 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005398 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005399 p = s + 1;
5400 len -= 2;
5401 }
5402 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005403 PickleState *st = _Pickle_GetGlobalState();
5404 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005405 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005406 return -1;
5407 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005408 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005409
5410 /* Use the PyBytes API to decode the string, since that is what is used
5411 to encode, and then coerce the result to Unicode. */
5412 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005413 if (bytes == NULL)
5414 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005415
5416 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
5417 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5418 if (strcmp(self->encoding, "bytes") == 0) {
5419 obj = bytes;
5420 }
5421 else {
5422 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
5423 Py_DECREF(bytes);
5424 if (obj == NULL) {
5425 return -1;
5426 }
5427 }
5428
5429 PDATA_PUSH(self->stack, obj, -1);
5430 return 0;
5431}
5432
5433static int
5434load_counted_binstring(UnpicklerObject *self, int nbytes)
5435{
5436 PyObject *obj;
5437 Py_ssize_t size;
5438 char *s;
5439
5440 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005441 return -1;
5442
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005443 size = calc_binsize(s, nbytes);
5444 if (size < 0) {
5445 PickleState *st = _Pickle_GetGlobalState();
5446 PyErr_Format(st->UnpicklingError,
5447 "BINSTRING exceeds system's maximum size of %zd bytes",
5448 PY_SSIZE_T_MAX);
5449 return -1;
5450 }
5451
5452 if (_Unpickler_Read(self, &s, size) < 0)
5453 return -1;
5454
5455 /* Convert Python 2.x strings to bytes if the *encoding* given to the
5456 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5457 if (strcmp(self->encoding, "bytes") == 0) {
5458 obj = PyBytes_FromStringAndSize(s, size);
5459 }
5460 else {
5461 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
5462 }
5463 if (obj == NULL) {
5464 return -1;
5465 }
5466
5467 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005468 return 0;
5469}
5470
5471static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005472load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005473{
5474 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005475 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005476 char *s;
5477
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005478 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005479 return -1;
5480
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005481 size = calc_binsize(s, nbytes);
5482 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005483 PyErr_Format(PyExc_OverflowError,
5484 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005485 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005486 return -1;
5487 }
5488
Antoine Pitrou91f43802019-05-26 17:10:09 +02005489 bytes = PyBytes_FromStringAndSize(NULL, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005490 if (bytes == NULL)
5491 return -1;
Antoine Pitrou91f43802019-05-26 17:10:09 +02005492 if (_Unpickler_ReadInto(self, PyBytes_AS_STRING(bytes), size) < 0) {
5493 Py_DECREF(bytes);
5494 return -1;
5495 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005496
5497 PDATA_PUSH(self->stack, bytes, -1);
5498 return 0;
5499}
5500
5501static int
Antoine Pitrou91f43802019-05-26 17:10:09 +02005502load_counted_bytearray(UnpicklerObject *self)
5503{
5504 PyObject *bytearray;
5505 Py_ssize_t size;
5506 char *s;
5507
5508 if (_Unpickler_Read(self, &s, 8) < 0) {
5509 return -1;
5510 }
5511
5512 size = calc_binsize(s, 8);
5513 if (size < 0) {
5514 PyErr_Format(PyExc_OverflowError,
5515 "BYTEARRAY8 exceeds system's maximum size of %zd bytes",
5516 PY_SSIZE_T_MAX);
5517 return -1;
5518 }
5519
5520 bytearray = PyByteArray_FromStringAndSize(NULL, size);
5521 if (bytearray == NULL) {
5522 return -1;
5523 }
5524 if (_Unpickler_ReadInto(self, PyByteArray_AS_STRING(bytearray), size) < 0) {
5525 Py_DECREF(bytearray);
5526 return -1;
5527 }
5528
5529 PDATA_PUSH(self->stack, bytearray, -1);
5530 return 0;
5531}
5532
5533static int
5534load_next_buffer(UnpicklerObject *self)
5535{
5536 if (self->buffers == NULL) {
5537 PickleState *st = _Pickle_GetGlobalState();
5538 PyErr_SetString(st->UnpicklingError,
5539 "pickle stream refers to out-of-band data "
5540 "but no *buffers* argument was given");
5541 return -1;
5542 }
5543 PyObject *buf = PyIter_Next(self->buffers);
5544 if (buf == NULL) {
5545 if (!PyErr_Occurred()) {
5546 PickleState *st = _Pickle_GetGlobalState();
5547 PyErr_SetString(st->UnpicklingError,
5548 "not enough out-of-band buffers");
5549 }
5550 return -1;
5551 }
5552
5553 PDATA_PUSH(self->stack, buf, -1);
5554 return 0;
5555}
5556
5557static int
5558load_readonly_buffer(UnpicklerObject *self)
5559{
5560 Py_ssize_t len = Py_SIZE(self->stack);
5561 if (len <= self->stack->fence) {
5562 return Pdata_stack_underflow(self->stack);
5563 }
5564
5565 PyObject *obj = self->stack->data[len - 1];
5566 PyObject *view = PyMemoryView_FromObject(obj);
5567 if (view == NULL) {
5568 return -1;
5569 }
5570 if (!PyMemoryView_GET_BUFFER(view)->readonly) {
5571 /* Original object is writable */
5572 PyMemoryView_GET_BUFFER(view)->readonly = 1;
5573 self->stack->data[len - 1] = view;
5574 Py_DECREF(obj);
5575 }
5576 else {
5577 /* Original object is read-only, no need to replace it */
5578 Py_DECREF(view);
5579 }
5580 return 0;
5581}
5582
5583static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005584load_unicode(UnpicklerObject *self)
5585{
5586 PyObject *str;
5587 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005588 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005589
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005590 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005591 return -1;
5592 if (len < 1)
5593 return bad_readline();
5594
5595 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
5596 if (str == NULL)
5597 return -1;
5598
5599 PDATA_PUSH(self->stack, str, -1);
5600 return 0;
5601}
5602
5603static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005604load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005605{
5606 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005607 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005608 char *s;
5609
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005610 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005611 return -1;
5612
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005613 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005614 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005615 PyErr_Format(PyExc_OverflowError,
5616 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005617 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005618 return -1;
5619 }
5620
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005621 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005622 return -1;
5623
Victor Stinner485fb562010-04-13 11:07:24 +00005624 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005625 if (str == NULL)
5626 return -1;
5627
5628 PDATA_PUSH(self->stack, str, -1);
5629 return 0;
5630}
5631
5632static int
Victor Stinner21b47112016-03-14 18:09:39 +01005633load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005634{
5635 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005636
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005637 if (Py_SIZE(self->stack) < len)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005638 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005639
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005640 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005641 if (tuple == NULL)
5642 return -1;
5643 PDATA_PUSH(self->stack, tuple, -1);
5644 return 0;
5645}
5646
5647static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005648load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005649{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005650 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005651
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005652 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005653 return -1;
5654
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005655 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005656}
5657
5658static int
5659load_empty_list(UnpicklerObject *self)
5660{
5661 PyObject *list;
5662
5663 if ((list = PyList_New(0)) == NULL)
5664 return -1;
5665 PDATA_PUSH(self->stack, list, -1);
5666 return 0;
5667}
5668
5669static int
5670load_empty_dict(UnpicklerObject *self)
5671{
5672 PyObject *dict;
5673
5674 if ((dict = PyDict_New()) == NULL)
5675 return -1;
5676 PDATA_PUSH(self->stack, dict, -1);
5677 return 0;
5678}
5679
5680static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005681load_empty_set(UnpicklerObject *self)
5682{
5683 PyObject *set;
5684
5685 if ((set = PySet_New(NULL)) == NULL)
5686 return -1;
5687 PDATA_PUSH(self->stack, set, -1);
5688 return 0;
5689}
5690
5691static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005692load_list(UnpicklerObject *self)
5693{
5694 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005695 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005696
5697 if ((i = marker(self)) < 0)
5698 return -1;
5699
5700 list = Pdata_poplist(self->stack, i);
5701 if (list == NULL)
5702 return -1;
5703 PDATA_PUSH(self->stack, list, -1);
5704 return 0;
5705}
5706
5707static int
5708load_dict(UnpicklerObject *self)
5709{
5710 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005711 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005712
5713 if ((i = marker(self)) < 0)
5714 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005715 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005716
5717 if ((dict = PyDict_New()) == NULL)
5718 return -1;
5719
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005720 if ((j - i) % 2 != 0) {
5721 PickleState *st = _Pickle_GetGlobalState();
5722 PyErr_SetString(st->UnpicklingError, "odd number of items for DICT");
Serhiy Storchaka3ac53802015-12-07 11:32:00 +02005723 Py_DECREF(dict);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005724 return -1;
5725 }
5726
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005727 for (k = i + 1; k < j; k += 2) {
5728 key = self->stack->data[k - 1];
5729 value = self->stack->data[k];
5730 if (PyDict_SetItem(dict, key, value) < 0) {
5731 Py_DECREF(dict);
5732 return -1;
5733 }
5734 }
5735 Pdata_clear(self->stack, i);
5736 PDATA_PUSH(self->stack, dict, -1);
5737 return 0;
5738}
5739
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005740static int
5741load_frozenset(UnpicklerObject *self)
5742{
5743 PyObject *items;
5744 PyObject *frozenset;
5745 Py_ssize_t i;
5746
5747 if ((i = marker(self)) < 0)
5748 return -1;
5749
5750 items = Pdata_poptuple(self->stack, i);
5751 if (items == NULL)
5752 return -1;
5753
5754 frozenset = PyFrozenSet_New(items);
5755 Py_DECREF(items);
5756 if (frozenset == NULL)
5757 return -1;
5758
5759 PDATA_PUSH(self->stack, frozenset, -1);
5760 return 0;
5761}
5762
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005763static PyObject *
5764instantiate(PyObject *cls, PyObject *args)
5765{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005766 /* Caller must assure args are a tuple. Normally, args come from
5767 Pdata_poptuple which packs objects from the top of the stack
5768 into a newly created tuple. */
5769 assert(PyTuple_Check(args));
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005770 if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
5771 _Py_IDENTIFIER(__getinitargs__);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005772 _Py_IDENTIFIER(__new__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005773 PyObject *func;
5774 if (_PyObject_LookupAttrId(cls, &PyId___getinitargs__, &func) < 0) {
5775 return NULL;
5776 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005777 if (func == NULL) {
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005778 return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
5779 }
5780 Py_DECREF(func);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005781 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005782 return PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005783}
5784
5785static int
5786load_obj(UnpicklerObject *self)
5787{
5788 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005789 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005790
5791 if ((i = marker(self)) < 0)
5792 return -1;
5793
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005794 if (Py_SIZE(self->stack) - i < 1)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005795 return Pdata_stack_underflow(self->stack);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005796
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005797 args = Pdata_poptuple(self->stack, i + 1);
5798 if (args == NULL)
5799 return -1;
5800
5801 PDATA_POP(self->stack, cls);
5802 if (cls) {
5803 obj = instantiate(cls, args);
5804 Py_DECREF(cls);
5805 }
5806 Py_DECREF(args);
5807 if (obj == NULL)
5808 return -1;
5809
5810 PDATA_PUSH(self->stack, obj, -1);
5811 return 0;
5812}
5813
5814static int
5815load_inst(UnpicklerObject *self)
5816{
5817 PyObject *cls = NULL;
5818 PyObject *args = NULL;
5819 PyObject *obj = NULL;
5820 PyObject *module_name;
5821 PyObject *class_name;
5822 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005823 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005824 char *s;
5825
5826 if ((i = marker(self)) < 0)
5827 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005828 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005829 return -1;
5830 if (len < 2)
5831 return bad_readline();
5832
5833 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5834 identifiers are permitted in Python 3.0, since the INST opcode is only
5835 supported by older protocols on Python 2.x. */
5836 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5837 if (module_name == NULL)
5838 return -1;
5839
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005840 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005841 if (len < 2) {
5842 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005843 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005844 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005845 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005846 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005847 cls = find_class(self, module_name, class_name);
5848 Py_DECREF(class_name);
5849 }
5850 }
5851 Py_DECREF(module_name);
5852
5853 if (cls == NULL)
5854 return -1;
5855
5856 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5857 obj = instantiate(cls, args);
5858 Py_DECREF(args);
5859 }
5860 Py_DECREF(cls);
5861
5862 if (obj == NULL)
5863 return -1;
5864
5865 PDATA_PUSH(self->stack, obj, -1);
5866 return 0;
5867}
5868
5869static int
5870load_newobj(UnpicklerObject *self)
5871{
5872 PyObject *args = NULL;
5873 PyObject *clsraw = NULL;
5874 PyTypeObject *cls; /* clsraw cast to its true type */
5875 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005876 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005877
5878 /* Stack is ... cls argtuple, and we want to call
5879 * cls.__new__(cls, *argtuple).
5880 */
5881 PDATA_POP(self->stack, args);
5882 if (args == NULL)
5883 goto error;
5884 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005885 PyErr_SetString(st->UnpicklingError,
5886 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005887 goto error;
5888 }
5889
5890 PDATA_POP(self->stack, clsraw);
5891 cls = (PyTypeObject *)clsraw;
5892 if (cls == NULL)
5893 goto error;
5894 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005895 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005896 "isn't a type object");
5897 goto error;
5898 }
5899 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005900 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005901 "has NULL tp_new");
5902 goto error;
5903 }
5904
5905 /* Call __new__. */
5906 obj = cls->tp_new(cls, args, NULL);
5907 if (obj == NULL)
5908 goto error;
5909
5910 Py_DECREF(args);
5911 Py_DECREF(clsraw);
5912 PDATA_PUSH(self->stack, obj, -1);
5913 return 0;
5914
5915 error:
5916 Py_XDECREF(args);
5917 Py_XDECREF(clsraw);
5918 return -1;
5919}
5920
5921static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005922load_newobj_ex(UnpicklerObject *self)
5923{
5924 PyObject *cls, *args, *kwargs;
5925 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005926 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005927
5928 PDATA_POP(self->stack, kwargs);
5929 if (kwargs == NULL) {
5930 return -1;
5931 }
5932 PDATA_POP(self->stack, args);
5933 if (args == NULL) {
5934 Py_DECREF(kwargs);
5935 return -1;
5936 }
5937 PDATA_POP(self->stack, cls);
5938 if (cls == NULL) {
5939 Py_DECREF(kwargs);
5940 Py_DECREF(args);
5941 return -1;
5942 }
Larry Hastings61272b72014-01-07 12:41:53 -08005943
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005944 if (!PyType_Check(cls)) {
5945 Py_DECREF(kwargs);
5946 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005947 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005948 "NEWOBJ_EX class argument must be a type, not %.200s",
5949 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005950 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005951 return -1;
5952 }
5953
5954 if (((PyTypeObject *)cls)->tp_new == NULL) {
5955 Py_DECREF(kwargs);
5956 Py_DECREF(args);
5957 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005958 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005959 "NEWOBJ_EX class argument doesn't have __new__");
5960 return -1;
5961 }
5962 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5963 Py_DECREF(kwargs);
5964 Py_DECREF(args);
5965 Py_DECREF(cls);
5966 if (obj == NULL) {
5967 return -1;
5968 }
5969 PDATA_PUSH(self->stack, obj, -1);
5970 return 0;
5971}
5972
5973static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005974load_global(UnpicklerObject *self)
5975{
5976 PyObject *global = NULL;
5977 PyObject *module_name;
5978 PyObject *global_name;
5979 Py_ssize_t len;
5980 char *s;
5981
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005982 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005983 return -1;
5984 if (len < 2)
5985 return bad_readline();
5986 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5987 if (!module_name)
5988 return -1;
5989
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005990 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005991 if (len < 2) {
5992 Py_DECREF(module_name);
5993 return bad_readline();
5994 }
5995 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5996 if (global_name) {
5997 global = find_class(self, module_name, global_name);
5998 Py_DECREF(global_name);
5999 }
6000 }
6001 Py_DECREF(module_name);
6002
6003 if (global == NULL)
6004 return -1;
6005 PDATA_PUSH(self->stack, global, -1);
6006 return 0;
6007}
6008
6009static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006010load_stack_global(UnpicklerObject *self)
6011{
6012 PyObject *global;
6013 PyObject *module_name;
6014 PyObject *global_name;
6015
6016 PDATA_POP(self->stack, global_name);
6017 PDATA_POP(self->stack, module_name);
6018 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
6019 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006020 PickleState *st = _Pickle_GetGlobalState();
6021 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006022 Py_XDECREF(global_name);
6023 Py_XDECREF(module_name);
6024 return -1;
6025 }
6026 global = find_class(self, module_name, global_name);
6027 Py_DECREF(global_name);
6028 Py_DECREF(module_name);
6029 if (global == NULL)
6030 return -1;
6031 PDATA_PUSH(self->stack, global, -1);
6032 return 0;
6033}
6034
6035static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006036load_persid(UnpicklerObject *self)
6037{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006038 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006039 Py_ssize_t len;
6040 char *s;
6041
6042 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006043 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006044 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08006045 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006046 return bad_readline();
6047
Serhiy Storchakadec25af2016-07-17 11:24:17 +03006048 pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
6049 if (pid == NULL) {
6050 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
6051 PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
6052 "persistent IDs in protocol 0 must be "
6053 "ASCII strings");
6054 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006055 return -1;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03006056 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006057
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006058 obj = call_method(self->pers_func, self->pers_func_self, pid);
6059 Py_DECREF(pid);
6060 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006061 return -1;
6062
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006063 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006064 return 0;
6065 }
6066 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006067 PickleState *st = _Pickle_GetGlobalState();
6068 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006069 "A load persistent id instruction was encountered,\n"
6070 "but no persistent_load function was specified.");
6071 return -1;
6072 }
6073}
6074
6075static int
6076load_binpersid(UnpicklerObject *self)
6077{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006078 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006079
6080 if (self->pers_func) {
6081 PDATA_POP(self->stack, pid);
6082 if (pid == NULL)
6083 return -1;
6084
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006085 obj = call_method(self->pers_func, self->pers_func_self, pid);
6086 Py_DECREF(pid);
6087 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006088 return -1;
6089
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006090 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006091 return 0;
6092 }
6093 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006094 PickleState *st = _Pickle_GetGlobalState();
6095 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006096 "A load persistent id instruction was encountered,\n"
6097 "but no persistent_load function was specified.");
6098 return -1;
6099 }
6100}
6101
6102static int
6103load_pop(UnpicklerObject *self)
6104{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006105 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006106
6107 /* Note that we split the (pickle.py) stack into two stacks,
6108 * an object stack and a mark stack. We have to be clever and
6109 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00006110 * mark stack first, and only signalling a stack underflow if
6111 * the object stack is empty and the mark stack doesn't match
6112 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006113 */
Collin Winter8ca69de2009-05-26 16:53:41 +00006114 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006115 self->num_marks--;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006116 self->stack->mark_set = self->num_marks != 0;
6117 self->stack->fence = self->num_marks ?
6118 self->marks[self->num_marks - 1] : 0;
6119 } else if (len <= self->stack->fence)
6120 return Pdata_stack_underflow(self->stack);
6121 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006122 len--;
6123 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006124 Py_SIZE(self->stack) = len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006125 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006126 return 0;
6127}
6128
6129static int
6130load_pop_mark(UnpicklerObject *self)
6131{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006132 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006133
6134 if ((i = marker(self)) < 0)
6135 return -1;
6136
6137 Pdata_clear(self->stack, i);
6138
6139 return 0;
6140}
6141
6142static int
6143load_dup(UnpicklerObject *self)
6144{
6145 PyObject *last;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006146 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006147
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006148 if (len <= self->stack->fence)
6149 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006150 last = self->stack->data[len - 1];
6151 PDATA_APPEND(self->stack, last, -1);
6152 return 0;
6153}
6154
6155static int
6156load_get(UnpicklerObject *self)
6157{
6158 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006159 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006160 Py_ssize_t len;
6161 char *s;
6162
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006163 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006164 return -1;
6165 if (len < 2)
6166 return bad_readline();
6167
6168 key = PyLong_FromString(s, NULL, 10);
6169 if (key == NULL)
6170 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006171 idx = PyLong_AsSsize_t(key);
6172 if (idx == -1 && PyErr_Occurred()) {
6173 Py_DECREF(key);
6174 return -1;
6175 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006176
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006177 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006178 if (value == NULL) {
6179 if (!PyErr_Occurred())
6180 PyErr_SetObject(PyExc_KeyError, key);
6181 Py_DECREF(key);
6182 return -1;
6183 }
6184 Py_DECREF(key);
6185
6186 PDATA_APPEND(self->stack, value, -1);
6187 return 0;
6188}
6189
6190static int
6191load_binget(UnpicklerObject *self)
6192{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006193 PyObject *value;
6194 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006195 char *s;
6196
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006197 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006198 return -1;
6199
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006200 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006201
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006202 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006203 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006204 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006205 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006206 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006207 Py_DECREF(key);
6208 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006209 return -1;
6210 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006211
6212 PDATA_APPEND(self->stack, value, -1);
6213 return 0;
6214}
6215
6216static int
6217load_long_binget(UnpicklerObject *self)
6218{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006219 PyObject *value;
6220 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006221 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006222
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006223 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006224 return -1;
6225
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006226 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006227
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006228 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006229 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006230 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006231 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006232 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006233 Py_DECREF(key);
6234 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006235 return -1;
6236 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006237
6238 PDATA_APPEND(self->stack, value, -1);
6239 return 0;
6240}
6241
6242/* Push an object from the extension registry (EXT[124]). nbytes is
6243 * the number of bytes following the opcode, holding the index (code) value.
6244 */
6245static int
6246load_extension(UnpicklerObject *self, int nbytes)
6247{
6248 char *codebytes; /* the nbytes bytes after the opcode */
6249 long code; /* calc_binint returns long */
6250 PyObject *py_code; /* code as a Python int */
6251 PyObject *obj; /* the object to push */
6252 PyObject *pair; /* (module_name, class_name) */
6253 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006254 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006255
6256 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006257 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006258 return -1;
6259 code = calc_binint(codebytes, nbytes);
6260 if (code <= 0) { /* note that 0 is forbidden */
6261 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006262 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006263 return -1;
6264 }
6265
6266 /* Look for the code in the cache. */
6267 py_code = PyLong_FromLong(code);
6268 if (py_code == NULL)
6269 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006270 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006271 if (obj != NULL) {
6272 /* Bingo. */
6273 Py_DECREF(py_code);
6274 PDATA_APPEND(self->stack, obj, -1);
6275 return 0;
6276 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006277 if (PyErr_Occurred()) {
6278 Py_DECREF(py_code);
6279 return -1;
6280 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006281
6282 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006283 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006284 if (pair == NULL) {
6285 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006286 if (!PyErr_Occurred()) {
6287 PyErr_Format(PyExc_ValueError, "unregistered extension "
6288 "code %ld", code);
6289 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006290 return -1;
6291 }
6292 /* Since the extension registry is manipulable via Python code,
6293 * confirm that pair is really a 2-tuple of strings.
6294 */
Victor Stinnerb37672d2018-11-22 03:37:50 +01006295 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2) {
6296 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006297 }
Victor Stinnerb37672d2018-11-22 03:37:50 +01006298
6299 module_name = PyTuple_GET_ITEM(pair, 0);
6300 if (!PyUnicode_Check(module_name)) {
6301 goto error;
6302 }
6303
6304 class_name = PyTuple_GET_ITEM(pair, 1);
6305 if (!PyUnicode_Check(class_name)) {
6306 goto error;
6307 }
6308
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006309 /* Load the object. */
6310 obj = find_class(self, module_name, class_name);
6311 if (obj == NULL) {
6312 Py_DECREF(py_code);
6313 return -1;
6314 }
6315 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006316 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006317 Py_DECREF(py_code);
6318 if (code < 0) {
6319 Py_DECREF(obj);
6320 return -1;
6321 }
6322 PDATA_PUSH(self->stack, obj, -1);
6323 return 0;
Victor Stinnerb37672d2018-11-22 03:37:50 +01006324
6325error:
6326 Py_DECREF(py_code);
6327 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
6328 "isn't a 2-tuple of strings", code);
6329 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006330}
6331
6332static int
6333load_put(UnpicklerObject *self)
6334{
6335 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006336 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006337 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01006338 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006339
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006340 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006341 return -1;
6342 if (len < 2)
6343 return bad_readline();
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006344 if (Py_SIZE(self->stack) <= self->stack->fence)
6345 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006346 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006347
6348 key = PyLong_FromString(s, NULL, 10);
6349 if (key == NULL)
6350 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006351 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006352 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006353 if (idx < 0) {
6354 if (!PyErr_Occurred())
6355 PyErr_SetString(PyExc_ValueError,
6356 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006357 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006358 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006359
6360 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006361}
6362
6363static int
6364load_binput(UnpicklerObject *self)
6365{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006366 PyObject *value;
6367 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006368 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006369
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006370 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006371 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006372
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006373 if (Py_SIZE(self->stack) <= self->stack->fence)
6374 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006375 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006376
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006377 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006378
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006379 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006380}
6381
6382static int
6383load_long_binput(UnpicklerObject *self)
6384{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006385 PyObject *value;
6386 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006387 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006388
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006389 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006390 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006391
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006392 if (Py_SIZE(self->stack) <= self->stack->fence)
6393 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006394 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006395
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006396 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006397 if (idx < 0) {
6398 PyErr_SetString(PyExc_ValueError,
6399 "negative LONG_BINPUT argument");
6400 return -1;
6401 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006402
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006403 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006404}
6405
6406static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006407load_memoize(UnpicklerObject *self)
6408{
6409 PyObject *value;
6410
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006411 if (Py_SIZE(self->stack) <= self->stack->fence)
6412 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006413 value = self->stack->data[Py_SIZE(self->stack) - 1];
6414
6415 return _Unpickler_MemoPut(self, self->memo_len, value);
6416}
6417
6418static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006419do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006420{
6421 PyObject *value;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006422 PyObject *slice;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006423 PyObject *list;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006424 PyObject *result;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006425 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006426
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006427 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006428 if (x > len || x <= self->stack->fence)
6429 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006430 if (len == x) /* nothing to do */
6431 return 0;
6432
6433 list = self->stack->data[x - 1];
6434
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006435 if (PyList_CheckExact(list)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006436 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006437 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006438
6439 slice = Pdata_poplist(self->stack, x);
6440 if (!slice)
6441 return -1;
6442 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006443 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006444 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006445 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006446 }
6447 else {
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006448 PyObject *extend_func;
6449 _Py_IDENTIFIER(extend);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006450
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006451 extend_func = _PyObject_GetAttrId(list, &PyId_extend);
6452 if (extend_func != NULL) {
6453 slice = Pdata_poplist(self->stack, x);
6454 if (!slice) {
6455 Py_DECREF(extend_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006456 return -1;
6457 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006458 result = _Pickle_FastCall(extend_func, slice);
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006459 Py_DECREF(extend_func);
6460 if (result == NULL)
6461 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006462 Py_DECREF(result);
6463 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006464 else {
6465 PyObject *append_func;
6466 _Py_IDENTIFIER(append);
6467
6468 /* Even if the PEP 307 requires extend() and append() methods,
6469 fall back on append() if the object has no extend() method
6470 for backward compatibility. */
6471 PyErr_Clear();
6472 append_func = _PyObject_GetAttrId(list, &PyId_append);
6473 if (append_func == NULL)
6474 return -1;
6475 for (i = x; i < len; i++) {
6476 value = self->stack->data[i];
6477 result = _Pickle_FastCall(append_func, value);
6478 if (result == NULL) {
6479 Pdata_clear(self->stack, i + 1);
6480 Py_SIZE(self->stack) = x;
6481 Py_DECREF(append_func);
6482 return -1;
6483 }
6484 Py_DECREF(result);
6485 }
6486 Py_SIZE(self->stack) = x;
6487 Py_DECREF(append_func);
6488 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006489 }
6490
6491 return 0;
6492}
6493
6494static int
6495load_append(UnpicklerObject *self)
6496{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006497 if (Py_SIZE(self->stack) - 1 <= self->stack->fence)
6498 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006499 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006500}
6501
6502static int
6503load_appends(UnpicklerObject *self)
6504{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006505 Py_ssize_t i = marker(self);
6506 if (i < 0)
6507 return -1;
6508 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006509}
6510
6511static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006512do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006513{
6514 PyObject *value, *key;
6515 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006516 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006517 int status = 0;
6518
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006519 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006520 if (x > len || x <= self->stack->fence)
6521 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006522 if (len == x) /* nothing to do */
6523 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02006524 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006525 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006526 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006527 PyErr_SetString(st->UnpicklingError,
6528 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006529 return -1;
6530 }
6531
6532 /* Here, dict does not actually need to be a PyDict; it could be anything
6533 that supports the __setitem__ attribute. */
6534 dict = self->stack->data[x - 1];
6535
6536 for (i = x + 1; i < len; i += 2) {
6537 key = self->stack->data[i - 1];
6538 value = self->stack->data[i];
6539 if (PyObject_SetItem(dict, key, value) < 0) {
6540 status = -1;
6541 break;
6542 }
6543 }
6544
6545 Pdata_clear(self->stack, x);
6546 return status;
6547}
6548
6549static int
6550load_setitem(UnpicklerObject *self)
6551{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006552 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006553}
6554
6555static int
6556load_setitems(UnpicklerObject *self)
6557{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006558 Py_ssize_t i = marker(self);
6559 if (i < 0)
6560 return -1;
6561 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006562}
6563
6564static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006565load_additems(UnpicklerObject *self)
6566{
6567 PyObject *set;
6568 Py_ssize_t mark, len, i;
6569
6570 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006571 if (mark < 0)
6572 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006573 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006574 if (mark > len || mark <= self->stack->fence)
6575 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006576 if (len == mark) /* nothing to do */
6577 return 0;
6578
6579 set = self->stack->data[mark - 1];
6580
6581 if (PySet_Check(set)) {
6582 PyObject *items;
6583 int status;
6584
6585 items = Pdata_poptuple(self->stack, mark);
6586 if (items == NULL)
6587 return -1;
6588
6589 status = _PySet_Update(set, items);
6590 Py_DECREF(items);
6591 return status;
6592 }
6593 else {
6594 PyObject *add_func;
6595 _Py_IDENTIFIER(add);
6596
6597 add_func = _PyObject_GetAttrId(set, &PyId_add);
6598 if (add_func == NULL)
6599 return -1;
6600 for (i = mark; i < len; i++) {
6601 PyObject *result;
6602 PyObject *item;
6603
6604 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006605 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006606 if (result == NULL) {
6607 Pdata_clear(self->stack, i + 1);
6608 Py_SIZE(self->stack) = mark;
6609 return -1;
6610 }
6611 Py_DECREF(result);
6612 }
6613 Py_SIZE(self->stack) = mark;
6614 }
6615
6616 return 0;
6617}
6618
6619static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006620load_build(UnpicklerObject *self)
6621{
6622 PyObject *state, *inst, *slotstate;
6623 PyObject *setstate;
6624 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006625 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006626
6627 /* Stack is ... instance, state. We want to leave instance at
6628 * the stack top, possibly mutated via instance.__setstate__(state).
6629 */
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006630 if (Py_SIZE(self->stack) - 2 < self->stack->fence)
6631 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006632
6633 PDATA_POP(self->stack, state);
6634 if (state == NULL)
6635 return -1;
6636
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006637 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006638
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006639 if (_PyObject_LookupAttrId(inst, &PyId___setstate__, &setstate) < 0) {
6640 Py_DECREF(state);
6641 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006642 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006643 if (setstate != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006644 PyObject *result;
6645
6646 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006647 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006648 Py_DECREF(setstate);
6649 if (result == NULL)
6650 return -1;
6651 Py_DECREF(result);
6652 return 0;
6653 }
6654
6655 /* A default __setstate__. First see whether state embeds a
6656 * slot state dict too (a proto 2 addition).
6657 */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02006658 if (PyTuple_Check(state) && PyTuple_GET_SIZE(state) == 2) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006659 PyObject *tmp = state;
6660
6661 state = PyTuple_GET_ITEM(tmp, 0);
6662 slotstate = PyTuple_GET_ITEM(tmp, 1);
6663 Py_INCREF(state);
6664 Py_INCREF(slotstate);
6665 Py_DECREF(tmp);
6666 }
6667 else
6668 slotstate = NULL;
6669
6670 /* Set inst.__dict__ from the state dict (if any). */
6671 if (state != Py_None) {
6672 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006673 PyObject *d_key, *d_value;
6674 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006675 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006676
6677 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006678 PickleState *st = _Pickle_GetGlobalState();
6679 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006680 goto error;
6681 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006682 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006683 if (dict == NULL)
6684 goto error;
6685
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006686 i = 0;
6687 while (PyDict_Next(state, &i, &d_key, &d_value)) {
6688 /* normally the keys for instance attributes are
6689 interned. we should try to do that here. */
6690 Py_INCREF(d_key);
6691 if (PyUnicode_CheckExact(d_key))
6692 PyUnicode_InternInPlace(&d_key);
6693 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6694 Py_DECREF(d_key);
6695 goto error;
6696 }
6697 Py_DECREF(d_key);
6698 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006699 Py_DECREF(dict);
6700 }
6701
6702 /* Also set instance attributes from the slotstate dict (if any). */
6703 if (slotstate != NULL) {
6704 PyObject *d_key, *d_value;
6705 Py_ssize_t i;
6706
6707 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006708 PickleState *st = _Pickle_GetGlobalState();
6709 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006710 "slot state is not a dictionary");
6711 goto error;
6712 }
6713 i = 0;
6714 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6715 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6716 goto error;
6717 }
6718 }
6719
6720 if (0) {
6721 error:
6722 status = -1;
6723 }
6724
6725 Py_DECREF(state);
6726 Py_XDECREF(slotstate);
6727 return status;
6728}
6729
6730static int
6731load_mark(UnpicklerObject *self)
6732{
6733
6734 /* Note that we split the (pickle.py) stack into two stacks, an
6735 * object stack and a mark stack. Here we push a mark onto the
6736 * mark stack.
6737 */
6738
Sergey Fedoseev86b89912018-08-25 12:54:40 +05006739 if (self->num_marks >= self->marks_size) {
Sergey Fedoseev90555ec2018-08-25 15:41:58 +05006740 size_t alloc = ((size_t)self->num_marks << 1) + 20;
6741 Py_ssize_t *marks_new = self->marks;
6742 PyMem_RESIZE(marks_new, Py_ssize_t, alloc);
6743 if (marks_new == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006744 PyErr_NoMemory();
6745 return -1;
6746 }
Sergey Fedoseev90555ec2018-08-25 15:41:58 +05006747 self->marks = marks_new;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006748 self->marks_size = (Py_ssize_t)alloc;
6749 }
6750
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006751 self->stack->mark_set = 1;
6752 self->marks[self->num_marks++] = self->stack->fence = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006753
6754 return 0;
6755}
6756
6757static int
6758load_reduce(UnpicklerObject *self)
6759{
6760 PyObject *callable = NULL;
6761 PyObject *argtup = NULL;
6762 PyObject *obj = NULL;
6763
6764 PDATA_POP(self->stack, argtup);
6765 if (argtup == NULL)
6766 return -1;
6767 PDATA_POP(self->stack, callable);
6768 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006769 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006770 Py_DECREF(callable);
6771 }
6772 Py_DECREF(argtup);
6773
6774 if (obj == NULL)
6775 return -1;
6776
6777 PDATA_PUSH(self->stack, obj, -1);
6778 return 0;
6779}
6780
6781/* Just raises an error if we don't know the protocol specified. PROTO
6782 * is the first opcode for protocols >= 2.
6783 */
6784static int
6785load_proto(UnpicklerObject *self)
6786{
6787 char *s;
6788 int i;
6789
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006790 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006791 return -1;
6792
6793 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006794 if (i <= HIGHEST_PROTOCOL) {
6795 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006796 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006797 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006798
6799 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6800 return -1;
6801}
6802
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006803static int
6804load_frame(UnpicklerObject *self)
6805{
6806 char *s;
6807 Py_ssize_t frame_len;
6808
6809 if (_Unpickler_Read(self, &s, 8) < 0)
6810 return -1;
6811
6812 frame_len = calc_binsize(s, 8);
6813 if (frame_len < 0) {
6814 PyErr_Format(PyExc_OverflowError,
6815 "FRAME length exceeds system's maximum of %zd bytes",
6816 PY_SSIZE_T_MAX);
6817 return -1;
6818 }
6819
6820 if (_Unpickler_Read(self, &s, frame_len) < 0)
6821 return -1;
6822
6823 /* Rewind to start of frame */
6824 self->next_read_idx -= frame_len;
6825 return 0;
6826}
6827
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006828static PyObject *
6829load(UnpicklerObject *self)
6830{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006831 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006832 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006833
6834 self->num_marks = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006835 self->stack->mark_set = 0;
6836 self->stack->fence = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006837 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006838 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006839 Pdata_clear(self->stack, 0);
6840
6841 /* Convenient macros for the dispatch while-switch loop just below. */
6842#define OP(opcode, load_func) \
6843 case opcode: if (load_func(self) < 0) break; continue;
6844
6845#define OP_ARG(opcode, load_func, arg) \
6846 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6847
6848 while (1) {
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006849 if (_Unpickler_Read(self, &s, 1) < 0) {
6850 PickleState *st = _Pickle_GetGlobalState();
6851 if (PyErr_ExceptionMatches(st->UnpicklingError)) {
6852 PyErr_Format(PyExc_EOFError, "Ran out of input");
6853 }
6854 return NULL;
6855 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006856
6857 switch ((enum opcode)s[0]) {
6858 OP(NONE, load_none)
6859 OP(BININT, load_binint)
6860 OP(BININT1, load_binint1)
6861 OP(BININT2, load_binint2)
6862 OP(INT, load_int)
6863 OP(LONG, load_long)
6864 OP_ARG(LONG1, load_counted_long, 1)
6865 OP_ARG(LONG4, load_counted_long, 4)
6866 OP(FLOAT, load_float)
6867 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006868 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6869 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6870 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
Antoine Pitrou91f43802019-05-26 17:10:09 +02006871 OP(BYTEARRAY8, load_counted_bytearray)
6872 OP(NEXT_BUFFER, load_next_buffer)
6873 OP(READONLY_BUFFER, load_readonly_buffer)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006874 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6875 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006876 OP(STRING, load_string)
6877 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006878 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6879 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6880 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006881 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6882 OP_ARG(TUPLE1, load_counted_tuple, 1)
6883 OP_ARG(TUPLE2, load_counted_tuple, 2)
6884 OP_ARG(TUPLE3, load_counted_tuple, 3)
6885 OP(TUPLE, load_tuple)
6886 OP(EMPTY_LIST, load_empty_list)
6887 OP(LIST, load_list)
6888 OP(EMPTY_DICT, load_empty_dict)
6889 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006890 OP(EMPTY_SET, load_empty_set)
6891 OP(ADDITEMS, load_additems)
6892 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006893 OP(OBJ, load_obj)
6894 OP(INST, load_inst)
6895 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006896 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006897 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006898 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006899 OP(APPEND, load_append)
6900 OP(APPENDS, load_appends)
6901 OP(BUILD, load_build)
6902 OP(DUP, load_dup)
6903 OP(BINGET, load_binget)
6904 OP(LONG_BINGET, load_long_binget)
6905 OP(GET, load_get)
6906 OP(MARK, load_mark)
6907 OP(BINPUT, load_binput)
6908 OP(LONG_BINPUT, load_long_binput)
6909 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006910 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006911 OP(POP, load_pop)
6912 OP(POP_MARK, load_pop_mark)
6913 OP(SETITEM, load_setitem)
6914 OP(SETITEMS, load_setitems)
6915 OP(PERSID, load_persid)
6916 OP(BINPERSID, load_binpersid)
6917 OP(REDUCE, load_reduce)
6918 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006919 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006920 OP_ARG(EXT1, load_extension, 1)
6921 OP_ARG(EXT2, load_extension, 2)
6922 OP_ARG(EXT4, load_extension, 4)
6923 OP_ARG(NEWTRUE, load_bool, Py_True)
6924 OP_ARG(NEWFALSE, load_bool, Py_False)
6925
6926 case STOP:
6927 break;
6928
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006929 default:
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006930 {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006931 PickleState *st = _Pickle_GetGlobalState();
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006932 unsigned char c = (unsigned char) *s;
6933 if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') {
6934 PyErr_Format(st->UnpicklingError,
6935 "invalid load key, '%c'.", c);
6936 }
6937 else {
6938 PyErr_Format(st->UnpicklingError,
6939 "invalid load key, '\\x%02x'.", c);
6940 }
6941 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006942 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006943 }
6944
6945 break; /* and we are done! */
6946 }
6947
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006948 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006949 return NULL;
6950 }
6951
Victor Stinner2ae57e32013-10-31 13:39:23 +01006952 if (_Unpickler_SkipConsumed(self) < 0)
6953 return NULL;
6954
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006955 PDATA_POP(self->stack, value);
6956 return value;
6957}
6958
Larry Hastings61272b72014-01-07 12:41:53 -08006959/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006960
6961_pickle.Unpickler.load
6962
6963Load a pickle.
6964
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006965Read a pickled object representation from the open file object given
6966in the constructor, and return the reconstituted object hierarchy
6967specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006968[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006969
Larry Hastings3cceb382014-01-04 11:09:09 -08006970static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006971_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006972/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006973{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006974 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006975
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006976 /* Check whether the Unpickler was initialized correctly. This prevents
6977 segfaulting if a subclass overridden __init__ with a function that does
6978 not call Unpickler.__init__(). Here, we simply ensure that self->read
6979 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006980 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006981 PickleState *st = _Pickle_GetGlobalState();
6982 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006983 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006984 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006985 return NULL;
6986 }
6987
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006988 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006989}
6990
6991/* The name of find_class() is misleading. In newer pickle protocols, this
6992 function is used for loading any global (i.e., functions), not just
6993 classes. The name is kept only for backward compatibility. */
6994
Larry Hastings61272b72014-01-07 12:41:53 -08006995/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006996
6997_pickle.Unpickler.find_class
6998
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006999 module_name: object
7000 global_name: object
7001 /
7002
7003Return an object from a specified module.
7004
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007005If necessary, the module will be imported. Subclasses may override
7006this method (e.g. to restrict unpickling of arbitrary classes and
7007functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007008
7009This method is called whenever a class or a function object is
7010needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007011[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007012
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007013static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007014_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
7015 PyObject *module_name,
7016 PyObject *global_name)
7017/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007018{
7019 PyObject *global;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007020 PyObject *module;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007021
Steve Dowerb82e17e2019-05-23 08:45:22 -07007022 if (PySys_Audit("pickle.find_class", "OO",
7023 module_name, global_name) < 0) {
7024 return NULL;
7025 }
7026
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007027 /* Try to map the old names used in Python 2.x to the new ones used in
7028 Python 3.x. We do this only with old pickle protocols and when the
7029 user has not disabled the feature. */
7030 if (self->proto < 3 && self->fix_imports) {
7031 PyObject *key;
7032 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007033 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007034
7035 /* Check if the global (i.e., a function or a class) was renamed
7036 or moved to another module. */
7037 key = PyTuple_Pack(2, module_name, global_name);
7038 if (key == NULL)
7039 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007040 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007041 Py_DECREF(key);
7042 if (item) {
7043 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
7044 PyErr_Format(PyExc_RuntimeError,
7045 "_compat_pickle.NAME_MAPPING values should be "
7046 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
7047 return NULL;
7048 }
7049 module_name = PyTuple_GET_ITEM(item, 0);
7050 global_name = PyTuple_GET_ITEM(item, 1);
7051 if (!PyUnicode_Check(module_name) ||
7052 !PyUnicode_Check(global_name)) {
7053 PyErr_Format(PyExc_RuntimeError,
7054 "_compat_pickle.NAME_MAPPING values should be "
7055 "pairs of str, not (%.200s, %.200s)",
7056 Py_TYPE(module_name)->tp_name,
7057 Py_TYPE(global_name)->tp_name);
7058 return NULL;
7059 }
7060 }
7061 else if (PyErr_Occurred()) {
7062 return NULL;
7063 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03007064 else {
7065 /* Check if the module was renamed. */
7066 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
7067 if (item) {
7068 if (!PyUnicode_Check(item)) {
7069 PyErr_Format(PyExc_RuntimeError,
7070 "_compat_pickle.IMPORT_MAPPING values should be "
7071 "strings, not %.200s", Py_TYPE(item)->tp_name);
7072 return NULL;
7073 }
7074 module_name = item;
7075 }
7076 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007077 return NULL;
7078 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007079 }
7080 }
7081
tjb9004371c0a2019-02-18 23:30:51 +08007082 /*
7083 * we don't use PyImport_GetModule here, because it can return partially-
7084 * initialised modules, which then cause the getattribute to fail.
7085 */
7086 module = PyImport_Import(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007087 if (module == NULL) {
tjb9004371c0a2019-02-18 23:30:51 +08007088 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007089 }
Eric Snow3f9eee62017-09-15 16:35:20 -06007090 global = getattribute(module, global_name, self->proto >= 4);
7091 Py_DECREF(module);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007092 return global;
7093}
7094
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007095/*[clinic input]
7096
7097_pickle.Unpickler.__sizeof__ -> Py_ssize_t
7098
7099Returns size in memory, in bytes.
7100[clinic start generated code]*/
7101
7102static Py_ssize_t
7103_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
7104/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
7105{
7106 Py_ssize_t res;
7107
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02007108 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007109 if (self->memo != NULL)
7110 res += self->memo_size * sizeof(PyObject *);
7111 if (self->marks != NULL)
7112 res += self->marks_size * sizeof(Py_ssize_t);
7113 if (self->input_line != NULL)
7114 res += strlen(self->input_line) + 1;
7115 if (self->encoding != NULL)
7116 res += strlen(self->encoding) + 1;
7117 if (self->errors != NULL)
7118 res += strlen(self->errors) + 1;
7119 return res;
7120}
7121
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007122static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007123 _PICKLE_UNPICKLER_LOAD_METHODDEF
7124 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007125 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007126 {NULL, NULL} /* sentinel */
7127};
7128
7129static void
7130Unpickler_dealloc(UnpicklerObject *self)
7131{
7132 PyObject_GC_UnTrack((PyObject *)self);
7133 Py_XDECREF(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007134 Py_XDECREF(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007135 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007136 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007137 Py_XDECREF(self->stack);
7138 Py_XDECREF(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007139 Py_XDECREF(self->buffers);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007140 if (self->buffer.buf != NULL) {
7141 PyBuffer_Release(&self->buffer);
7142 self->buffer.buf = NULL;
7143 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007144
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007145 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007146 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007147 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007148 PyMem_Free(self->encoding);
7149 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007150
7151 Py_TYPE(self)->tp_free((PyObject *)self);
7152}
7153
7154static int
7155Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
7156{
7157 Py_VISIT(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007158 Py_VISIT(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007159 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007160 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007161 Py_VISIT(self->stack);
7162 Py_VISIT(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007163 Py_VISIT(self->buffers);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007164 return 0;
7165}
7166
7167static int
7168Unpickler_clear(UnpicklerObject *self)
7169{
7170 Py_CLEAR(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007171 Py_CLEAR(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007172 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007173 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007174 Py_CLEAR(self->stack);
7175 Py_CLEAR(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007176 Py_CLEAR(self->buffers);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007177 if (self->buffer.buf != NULL) {
7178 PyBuffer_Release(&self->buffer);
7179 self->buffer.buf = NULL;
7180 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007181
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007182 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007183 PyMem_Free(self->marks);
7184 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007185 PyMem_Free(self->input_line);
7186 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007187 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007188 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007189 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007190 self->errors = NULL;
7191
7192 return 0;
7193}
7194
Larry Hastings61272b72014-01-07 12:41:53 -08007195/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007196
7197_pickle.Unpickler.__init__
7198
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007199 file: object
7200 *
7201 fix_imports: bool = True
7202 encoding: str = 'ASCII'
7203 errors: str = 'strict'
Antoine Pitrou91f43802019-05-26 17:10:09 +02007204 buffers: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007205
7206This takes a binary file for reading a pickle data stream.
7207
7208The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007209protocol argument is needed. Bytes past the pickled object's
7210representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007211
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007212The argument *file* must have two methods, a read() method that takes
7213an integer argument, and a readline() method that requires no
7214arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007215binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007216other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007217
7218Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007219which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007220generated by Python 2. If *fix_imports* is True, pickle will try to
7221map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007222*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007223instances pickled by Python 2; these default to 'ASCII' and 'strict',
7224respectively. The *encoding* can be 'bytes' to read these 8-bit
7225string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007226[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007227
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007228static int
Larry Hastings89964c42015-04-14 18:07:59 -04007229_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
7230 int fix_imports, const char *encoding,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007231 const char *errors, PyObject *buffers)
7232/*[clinic end generated code: output=09f0192649ea3f85 input=da4b62d9edb68700]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007233{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02007234 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007235
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007236 /* In case of multiple __init__() calls, clear previous content. */
7237 if (self->read != NULL)
7238 (void)Unpickler_clear(self);
7239
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007240 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007241 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007242
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007243 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007244 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007245
Antoine Pitrou91f43802019-05-26 17:10:09 +02007246 if (_Unpickler_SetBuffers(self, buffers) < 0)
7247 return -1;
7248
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007249 self->fix_imports = fix_imports;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007250
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007251 if (init_method_ref((PyObject *)self, &PyId_persistent_load,
7252 &self->pers_func, &self->pers_func_self) < 0)
7253 {
7254 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007255 }
7256
7257 self->stack = (Pdata *)Pdata_New();
7258 if (self->stack == NULL)
Zackery Spytz4b430e52018-09-28 23:48:46 -06007259 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007260
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007261 self->memo_size = 32;
7262 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007263 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007264 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007265
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007266 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00007267
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007268 return 0;
7269}
7270
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007271
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007272/* Define a proxy object for the Unpickler's internal memo object. This is to
7273 * avoid breaking code like:
7274 * unpickler.memo.clear()
7275 * and
7276 * unpickler.memo = saved_memo
7277 * Is this a good idea? Not really, but we don't want to break code that uses
7278 * it. Note that we don't implement the entire mapping API here. This is
7279 * intentional, as these should be treated as black-box implementation details.
7280 *
7281 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02007282 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007283 */
7284
Larry Hastings61272b72014-01-07 12:41:53 -08007285/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007286_pickle.UnpicklerMemoProxy.clear
7287
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007288Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08007289[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007290
Larry Hastings3cceb382014-01-04 11:09:09 -08007291static PyObject *
7292_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007293/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007294{
7295 _Unpickler_MemoCleanup(self->unpickler);
7296 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
7297 if (self->unpickler->memo == NULL)
7298 return NULL;
7299 Py_RETURN_NONE;
7300}
7301
Larry Hastings61272b72014-01-07 12:41:53 -08007302/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007303_pickle.UnpicklerMemoProxy.copy
7304
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007305Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08007306[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007307
Larry Hastings3cceb382014-01-04 11:09:09 -08007308static PyObject *
7309_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007310/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007311{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007312 size_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007313 PyObject *new_memo = PyDict_New();
7314 if (new_memo == NULL)
7315 return NULL;
7316
7317 for (i = 0; i < self->unpickler->memo_size; i++) {
7318 int status;
7319 PyObject *key, *value;
7320
7321 value = self->unpickler->memo[i];
7322 if (value == NULL)
7323 continue;
7324
7325 key = PyLong_FromSsize_t(i);
7326 if (key == NULL)
7327 goto error;
7328 status = PyDict_SetItem(new_memo, key, value);
7329 Py_DECREF(key);
7330 if (status < 0)
7331 goto error;
7332 }
7333 return new_memo;
7334
7335error:
7336 Py_DECREF(new_memo);
7337 return NULL;
7338}
7339
Larry Hastings61272b72014-01-07 12:41:53 -08007340/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007341_pickle.UnpicklerMemoProxy.__reduce__
7342
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007343Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08007344[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007345
Larry Hastings3cceb382014-01-04 11:09:09 -08007346static PyObject *
7347_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007348/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007349{
7350 PyObject *reduce_value;
7351 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08007352 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007353 if (contents == NULL)
7354 return NULL;
7355
7356 reduce_value = PyTuple_New(2);
7357 if (reduce_value == NULL) {
7358 Py_DECREF(contents);
7359 return NULL;
7360 }
7361 constructor_args = PyTuple_New(1);
7362 if (constructor_args == NULL) {
7363 Py_DECREF(contents);
7364 Py_DECREF(reduce_value);
7365 return NULL;
7366 }
7367 PyTuple_SET_ITEM(constructor_args, 0, contents);
7368 Py_INCREF((PyObject *)&PyDict_Type);
7369 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
7370 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
7371 return reduce_value;
7372}
7373
7374static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007375 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
7376 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
7377 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007378 {NULL, NULL} /* sentinel */
7379};
7380
7381static void
7382UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
7383{
7384 PyObject_GC_UnTrack(self);
7385 Py_XDECREF(self->unpickler);
7386 PyObject_GC_Del((PyObject *)self);
7387}
7388
7389static int
7390UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
7391 visitproc visit, void *arg)
7392{
7393 Py_VISIT(self->unpickler);
7394 return 0;
7395}
7396
7397static int
7398UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
7399{
7400 Py_CLEAR(self->unpickler);
7401 return 0;
7402}
7403
7404static PyTypeObject UnpicklerMemoProxyType = {
7405 PyVarObject_HEAD_INIT(NULL, 0)
7406 "_pickle.UnpicklerMemoProxy", /*tp_name*/
7407 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
7408 0,
7409 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007410 0, /* tp_vectorcall_offset */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007411 0, /* tp_getattr */
7412 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007413 0, /* tp_as_async */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007414 0, /* tp_repr */
7415 0, /* tp_as_number */
7416 0, /* tp_as_sequence */
7417 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00007418 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007419 0, /* tp_call */
7420 0, /* tp_str */
7421 PyObject_GenericGetAttr, /* tp_getattro */
7422 PyObject_GenericSetAttr, /* tp_setattro */
7423 0, /* tp_as_buffer */
7424 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
7425 0, /* tp_doc */
7426 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
7427 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
7428 0, /* tp_richcompare */
7429 0, /* tp_weaklistoffset */
7430 0, /* tp_iter */
7431 0, /* tp_iternext */
7432 unpicklerproxy_methods, /* tp_methods */
7433};
7434
7435static PyObject *
7436UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
7437{
7438 UnpicklerMemoProxyObject *self;
7439
7440 self = PyObject_GC_New(UnpicklerMemoProxyObject,
7441 &UnpicklerMemoProxyType);
7442 if (self == NULL)
7443 return NULL;
7444 Py_INCREF(unpickler);
7445 self->unpickler = unpickler;
7446 PyObject_GC_Track(self);
7447 return (PyObject *)self;
7448}
7449
7450/*****************************************************************************/
7451
7452
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007453static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007454Unpickler_get_memo(UnpicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007455{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007456 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007457}
7458
7459static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007460Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007461{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007462 PyObject **new_memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007463 size_t new_memo_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007464
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007465 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007466 PyErr_SetString(PyExc_TypeError,
7467 "attribute deletion is not supported");
7468 return -1;
7469 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007470
7471 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
7472 UnpicklerObject *unpickler =
7473 ((UnpicklerMemoProxyObject *)obj)->unpickler;
7474
7475 new_memo_size = unpickler->memo_size;
7476 new_memo = _Unpickler_NewMemo(new_memo_size);
7477 if (new_memo == NULL)
7478 return -1;
7479
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007480 for (size_t i = 0; i < new_memo_size; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007481 Py_XINCREF(unpickler->memo[i]);
7482 new_memo[i] = unpickler->memo[i];
7483 }
7484 }
7485 else if (PyDict_Check(obj)) {
7486 Py_ssize_t i = 0;
7487 PyObject *key, *value;
7488
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02007489 new_memo_size = PyDict_GET_SIZE(obj);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007490 new_memo = _Unpickler_NewMemo(new_memo_size);
7491 if (new_memo == NULL)
7492 return -1;
7493
7494 while (PyDict_Next(obj, &i, &key, &value)) {
7495 Py_ssize_t idx;
7496 if (!PyLong_Check(key)) {
7497 PyErr_SetString(PyExc_TypeError,
7498 "memo key must be integers");
7499 goto error;
7500 }
7501 idx = PyLong_AsSsize_t(key);
7502 if (idx == -1 && PyErr_Occurred())
7503 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02007504 if (idx < 0) {
7505 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02007506 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02007507 goto error;
7508 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007509 if (_Unpickler_MemoPut(self, idx, value) < 0)
7510 goto error;
7511 }
7512 }
7513 else {
7514 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02007515 "'memo' attribute must be an UnpicklerMemoProxy object "
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007516 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007517 return -1;
7518 }
7519
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007520 _Unpickler_MemoCleanup(self);
7521 self->memo_size = new_memo_size;
7522 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007523
7524 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007525
7526 error:
7527 if (new_memo_size) {
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007528 for (size_t i = new_memo_size - 1; i != SIZE_MAX; i--) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007529 Py_XDECREF(new_memo[i]);
7530 }
7531 PyMem_FREE(new_memo);
7532 }
7533 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007534}
7535
7536static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007537Unpickler_get_persload(UnpicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007538{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007539 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007540 PyErr_SetString(PyExc_AttributeError, "persistent_load");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007541 return NULL;
7542 }
7543 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007544}
7545
7546static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007547Unpickler_set_persload(UnpicklerObject *self, PyObject *value, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007548{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007549 if (value == NULL) {
7550 PyErr_SetString(PyExc_TypeError,
7551 "attribute deletion is not supported");
7552 return -1;
7553 }
7554 if (!PyCallable_Check(value)) {
7555 PyErr_SetString(PyExc_TypeError,
7556 "persistent_load must be a callable taking "
7557 "one argument");
7558 return -1;
7559 }
7560
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007561 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007562 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03007563 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007564
7565 return 0;
7566}
7567
7568static PyGetSetDef Unpickler_getsets[] = {
7569 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
7570 {"persistent_load", (getter)Unpickler_get_persload,
7571 (setter)Unpickler_set_persload},
7572 {NULL}
7573};
7574
7575static PyTypeObject Unpickler_Type = {
7576 PyVarObject_HEAD_INIT(NULL, 0)
7577 "_pickle.Unpickler", /*tp_name*/
7578 sizeof(UnpicklerObject), /*tp_basicsize*/
7579 0, /*tp_itemsize*/
7580 (destructor)Unpickler_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007581 0, /*tp_vectorcall_offset*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007582 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007583 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007584 0, /*tp_as_async*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007585 0, /*tp_repr*/
7586 0, /*tp_as_number*/
7587 0, /*tp_as_sequence*/
7588 0, /*tp_as_mapping*/
7589 0, /*tp_hash*/
7590 0, /*tp_call*/
7591 0, /*tp_str*/
7592 0, /*tp_getattro*/
7593 0, /*tp_setattro*/
7594 0, /*tp_as_buffer*/
7595 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007596 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007597 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7598 (inquiry)Unpickler_clear, /*tp_clear*/
7599 0, /*tp_richcompare*/
7600 0, /*tp_weaklistoffset*/
7601 0, /*tp_iter*/
7602 0, /*tp_iternext*/
7603 Unpickler_methods, /*tp_methods*/
7604 0, /*tp_members*/
7605 Unpickler_getsets, /*tp_getset*/
7606 0, /*tp_base*/
7607 0, /*tp_dict*/
7608 0, /*tp_descr_get*/
7609 0, /*tp_descr_set*/
7610 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007611 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007612 PyType_GenericAlloc, /*tp_alloc*/
7613 PyType_GenericNew, /*tp_new*/
7614 PyObject_GC_Del, /*tp_free*/
7615 0, /*tp_is_gc*/
7616};
7617
Larry Hastings61272b72014-01-07 12:41:53 -08007618/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007619
7620_pickle.dump
7621
7622 obj: object
7623 file: object
7624 protocol: object = NULL
7625 *
7626 fix_imports: bool = True
Antoine Pitrou91f43802019-05-26 17:10:09 +02007627 buffer_callback: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007628
7629Write a pickled representation of obj to the open file object file.
7630
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007631This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7632be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007633
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007634The optional *protocol* argument tells the pickler to use the given
Łukasz Langac51d8c92018-04-03 23:06:53 -07007635protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7636protocol is 4. It was introduced in Python 3.4, it is incompatible
7637with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007638
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007639Specifying a negative protocol version selects the highest protocol
7640version supported. The higher the protocol used, the more recent the
7641version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007642
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007643The *file* argument must have a write() method that accepts a single
7644bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00007645writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007646this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007647
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007648If *fix_imports* is True and protocol is less than 3, pickle will try
7649to map the new Python 3 names to the old module names used in Python
76502, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02007651
7652If *buffer_callback* is None (the default), buffer views are serialized
7653into *file* as part of the pickle stream. It is an error if
7654*buffer_callback* is not None and *protocol* is None or smaller than 5.
7655
Larry Hastings61272b72014-01-07 12:41:53 -08007656[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007657
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007658static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007659_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007660 PyObject *protocol, int fix_imports,
7661 PyObject *buffer_callback)
7662/*[clinic end generated code: output=706186dba996490c input=2f035f02cc0f9547]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007663{
7664 PicklerObject *pickler = _Pickler_New();
7665
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007666 if (pickler == NULL)
7667 return NULL;
7668
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007669 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007670 goto error;
7671
7672 if (_Pickler_SetOutputStream(pickler, file) < 0)
7673 goto error;
7674
Antoine Pitrou91f43802019-05-26 17:10:09 +02007675 if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0)
7676 goto error;
7677
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007678 if (dump(pickler, obj) < 0)
7679 goto error;
7680
7681 if (_Pickler_FlushToFile(pickler) < 0)
7682 goto error;
7683
7684 Py_DECREF(pickler);
7685 Py_RETURN_NONE;
7686
7687 error:
7688 Py_XDECREF(pickler);
7689 return NULL;
7690}
7691
Larry Hastings61272b72014-01-07 12:41:53 -08007692/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007693
7694_pickle.dumps
7695
7696 obj: object
7697 protocol: object = NULL
7698 *
7699 fix_imports: bool = True
Antoine Pitrou91f43802019-05-26 17:10:09 +02007700 buffer_callback: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007701
7702Return the pickled representation of the object as a bytes object.
7703
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007704The optional *protocol* argument tells the pickler to use the given
7705protocol; supported protocols are 0, 1, 2, 3 and 4. The default
Łukasz Langac51d8c92018-04-03 23:06:53 -07007706protocol is 4. It was introduced in Python 3.4, it is incompatible
7707with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007708
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007709Specifying a negative protocol version selects the highest protocol
7710version supported. The higher the protocol used, the more recent the
7711version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007712
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007713If *fix_imports* is True and *protocol* is less than 3, pickle will
7714try to map the new Python 3 names to the old module names used in
7715Python 2, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02007716
7717If *buffer_callback* is None (the default), buffer views are serialized
7718into *file* as part of the pickle stream. It is an error if
7719*buffer_callback* is not None and *protocol* is None or smaller than 5.
7720
Larry Hastings61272b72014-01-07 12:41:53 -08007721[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007722
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007723static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007724_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007725 int fix_imports, PyObject *buffer_callback)
7726/*[clinic end generated code: output=fbab0093a5580fdf input=001f167df711b9f1]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007727{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007728 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007729 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007730
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007731 if (pickler == NULL)
7732 return NULL;
7733
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007734 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007735 goto error;
7736
Antoine Pitrou91f43802019-05-26 17:10:09 +02007737 if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0)
7738 goto error;
7739
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007740 if (dump(pickler, obj) < 0)
7741 goto error;
7742
7743 result = _Pickler_GetString(pickler);
7744 Py_DECREF(pickler);
7745 return result;
7746
7747 error:
7748 Py_XDECREF(pickler);
7749 return NULL;
7750}
7751
Larry Hastings61272b72014-01-07 12:41:53 -08007752/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007753
7754_pickle.load
7755
7756 file: object
7757 *
7758 fix_imports: bool = True
7759 encoding: str = 'ASCII'
7760 errors: str = 'strict'
Antoine Pitrou91f43802019-05-26 17:10:09 +02007761 buffers: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007762
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007763Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007764
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007765This is equivalent to ``Unpickler(file).load()``, but may be more
7766efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007767
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007768The protocol version of the pickle is detected automatically, so no
7769protocol argument is needed. Bytes past the pickled object's
7770representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007771
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007772The argument *file* must have two methods, a read() method that takes
7773an integer argument, and a readline() method that requires no
7774arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007775binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007776other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007777
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007778Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007779which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007780generated by Python 2. If *fix_imports* is True, pickle will try to
7781map the old Python 2 names to the new names used in Python 3. The
7782*encoding* and *errors* tell pickle how to decode 8-bit string
7783instances pickled by Python 2; these default to 'ASCII' and 'strict',
7784respectively. The *encoding* can be 'bytes' to read these 8-bit
7785string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007786[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007787
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007788static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007789_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007790 const char *encoding, const char *errors,
7791 PyObject *buffers)
7792/*[clinic end generated code: output=250452d141c23e76 input=29fae982fe778156]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007793{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007794 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007795 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007796
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007797 if (unpickler == NULL)
7798 return NULL;
7799
7800 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7801 goto error;
7802
7803 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7804 goto error;
7805
Antoine Pitrou91f43802019-05-26 17:10:09 +02007806 if (_Unpickler_SetBuffers(unpickler, buffers) < 0)
7807 goto error;
7808
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007809 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007810
7811 result = load(unpickler);
7812 Py_DECREF(unpickler);
7813 return result;
7814
7815 error:
7816 Py_XDECREF(unpickler);
7817 return NULL;
7818}
7819
Larry Hastings61272b72014-01-07 12:41:53 -08007820/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007821
7822_pickle.loads
7823
7824 data: object
7825 *
7826 fix_imports: bool = True
7827 encoding: str = 'ASCII'
7828 errors: str = 'strict'
Antoine Pitrou91f43802019-05-26 17:10:09 +02007829 buffers: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007830
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007831Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007832
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007833The protocol version of the pickle is detected automatically, so no
7834protocol argument is needed. Bytes past the pickled object's
7835representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007836
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007837Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007838which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007839generated by Python 2. If *fix_imports* is True, pickle will try to
7840map the old Python 2 names to the new names used in Python 3. The
7841*encoding* and *errors* tell pickle how to decode 8-bit string
7842instances pickled by Python 2; these default to 'ASCII' and 'strict',
7843respectively. The *encoding* can be 'bytes' to read these 8-bit
7844string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007845[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007846
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007847static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007848_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007849 const char *encoding, const char *errors,
7850 PyObject *buffers)
7851/*[clinic end generated code: output=82ac1e6b588e6d02 input=c6004393f8276867]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007852{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007853 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007854 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007855
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007856 if (unpickler == NULL)
7857 return NULL;
7858
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007859 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007860 goto error;
7861
7862 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7863 goto error;
7864
Antoine Pitrou91f43802019-05-26 17:10:09 +02007865 if (_Unpickler_SetBuffers(unpickler, buffers) < 0)
7866 goto error;
7867
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007868 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007869
7870 result = load(unpickler);
7871 Py_DECREF(unpickler);
7872 return result;
7873
7874 error:
7875 Py_XDECREF(unpickler);
7876 return NULL;
7877}
7878
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007879static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007880 _PICKLE_DUMP_METHODDEF
7881 _PICKLE_DUMPS_METHODDEF
7882 _PICKLE_LOAD_METHODDEF
7883 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007884 {NULL, NULL} /* sentinel */
7885};
7886
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007887static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007888pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007889{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007890 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007891 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007892}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007893
Stefan Krahf483b0f2013-12-14 13:43:10 +01007894static void
7895pickle_free(PyObject *m)
7896{
7897 _Pickle_ClearState(_Pickle_GetState(m));
7898}
7899
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007900static int
7901pickle_traverse(PyObject *m, visitproc visit, void *arg)
7902{
7903 PickleState *st = _Pickle_GetState(m);
7904 Py_VISIT(st->PickleError);
7905 Py_VISIT(st->PicklingError);
7906 Py_VISIT(st->UnpicklingError);
7907 Py_VISIT(st->dispatch_table);
7908 Py_VISIT(st->extension_registry);
7909 Py_VISIT(st->extension_cache);
7910 Py_VISIT(st->inverted_registry);
7911 Py_VISIT(st->name_mapping_2to3);
7912 Py_VISIT(st->import_mapping_2to3);
7913 Py_VISIT(st->name_mapping_3to2);
7914 Py_VISIT(st->import_mapping_3to2);
7915 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007916 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007917 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007918}
7919
7920static struct PyModuleDef _picklemodule = {
7921 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007922 "_pickle", /* m_name */
7923 pickle_module_doc, /* m_doc */
7924 sizeof(PickleState), /* m_size */
7925 pickle_methods, /* m_methods */
7926 NULL, /* m_reload */
7927 pickle_traverse, /* m_traverse */
7928 pickle_clear, /* m_clear */
7929 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007930};
7931
7932PyMODINIT_FUNC
7933PyInit__pickle(void)
7934{
7935 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007936 PickleState *st;
7937
7938 m = PyState_FindModule(&_picklemodule);
7939 if (m) {
7940 Py_INCREF(m);
7941 return m;
7942 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007943
7944 if (PyType_Ready(&Unpickler_Type) < 0)
7945 return NULL;
7946 if (PyType_Ready(&Pickler_Type) < 0)
7947 return NULL;
7948 if (PyType_Ready(&Pdata_Type) < 0)
7949 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007950 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7951 return NULL;
7952 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7953 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007954
7955 /* Create the module and add the functions. */
7956 m = PyModule_Create(&_picklemodule);
7957 if (m == NULL)
7958 return NULL;
7959
Antoine Pitrou91f43802019-05-26 17:10:09 +02007960 /* Add types */
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007961 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007962 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7963 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007964 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007965 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7966 return NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02007967 Py_INCREF(&PyPickleBuffer_Type);
7968 if (PyModule_AddObject(m, "PickleBuffer",
7969 (PyObject *)&PyPickleBuffer_Type) < 0)
7970 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007971
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007972 st = _Pickle_GetState(m);
7973
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007974 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007975 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7976 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007977 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007978 st->PicklingError = \
7979 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7980 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007981 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007982 st->UnpicklingError = \
7983 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7984 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007985 return NULL;
7986
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007987 Py_INCREF(st->PickleError);
7988 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007989 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007990 Py_INCREF(st->PicklingError);
7991 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007992 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007993 Py_INCREF(st->UnpicklingError);
7994 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007995 return NULL;
7996
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007997 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007998 return NULL;
7999
8000 return m;
8001}