blob: a3f02ae8813d9109beb61d67e3a1373663547b25 [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' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002591 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002592 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002593 p = _PyBytesWriter_Prepare(&writer, p, 6-1);
2594 if (p == NULL)
2595 goto error;
2596
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002597 *p++ = '\\';
2598 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002599 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2600 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2601 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2602 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002603 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002604 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002605 else
2606 *p++ = (char) ch;
2607 }
Victor Stinner358af132015-10-12 22:36:57 +02002608
2609 return _PyBytesWriter_Finish(&writer, p);
2610
2611error:
2612 _PyBytesWriter_Dealloc(&writer);
2613 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002614}
2615
2616static int
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002617write_unicode_binary(PicklerObject *self, PyObject *obj)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002618{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002619 char header[9];
2620 Py_ssize_t len;
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002621 PyObject *encoded = NULL;
2622 Py_ssize_t size;
2623 const char *data;
2624
2625 if (PyUnicode_READY(obj))
2626 return -1;
2627
2628 data = PyUnicode_AsUTF8AndSize(obj, &size);
2629 if (data == NULL) {
2630 /* Issue #8383: for strings with lone surrogates, fallback on the
2631 "surrogatepass" error handler. */
2632 PyErr_Clear();
2633 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2634 if (encoded == NULL)
2635 return -1;
2636
2637 data = PyBytes_AS_STRING(encoded);
2638 size = PyBytes_GET_SIZE(encoded);
2639 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002640
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002641 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002642 if (size <= 0xff && self->proto >= 4) {
2643 header[0] = SHORT_BINUNICODE;
2644 header[1] = (unsigned char)(size & 0xff);
2645 len = 2;
2646 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002647 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002648 header[0] = BINUNICODE;
2649 header[1] = (unsigned char)(size & 0xff);
2650 header[2] = (unsigned char)((size >> 8) & 0xff);
2651 header[3] = (unsigned char)((size >> 16) & 0xff);
2652 header[4] = (unsigned char)((size >> 24) & 0xff);
2653 len = 5;
2654 }
2655 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002656 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002657 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002658 len = 9;
2659 }
2660 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002661 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou91f43802019-05-26 17:10:09 +02002662 "serializing a string larger than 4 GiB "
2663 "requires pickle protocol 4 or higher");
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002664 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002665 return -1;
2666 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002667
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002668 if (_Pickler_write_bytes(self, header, len, data, size, encoded) < 0) {
2669 Py_XDECREF(encoded);
2670 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002671 }
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002672 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002673 return 0;
2674}
2675
2676static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002677save_unicode(PicklerObject *self, PyObject *obj)
2678{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002679 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002680 if (write_unicode_binary(self, obj) < 0)
2681 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002682 }
2683 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002684 PyObject *encoded;
2685 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002686 const char unicode_op = UNICODE;
2687
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002688 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002689 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002690 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002691
Antoine Pitrou299978d2013-04-07 17:38:11 +02002692 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2693 Py_DECREF(encoded);
2694 return -1;
2695 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002696
2697 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002698 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2699 Py_DECREF(encoded);
2700 return -1;
2701 }
2702 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002703
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002704 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002705 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002706 }
2707 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002708 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002709
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002710 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002711}
2712
2713/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2714static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002715store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002716{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002717 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002718
2719 assert(PyTuple_Size(t) == len);
2720
2721 for (i = 0; i < len; i++) {
2722 PyObject *element = PyTuple_GET_ITEM(t, i);
2723
2724 if (element == NULL)
2725 return -1;
2726 if (save(self, element, 0) < 0)
2727 return -1;
2728 }
2729
2730 return 0;
2731}
2732
2733/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2734 * used across protocols to minimize the space needed to pickle them.
2735 * Tuples are also the only builtin immutable type that can be recursive
2736 * (a tuple can be reached from itself), and that requires some subtle
2737 * magic so that it works in all cases. IOW, this is a long routine.
2738 */
2739static int
2740save_tuple(PicklerObject *self, PyObject *obj)
2741{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002742 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002743
2744 const char mark_op = MARK;
2745 const char tuple_op = TUPLE;
2746 const char pop_op = POP;
2747 const char pop_mark_op = POP_MARK;
2748 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2749
2750 if ((len = PyTuple_Size(obj)) < 0)
2751 return -1;
2752
2753 if (len == 0) {
2754 char pdata[2];
2755
2756 if (self->proto) {
2757 pdata[0] = EMPTY_TUPLE;
2758 len = 1;
2759 }
2760 else {
2761 pdata[0] = MARK;
2762 pdata[1] = TUPLE;
2763 len = 2;
2764 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002765 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002766 return -1;
2767 return 0;
2768 }
2769
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002770 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002771 * saving the tuple elements, the tuple must be recursive, in
2772 * which case we'll pop everything we put on the stack, and fetch
2773 * its value from the memo.
2774 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002775 if (len <= 3 && self->proto >= 2) {
2776 /* Use TUPLE{1,2,3} opcodes. */
2777 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002778 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002779
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002780 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002781 /* pop the len elements */
2782 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002783 if (_Pickler_Write(self, &pop_op, 1) < 0)
2784 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002785 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002786 if (memo_get(self, obj) < 0)
2787 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002788
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002789 return 0;
2790 }
2791 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002792 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2793 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002794 }
2795 goto memoize;
2796 }
2797
2798 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2799 * Generate MARK e1 e2 ... TUPLE
2800 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002801 if (_Pickler_Write(self, &mark_op, 1) < 0)
2802 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002803
2804 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002805 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002806
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002807 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002808 /* pop the stack stuff we pushed */
2809 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002810 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2811 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002812 }
2813 else {
2814 /* Note that we pop one more than len, to remove
2815 * the MARK too.
2816 */
2817 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002818 if (_Pickler_Write(self, &pop_op, 1) < 0)
2819 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002820 }
2821 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002822 if (memo_get(self, obj) < 0)
2823 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002824
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002825 return 0;
2826 }
2827 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002828 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2829 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002830 }
2831
2832 memoize:
2833 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002834 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002835
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002836 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002837}
2838
2839/* iter is an iterator giving items, and we batch up chunks of
2840 * MARK item item ... item APPENDS
2841 * opcode sequences. Calling code should have arranged to first create an
2842 * empty list, or list-like object, for the APPENDS to operate on.
2843 * Returns 0 on success, <0 on error.
2844 */
2845static int
2846batch_list(PicklerObject *self, PyObject *iter)
2847{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002848 PyObject *obj = NULL;
2849 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002850 int i, n;
2851
2852 const char mark_op = MARK;
2853 const char append_op = APPEND;
2854 const char appends_op = APPENDS;
2855
2856 assert(iter != NULL);
2857
2858 /* XXX: I think this function could be made faster by avoiding the
2859 iterator interface and fetching objects directly from list using
2860 PyList_GET_ITEM.
2861 */
2862
2863 if (self->proto == 0) {
2864 /* APPENDS isn't available; do one at a time. */
2865 for (;;) {
2866 obj = PyIter_Next(iter);
2867 if (obj == NULL) {
2868 if (PyErr_Occurred())
2869 return -1;
2870 break;
2871 }
2872 i = save(self, obj, 0);
2873 Py_DECREF(obj);
2874 if (i < 0)
2875 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002876 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002877 return -1;
2878 }
2879 return 0;
2880 }
2881
2882 /* proto > 0: write in batches of BATCHSIZE. */
2883 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002884 /* Get first item */
2885 firstitem = PyIter_Next(iter);
2886 if (firstitem == NULL) {
2887 if (PyErr_Occurred())
2888 goto error;
2889
2890 /* nothing more to add */
2891 break;
2892 }
2893
2894 /* Try to get a second item */
2895 obj = PyIter_Next(iter);
2896 if (obj == NULL) {
2897 if (PyErr_Occurred())
2898 goto error;
2899
2900 /* Only one item to write */
2901 if (save(self, firstitem, 0) < 0)
2902 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002903 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002904 goto error;
2905 Py_CLEAR(firstitem);
2906 break;
2907 }
2908
2909 /* More than one item to write */
2910
2911 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002912 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002913 goto error;
2914
2915 if (save(self, firstitem, 0) < 0)
2916 goto error;
2917 Py_CLEAR(firstitem);
2918 n = 1;
2919
2920 /* Fetch and save up to BATCHSIZE items */
2921 while (obj) {
2922 if (save(self, obj, 0) < 0)
2923 goto error;
2924 Py_CLEAR(obj);
2925 n += 1;
2926
2927 if (n == BATCHSIZE)
2928 break;
2929
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002930 obj = PyIter_Next(iter);
2931 if (obj == NULL) {
2932 if (PyErr_Occurred())
2933 goto error;
2934 break;
2935 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002936 }
2937
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002938 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002939 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002940
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002941 } while (n == BATCHSIZE);
2942 return 0;
2943
2944 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002945 Py_XDECREF(firstitem);
2946 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002947 return -1;
2948}
2949
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002950/* This is a variant of batch_list() above, specialized for lists (with no
2951 * support for list subclasses). Like batch_list(), we batch up chunks of
2952 * MARK item item ... item APPENDS
2953 * opcode sequences. Calling code should have arranged to first create an
2954 * empty list, or list-like object, for the APPENDS to operate on.
2955 * Returns 0 on success, -1 on error.
2956 *
2957 * This version is considerably faster than batch_list(), if less general.
2958 *
2959 * Note that this only works for protocols > 0.
2960 */
2961static int
2962batch_list_exact(PicklerObject *self, PyObject *obj)
2963{
2964 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002965 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002966
2967 const char append_op = APPEND;
2968 const char appends_op = APPENDS;
2969 const char mark_op = MARK;
2970
2971 assert(obj != NULL);
2972 assert(self->proto > 0);
2973 assert(PyList_CheckExact(obj));
2974
2975 if (PyList_GET_SIZE(obj) == 1) {
2976 item = PyList_GET_ITEM(obj, 0);
2977 if (save(self, item, 0) < 0)
2978 return -1;
2979 if (_Pickler_Write(self, &append_op, 1) < 0)
2980 return -1;
2981 return 0;
2982 }
2983
2984 /* Write in batches of BATCHSIZE. */
2985 total = 0;
2986 do {
2987 this_batch = 0;
2988 if (_Pickler_Write(self, &mark_op, 1) < 0)
2989 return -1;
2990 while (total < PyList_GET_SIZE(obj)) {
2991 item = PyList_GET_ITEM(obj, total);
2992 if (save(self, item, 0) < 0)
2993 return -1;
2994 total++;
2995 if (++this_batch == BATCHSIZE)
2996 break;
2997 }
2998 if (_Pickler_Write(self, &appends_op, 1) < 0)
2999 return -1;
3000
3001 } while (total < PyList_GET_SIZE(obj));
3002
3003 return 0;
3004}
3005
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003006static int
3007save_list(PicklerObject *self, PyObject *obj)
3008{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003009 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003010 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003011 int status = 0;
3012
3013 if (self->fast && !fast_save_enter(self, obj))
3014 goto error;
3015
3016 /* Create an empty list. */
3017 if (self->bin) {
3018 header[0] = EMPTY_LIST;
3019 len = 1;
3020 }
3021 else {
3022 header[0] = MARK;
3023 header[1] = LIST;
3024 len = 2;
3025 }
3026
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003027 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003028 goto error;
3029
3030 /* Get list length, and bow out early if empty. */
3031 if ((len = PyList_Size(obj)) < 0)
3032 goto error;
3033
3034 if (memo_put(self, obj) < 0)
3035 goto error;
3036
3037 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003038 /* Materialize the list elements. */
3039 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003040 if (Py_EnterRecursiveCall(" while pickling an object"))
3041 goto error;
3042 status = batch_list_exact(self, obj);
3043 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003044 } else {
3045 PyObject *iter = PyObject_GetIter(obj);
3046 if (iter == NULL)
3047 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003048
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003049 if (Py_EnterRecursiveCall(" while pickling an object")) {
3050 Py_DECREF(iter);
3051 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003052 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003053 status = batch_list(self, iter);
3054 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003055 Py_DECREF(iter);
3056 }
3057 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003058 if (0) {
3059 error:
3060 status = -1;
3061 }
3062
3063 if (self->fast && !fast_save_leave(self, obj))
3064 status = -1;
3065
3066 return status;
3067}
3068
3069/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
3070 * MARK key value ... key value SETITEMS
3071 * opcode sequences. Calling code should have arranged to first create an
3072 * empty dict, or dict-like object, for the SETITEMS to operate on.
3073 * Returns 0 on success, <0 on error.
3074 *
3075 * This is very much like batch_list(). The difference between saving
3076 * elements directly, and picking apart two-tuples, is so long-winded at
3077 * the C level, though, that attempts to combine these routines were too
3078 * ugly to bear.
3079 */
3080static int
3081batch_dict(PicklerObject *self, PyObject *iter)
3082{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003083 PyObject *obj = NULL;
3084 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003085 int i, n;
3086
3087 const char mark_op = MARK;
3088 const char setitem_op = SETITEM;
3089 const char setitems_op = SETITEMS;
3090
3091 assert(iter != NULL);
3092
3093 if (self->proto == 0) {
3094 /* SETITEMS isn't available; do one at a time. */
3095 for (;;) {
3096 obj = PyIter_Next(iter);
3097 if (obj == NULL) {
3098 if (PyErr_Occurred())
3099 return -1;
3100 break;
3101 }
3102 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
3103 PyErr_SetString(PyExc_TypeError, "dict items "
3104 "iterator must return 2-tuples");
3105 return -1;
3106 }
3107 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
3108 if (i >= 0)
3109 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
3110 Py_DECREF(obj);
3111 if (i < 0)
3112 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003113 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003114 return -1;
3115 }
3116 return 0;
3117 }
3118
3119 /* proto > 0: write in batches of BATCHSIZE. */
3120 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003121 /* Get first item */
3122 firstitem = PyIter_Next(iter);
3123 if (firstitem == NULL) {
3124 if (PyErr_Occurred())
3125 goto error;
3126
3127 /* nothing more to add */
3128 break;
3129 }
3130 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
3131 PyErr_SetString(PyExc_TypeError, "dict items "
3132 "iterator must return 2-tuples");
3133 goto error;
3134 }
3135
3136 /* Try to get a second item */
3137 obj = PyIter_Next(iter);
3138 if (obj == NULL) {
3139 if (PyErr_Occurred())
3140 goto error;
3141
3142 /* Only one item to write */
3143 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
3144 goto error;
3145 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
3146 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003147 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003148 goto error;
3149 Py_CLEAR(firstitem);
3150 break;
3151 }
3152
3153 /* More than one item to write */
3154
3155 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003156 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003157 goto error;
3158
3159 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
3160 goto error;
3161 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
3162 goto error;
3163 Py_CLEAR(firstitem);
3164 n = 1;
3165
3166 /* Fetch and save up to BATCHSIZE items */
3167 while (obj) {
3168 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
3169 PyErr_SetString(PyExc_TypeError, "dict items "
3170 "iterator must return 2-tuples");
3171 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003172 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003173 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
3174 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
3175 goto error;
3176 Py_CLEAR(obj);
3177 n += 1;
3178
3179 if (n == BATCHSIZE)
3180 break;
3181
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003182 obj = PyIter_Next(iter);
3183 if (obj == NULL) {
3184 if (PyErr_Occurred())
3185 goto error;
3186 break;
3187 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003188 }
3189
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003190 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003191 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003192
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003193 } while (n == BATCHSIZE);
3194 return 0;
3195
3196 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003197 Py_XDECREF(firstitem);
3198 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003199 return -1;
3200}
3201
Collin Winter5c9b02d2009-05-25 05:43:30 +00003202/* This is a variant of batch_dict() above that specializes for dicts, with no
3203 * support for dict subclasses. Like batch_dict(), we batch up chunks of
3204 * MARK key value ... key value SETITEMS
3205 * opcode sequences. Calling code should have arranged to first create an
3206 * empty dict, or dict-like object, for the SETITEMS to operate on.
3207 * Returns 0 on success, -1 on error.
3208 *
3209 * Note that this currently doesn't work for protocol 0.
3210 */
3211static int
3212batch_dict_exact(PicklerObject *self, PyObject *obj)
3213{
3214 PyObject *key = NULL, *value = NULL;
3215 int i;
3216 Py_ssize_t dict_size, ppos = 0;
3217
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00003218 const char mark_op = MARK;
3219 const char setitem_op = SETITEM;
3220 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00003221
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003222 assert(obj != NULL && PyDict_CheckExact(obj));
Collin Winter5c9b02d2009-05-25 05:43:30 +00003223 assert(self->proto > 0);
3224
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003225 dict_size = PyDict_GET_SIZE(obj);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003226
3227 /* Special-case len(d) == 1 to save space. */
3228 if (dict_size == 1) {
3229 PyDict_Next(obj, &ppos, &key, &value);
3230 if (save(self, key, 0) < 0)
3231 return -1;
3232 if (save(self, value, 0) < 0)
3233 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003234 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003235 return -1;
3236 return 0;
3237 }
3238
3239 /* Write in batches of BATCHSIZE. */
3240 do {
3241 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003242 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003243 return -1;
3244 while (PyDict_Next(obj, &ppos, &key, &value)) {
3245 if (save(self, key, 0) < 0)
3246 return -1;
3247 if (save(self, value, 0) < 0)
3248 return -1;
3249 if (++i == BATCHSIZE)
3250 break;
3251 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003252 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003253 return -1;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003254 if (PyDict_GET_SIZE(obj) != dict_size) {
Collin Winter5c9b02d2009-05-25 05:43:30 +00003255 PyErr_Format(
3256 PyExc_RuntimeError,
3257 "dictionary changed size during iteration");
3258 return -1;
3259 }
3260
3261 } while (i == BATCHSIZE);
3262 return 0;
3263}
3264
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003265static int
3266save_dict(PicklerObject *self, PyObject *obj)
3267{
3268 PyObject *items, *iter;
3269 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003270 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003271 int status = 0;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003272 assert(PyDict_Check(obj));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003273
3274 if (self->fast && !fast_save_enter(self, obj))
3275 goto error;
3276
3277 /* Create an empty dict. */
3278 if (self->bin) {
3279 header[0] = EMPTY_DICT;
3280 len = 1;
3281 }
3282 else {
3283 header[0] = MARK;
3284 header[1] = DICT;
3285 len = 2;
3286 }
3287
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003288 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003289 goto error;
3290
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003291 if (memo_put(self, obj) < 0)
3292 goto error;
3293
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003294 if (PyDict_GET_SIZE(obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003295 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00003296 if (PyDict_CheckExact(obj) && self->proto > 0) {
3297 /* We can take certain shortcuts if we know this is a dict and
3298 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003299 if (Py_EnterRecursiveCall(" while pickling an object"))
3300 goto error;
3301 status = batch_dict_exact(self, obj);
3302 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003303 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003304 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003305
Victor Stinnerad8c83a2016-09-05 17:53:15 -07003306 items = _PyObject_CallMethodId(obj, &PyId_items, NULL);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003307 if (items == NULL)
3308 goto error;
3309 iter = PyObject_GetIter(items);
3310 Py_DECREF(items);
3311 if (iter == NULL)
3312 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003313 if (Py_EnterRecursiveCall(" while pickling an object")) {
3314 Py_DECREF(iter);
3315 goto error;
3316 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00003317 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003318 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003319 Py_DECREF(iter);
3320 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003321 }
3322
3323 if (0) {
3324 error:
3325 status = -1;
3326 }
3327
3328 if (self->fast && !fast_save_leave(self, obj))
3329 status = -1;
3330
3331 return status;
3332}
3333
3334static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003335save_set(PicklerObject *self, PyObject *obj)
3336{
3337 PyObject *item;
3338 int i;
3339 Py_ssize_t set_size, ppos = 0;
3340 Py_hash_t hash;
3341
3342 const char empty_set_op = EMPTY_SET;
3343 const char mark_op = MARK;
3344 const char additems_op = ADDITEMS;
3345
3346 if (self->proto < 4) {
3347 PyObject *items;
3348 PyObject *reduce_value;
3349 int status;
3350
3351 items = PySequence_List(obj);
3352 if (items == NULL) {
3353 return -1;
3354 }
3355 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
3356 Py_DECREF(items);
3357 if (reduce_value == NULL) {
3358 return -1;
3359 }
3360 /* save_reduce() will memoize the object automatically. */
3361 status = save_reduce(self, reduce_value, obj);
3362 Py_DECREF(reduce_value);
3363 return status;
3364 }
3365
3366 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
3367 return -1;
3368
3369 if (memo_put(self, obj) < 0)
3370 return -1;
3371
3372 set_size = PySet_GET_SIZE(obj);
3373 if (set_size == 0)
3374 return 0; /* nothing to do */
3375
3376 /* Write in batches of BATCHSIZE. */
3377 do {
3378 i = 0;
3379 if (_Pickler_Write(self, &mark_op, 1) < 0)
3380 return -1;
3381 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
3382 if (save(self, item, 0) < 0)
3383 return -1;
3384 if (++i == BATCHSIZE)
3385 break;
3386 }
3387 if (_Pickler_Write(self, &additems_op, 1) < 0)
3388 return -1;
3389 if (PySet_GET_SIZE(obj) != set_size) {
3390 PyErr_Format(
3391 PyExc_RuntimeError,
3392 "set changed size during iteration");
3393 return -1;
3394 }
3395 } while (i == BATCHSIZE);
3396
3397 return 0;
3398}
3399
3400static int
3401save_frozenset(PicklerObject *self, PyObject *obj)
3402{
3403 PyObject *iter;
3404
3405 const char mark_op = MARK;
3406 const char frozenset_op = FROZENSET;
3407
3408 if (self->fast && !fast_save_enter(self, obj))
3409 return -1;
3410
3411 if (self->proto < 4) {
3412 PyObject *items;
3413 PyObject *reduce_value;
3414 int status;
3415
3416 items = PySequence_List(obj);
3417 if (items == NULL) {
3418 return -1;
3419 }
3420 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
3421 items);
3422 Py_DECREF(items);
3423 if (reduce_value == NULL) {
3424 return -1;
3425 }
3426 /* save_reduce() will memoize the object automatically. */
3427 status = save_reduce(self, reduce_value, obj);
3428 Py_DECREF(reduce_value);
3429 return status;
3430 }
3431
3432 if (_Pickler_Write(self, &mark_op, 1) < 0)
3433 return -1;
3434
3435 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003436 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01003437 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003438 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003439 for (;;) {
3440 PyObject *item;
3441
3442 item = PyIter_Next(iter);
3443 if (item == NULL) {
3444 if (PyErr_Occurred()) {
3445 Py_DECREF(iter);
3446 return -1;
3447 }
3448 break;
3449 }
3450 if (save(self, item, 0) < 0) {
3451 Py_DECREF(item);
3452 Py_DECREF(iter);
3453 return -1;
3454 }
3455 Py_DECREF(item);
3456 }
3457 Py_DECREF(iter);
3458
3459 /* If the object is already in the memo, this means it is
3460 recursive. In this case, throw away everything we put on the
3461 stack, and fetch the object back from the memo. */
3462 if (PyMemoTable_Get(self->memo, obj)) {
3463 const char pop_mark_op = POP_MARK;
3464
3465 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3466 return -1;
3467 if (memo_get(self, obj) < 0)
3468 return -1;
3469 return 0;
3470 }
3471
3472 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3473 return -1;
3474 if (memo_put(self, obj) < 0)
3475 return -1;
3476
3477 return 0;
3478}
3479
3480static int
3481fix_imports(PyObject **module_name, PyObject **global_name)
3482{
3483 PyObject *key;
3484 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003485 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003486
3487 key = PyTuple_Pack(2, *module_name, *global_name);
3488 if (key == NULL)
3489 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003490 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003491 Py_DECREF(key);
3492 if (item) {
3493 PyObject *fixed_module_name;
3494 PyObject *fixed_global_name;
3495
3496 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3497 PyErr_Format(PyExc_RuntimeError,
3498 "_compat_pickle.REVERSE_NAME_MAPPING values "
3499 "should be 2-tuples, not %.200s",
3500 Py_TYPE(item)->tp_name);
3501 return -1;
3502 }
3503 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3504 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3505 if (!PyUnicode_Check(fixed_module_name) ||
3506 !PyUnicode_Check(fixed_global_name)) {
3507 PyErr_Format(PyExc_RuntimeError,
3508 "_compat_pickle.REVERSE_NAME_MAPPING values "
3509 "should be pairs of str, not (%.200s, %.200s)",
3510 Py_TYPE(fixed_module_name)->tp_name,
3511 Py_TYPE(fixed_global_name)->tp_name);
3512 return -1;
3513 }
3514
3515 Py_CLEAR(*module_name);
3516 Py_CLEAR(*global_name);
3517 Py_INCREF(fixed_module_name);
3518 Py_INCREF(fixed_global_name);
3519 *module_name = fixed_module_name;
3520 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003521 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003522 }
3523 else if (PyErr_Occurred()) {
3524 return -1;
3525 }
3526
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003527 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003528 if (item) {
3529 if (!PyUnicode_Check(item)) {
3530 PyErr_Format(PyExc_RuntimeError,
3531 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3532 "should be strings, not %.200s",
3533 Py_TYPE(item)->tp_name);
3534 return -1;
3535 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003536 Py_INCREF(item);
Serhiy Storchaka48842712016-04-06 09:45:48 +03003537 Py_XSETREF(*module_name, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003538 }
3539 else if (PyErr_Occurred()) {
3540 return -1;
3541 }
3542
3543 return 0;
3544}
3545
3546static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003547save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3548{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003549 PyObject *global_name = NULL;
3550 PyObject *module_name = NULL;
3551 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003552 PyObject *parent = NULL;
3553 PyObject *dotted_path = NULL;
3554 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003555 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003556 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003557 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003558 _Py_IDENTIFIER(__name__);
3559 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003560
3561 const char global_op = GLOBAL;
3562
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003563 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003564 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003565 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003566 }
3567 else {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003568 if (_PyObject_LookupAttrId(obj, &PyId___qualname__, &global_name) < 0)
3569 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003570 if (global_name == NULL) {
3571 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3572 if (global_name == NULL)
3573 goto error;
3574 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003575 }
3576
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003577 dotted_path = get_dotted_path(module, global_name);
3578 if (dotted_path == NULL)
3579 goto error;
3580 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003581 if (module_name == NULL)
3582 goto error;
3583
3584 /* XXX: Change to use the import C API directly with level=0 to disallow
3585 relative imports.
3586
3587 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3588 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3589 custom import functions (IMHO, this would be a nice security
3590 feature). The import C API would need to be extended to support the
3591 extra parameters of __import__ to fix that. */
3592 module = PyImport_Import(module_name);
3593 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003594 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003595 "Can't pickle %R: import of module %R failed",
3596 obj, module_name);
3597 goto error;
3598 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003599 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3600 Py_INCREF(lastname);
3601 cls = get_deep_attribute(module, dotted_path, &parent);
3602 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003603 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003604 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003605 "Can't pickle %R: attribute lookup %S on %S failed",
3606 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003607 goto error;
3608 }
3609 if (cls != obj) {
3610 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003611 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003612 "Can't pickle %R: it's not the same object as %S.%S",
3613 obj, module_name, global_name);
3614 goto error;
3615 }
3616 Py_DECREF(cls);
3617
3618 if (self->proto >= 2) {
3619 /* See whether this is in the extension registry, and if
3620 * so generate an EXT opcode.
3621 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003622 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003623 PyObject *code_obj; /* extension code as Python object */
3624 long code; /* extension code as C value */
3625 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003626 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003627
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003628 extension_key = PyTuple_Pack(2, module_name, global_name);
3629 if (extension_key == NULL) {
3630 goto error;
3631 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003632 code_obj = PyDict_GetItemWithError(st->extension_registry,
3633 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003634 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003635 /* The object is not registered in the extension registry.
3636 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003637 if (code_obj == NULL) {
3638 if (PyErr_Occurred()) {
3639 goto error;
3640 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003641 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003642 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003643
3644 /* XXX: pickle.py doesn't check neither the type, nor the range
3645 of the value returned by the extension_registry. It should for
3646 consistency. */
3647
3648 /* Verify code_obj has the right type and value. */
3649 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003650 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003651 "Can't pickle %R: extension code %R isn't an integer",
3652 obj, code_obj);
3653 goto error;
3654 }
3655 code = PyLong_AS_LONG(code_obj);
3656 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003657 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003658 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3659 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003660 goto error;
3661 }
3662
3663 /* Generate an EXT opcode. */
3664 if (code <= 0xff) {
3665 pdata[0] = EXT1;
3666 pdata[1] = (unsigned char)code;
3667 n = 2;
3668 }
3669 else if (code <= 0xffff) {
3670 pdata[0] = EXT2;
3671 pdata[1] = (unsigned char)(code & 0xff);
3672 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3673 n = 3;
3674 }
3675 else {
3676 pdata[0] = EXT4;
3677 pdata[1] = (unsigned char)(code & 0xff);
3678 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3679 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3680 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3681 n = 5;
3682 }
3683
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003684 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003685 goto error;
3686 }
3687 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003688 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003689 if (parent == module) {
3690 Py_INCREF(lastname);
3691 Py_DECREF(global_name);
3692 global_name = lastname;
3693 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003694 if (self->proto >= 4) {
3695 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003696
Christian Heimese8b1ba12013-11-23 21:13:39 +01003697 if (save(self, module_name, 0) < 0)
3698 goto error;
3699 if (save(self, global_name, 0) < 0)
3700 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003701
3702 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3703 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003704 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003705 else if (parent != module) {
3706 PickleState *st = _Pickle_GetGlobalState();
3707 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3708 st->getattr, parent, lastname);
Alexey Izbyshevf8c06b02018-08-22 07:51:25 +03003709 if (reduce_value == NULL)
3710 goto error;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003711 status = save_reduce(self, reduce_value, NULL);
3712 Py_DECREF(reduce_value);
3713 if (status < 0)
3714 goto error;
3715 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003716 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003717 /* Generate a normal global opcode if we are using a pickle
3718 protocol < 4, or if the object is not registered in the
3719 extension registry. */
3720 PyObject *encoded;
3721 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003722
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003723 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003724 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003725
3726 /* For protocol < 3 and if the user didn't request against doing
3727 so, we convert module names to the old 2.x module names. */
3728 if (self->proto < 3 && self->fix_imports) {
3729 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003730 goto error;
3731 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003732 }
3733
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003734 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3735 both the module name and the global name using UTF-8. We do so
3736 only when we are using the pickle protocol newer than version
3737 3. This is to ensure compatibility with older Unpickler running
3738 on Python 2.x. */
3739 if (self->proto == 3) {
3740 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003741 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003742 else {
3743 unicode_encoder = PyUnicode_AsASCIIString;
3744 }
3745 encoded = unicode_encoder(module_name);
3746 if (encoded == NULL) {
3747 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003748 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003749 "can't pickle module identifier '%S' using "
3750 "pickle protocol %i",
3751 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003752 goto error;
3753 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003754 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3755 PyBytes_GET_SIZE(encoded)) < 0) {
3756 Py_DECREF(encoded);
3757 goto error;
3758 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003759 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003760 if(_Pickler_Write(self, "\n", 1) < 0)
3761 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003762
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003763 /* Save the name of the module. */
3764 encoded = unicode_encoder(global_name);
3765 if (encoded == NULL) {
3766 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003767 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003768 "can't pickle global identifier '%S' using "
3769 "pickle protocol %i",
3770 global_name, self->proto);
3771 goto error;
3772 }
3773 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3774 PyBytes_GET_SIZE(encoded)) < 0) {
3775 Py_DECREF(encoded);
3776 goto error;
3777 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003778 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003779 if (_Pickler_Write(self, "\n", 1) < 0)
3780 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003781 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003782 /* Memoize the object. */
3783 if (memo_put(self, obj) < 0)
3784 goto error;
3785 }
3786
3787 if (0) {
3788 error:
3789 status = -1;
3790 }
3791 Py_XDECREF(module_name);
3792 Py_XDECREF(global_name);
3793 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003794 Py_XDECREF(parent);
3795 Py_XDECREF(dotted_path);
3796 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003797
3798 return status;
3799}
3800
3801static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003802save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3803{
3804 PyObject *reduce_value;
3805 int status;
3806
3807 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3808 if (reduce_value == NULL) {
3809 return -1;
3810 }
3811 status = save_reduce(self, reduce_value, obj);
3812 Py_DECREF(reduce_value);
3813 return status;
3814}
3815
3816static int
3817save_type(PicklerObject *self, PyObject *obj)
3818{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003819 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003820 return save_singleton_type(self, obj, Py_None);
3821 }
3822 else if (obj == (PyObject *)&PyEllipsis_Type) {
3823 return save_singleton_type(self, obj, Py_Ellipsis);
3824 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003825 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003826 return save_singleton_type(self, obj, Py_NotImplemented);
3827 }
3828 return save_global(self, obj, NULL);
3829}
3830
3831static int
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003832save_pers(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003833{
3834 PyObject *pid = NULL;
3835 int status = 0;
3836
3837 const char persid_op = PERSID;
3838 const char binpersid_op = BINPERSID;
3839
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003840 pid = call_method(self->pers_func, self->pers_func_self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003841 if (pid == NULL)
3842 return -1;
3843
3844 if (pid != Py_None) {
3845 if (self->bin) {
3846 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003847 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003848 goto error;
3849 }
3850 else {
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003851 PyObject *pid_str;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003852
3853 pid_str = PyObject_Str(pid);
3854 if (pid_str == NULL)
3855 goto error;
3856
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003857 /* XXX: Should it check whether the pid contains embedded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003858 newlines? */
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003859 if (!PyUnicode_IS_ASCII(pid_str)) {
3860 PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
3861 "persistent IDs in protocol 0 must be "
3862 "ASCII strings");
3863 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003864 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003865 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003866
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003867 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003868 _Pickler_Write(self, PyUnicode_DATA(pid_str),
3869 PyUnicode_GET_LENGTH(pid_str)) < 0 ||
3870 _Pickler_Write(self, "\n", 1) < 0) {
3871 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003872 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003873 }
3874 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003875 }
3876 status = 1;
3877 }
3878
3879 if (0) {
3880 error:
3881 status = -1;
3882 }
3883 Py_XDECREF(pid);
3884
3885 return status;
3886}
3887
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003888static PyObject *
3889get_class(PyObject *obj)
3890{
3891 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003892 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003893
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003894 if (_PyObject_LookupAttrId(obj, &PyId___class__, &cls) == 0) {
3895 cls = (PyObject *) Py_TYPE(obj);
3896 Py_INCREF(cls);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003897 }
3898 return cls;
3899}
3900
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003901/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3902 * appropriate __reduce__ method for obj.
3903 */
3904static int
3905save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3906{
3907 PyObject *callable;
3908 PyObject *argtup;
3909 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003910 PyObject *listitems = Py_None;
3911 PyObject *dictitems = Py_None;
Pierre Glaser65d98d02019-05-08 21:40:25 +02003912 PyObject *state_setter = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003913 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003914 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003915 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003916
3917 const char reduce_op = REDUCE;
3918 const char build_op = BUILD;
3919 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003920 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003921
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003922 size = PyTuple_Size(args);
Pierre Glaser65d98d02019-05-08 21:40:25 +02003923 if (size < 2 || size > 6) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003924 PyErr_SetString(st->PicklingError, "tuple returned by "
Pierre Glaser65d98d02019-05-08 21:40:25 +02003925 "__reduce__ must contain 2 through 6 elements");
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003926 return -1;
3927 }
3928
Pierre Glaser65d98d02019-05-08 21:40:25 +02003929 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 6,
3930 &callable, &argtup, &state, &listitems, &dictitems,
3931 &state_setter))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003932 return -1;
3933
3934 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003935 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003936 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003937 return -1;
3938 }
3939 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003940 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003941 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003942 return -1;
3943 }
3944
3945 if (state == Py_None)
3946 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003947
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003948 if (listitems == Py_None)
3949 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003950 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003951 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003952 "returned by __reduce__ must be an iterator, not %s",
3953 Py_TYPE(listitems)->tp_name);
3954 return -1;
3955 }
3956
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003957 if (dictitems == Py_None)
3958 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003959 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003960 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003961 "returned by __reduce__ must be an iterator, not %s",
3962 Py_TYPE(dictitems)->tp_name);
3963 return -1;
3964 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003965
Pierre Glaser65d98d02019-05-08 21:40:25 +02003966 if (state_setter == Py_None)
3967 state_setter = NULL;
3968 else if (!PyCallable_Check(state_setter)) {
3969 PyErr_Format(st->PicklingError, "sixth element of the tuple "
3970 "returned by __reduce__ must be a function, not %s",
3971 Py_TYPE(state_setter)->tp_name);
3972 return -1;
3973 }
3974
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003975 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003976 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003977 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003978
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003979 if (_PyObject_LookupAttrId(callable, &PyId___name__, &name) < 0) {
3980 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003981 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003982 if (name != NULL && PyUnicode_Check(name)) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003983 _Py_IDENTIFIER(__newobj_ex__);
Serhiy Storchakaf0f35a62017-01-09 10:09:43 +02003984 use_newobj_ex = _PyUnicode_EqualToASCIIId(
3985 name, &PyId___newobj_ex__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003986 if (!use_newobj_ex) {
3987 _Py_IDENTIFIER(__newobj__);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02003988 use_newobj = _PyUnicode_EqualToASCIIId(name, &PyId___newobj__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003989 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003990 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003991 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003992 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003993
3994 if (use_newobj_ex) {
3995 PyObject *cls;
3996 PyObject *args;
3997 PyObject *kwargs;
3998
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003999 if (PyTuple_GET_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004000 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004001 "length of the NEWOBJ_EX argument tuple must be "
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004002 "exactly 3, not %zd", PyTuple_GET_SIZE(argtup));
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004003 return -1;
4004 }
4005
4006 cls = PyTuple_GET_ITEM(argtup, 0);
4007 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004008 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004009 "first item from NEWOBJ_EX argument tuple must "
4010 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
4011 return -1;
4012 }
4013 args = PyTuple_GET_ITEM(argtup, 1);
4014 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004015 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004016 "second item from NEWOBJ_EX argument tuple must "
4017 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
4018 return -1;
4019 }
4020 kwargs = PyTuple_GET_ITEM(argtup, 2);
4021 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004022 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004023 "third item from NEWOBJ_EX argument tuple must "
4024 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
4025 return -1;
4026 }
4027
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004028 if (self->proto >= 4) {
4029 if (save(self, cls, 0) < 0 ||
4030 save(self, args, 0) < 0 ||
4031 save(self, kwargs, 0) < 0 ||
4032 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
4033 return -1;
4034 }
4035 }
4036 else {
4037 PyObject *newargs;
4038 PyObject *cls_new;
4039 Py_ssize_t i;
4040 _Py_IDENTIFIER(__new__);
4041
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004042 newargs = PyTuple_New(PyTuple_GET_SIZE(args) + 2);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004043 if (newargs == NULL)
4044 return -1;
4045
4046 cls_new = _PyObject_GetAttrId(cls, &PyId___new__);
4047 if (cls_new == NULL) {
4048 Py_DECREF(newargs);
4049 return -1;
4050 }
4051 PyTuple_SET_ITEM(newargs, 0, cls_new);
4052 Py_INCREF(cls);
4053 PyTuple_SET_ITEM(newargs, 1, cls);
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004054 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004055 PyObject *item = PyTuple_GET_ITEM(args, i);
4056 Py_INCREF(item);
4057 PyTuple_SET_ITEM(newargs, i + 2, item);
4058 }
4059
4060 callable = PyObject_Call(st->partial, newargs, kwargs);
4061 Py_DECREF(newargs);
4062 if (callable == NULL)
4063 return -1;
4064
4065 newargs = PyTuple_New(0);
4066 if (newargs == NULL) {
4067 Py_DECREF(callable);
4068 return -1;
4069 }
4070
4071 if (save(self, callable, 0) < 0 ||
4072 save(self, newargs, 0) < 0 ||
4073 _Pickler_Write(self, &reduce_op, 1) < 0) {
4074 Py_DECREF(newargs);
4075 Py_DECREF(callable);
4076 return -1;
4077 }
4078 Py_DECREF(newargs);
4079 Py_DECREF(callable);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004080 }
4081 }
4082 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004083 PyObject *cls;
4084 PyObject *newargtup;
4085 PyObject *obj_class;
4086 int p;
4087
4088 /* Sanity checks. */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004089 if (PyTuple_GET_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004090 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004091 return -1;
4092 }
4093
4094 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004095 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004096 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004097 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004098 return -1;
4099 }
4100
4101 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004102 obj_class = get_class(obj);
Zackery Spytz25d38972018-12-05 11:29:20 -07004103 if (obj_class == NULL) {
4104 return -1;
4105 }
4106 p = obj_class != cls;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004107 Py_DECREF(obj_class);
4108 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004109 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004110 "__newobj__ args has the wrong class");
4111 return -1;
4112 }
4113 }
4114 /* XXX: These calls save() are prone to infinite recursion. Imagine
4115 what happen if the value returned by the __reduce__() method of
4116 some extension type contains another object of the same type. Ouch!
4117
4118 Here is a quick example, that I ran into, to illustrate what I
4119 mean:
4120
4121 >>> import pickle, copyreg
4122 >>> copyreg.dispatch_table.pop(complex)
4123 >>> pickle.dumps(1+2j)
4124 Traceback (most recent call last):
4125 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04004126 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004127
4128 Removing the complex class from copyreg.dispatch_table made the
4129 __reduce_ex__() method emit another complex object:
4130
4131 >>> (1+1j).__reduce_ex__(2)
4132 (<function __newobj__ at 0xb7b71c3c>,
4133 (<class 'complex'>, (1+1j)), None, None, None)
4134
4135 Thus when save() was called on newargstup (the 2nd item) recursion
4136 ensued. Of course, the bug was in the complex class which had a
4137 broken __getnewargs__() that emitted another complex object. But,
4138 the point, here, is it is quite easy to end up with a broken reduce
4139 function. */
4140
4141 /* Save the class and its __new__ arguments. */
4142 if (save(self, cls, 0) < 0)
4143 return -1;
4144
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004145 newargtup = PyTuple_GetSlice(argtup, 1, PyTuple_GET_SIZE(argtup));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004146 if (newargtup == NULL)
4147 return -1;
4148
4149 p = save(self, newargtup, 0);
4150 Py_DECREF(newargtup);
4151 if (p < 0)
4152 return -1;
4153
4154 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004155 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004156 return -1;
4157 }
4158 else { /* Not using NEWOBJ. */
4159 if (save(self, callable, 0) < 0 ||
4160 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004161 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004162 return -1;
4163 }
4164
4165 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
4166 the caller do not want to memoize the object. Not particularly useful,
4167 but that is to mimic the behavior save_reduce() in pickle.py when
4168 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004169 if (obj != NULL) {
4170 /* If the object is already in the memo, this means it is
4171 recursive. In this case, throw away everything we put on the
4172 stack, and fetch the object back from the memo. */
4173 if (PyMemoTable_Get(self->memo, obj)) {
4174 const char pop_op = POP;
4175
4176 if (_Pickler_Write(self, &pop_op, 1) < 0)
4177 return -1;
4178 if (memo_get(self, obj) < 0)
4179 return -1;
4180
4181 return 0;
4182 }
4183 else if (memo_put(self, obj) < 0)
4184 return -1;
4185 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004186
4187 if (listitems && batch_list(self, listitems) < 0)
4188 return -1;
4189
4190 if (dictitems && batch_dict(self, dictitems) < 0)
4191 return -1;
4192
4193 if (state) {
Pierre Glaser65d98d02019-05-08 21:40:25 +02004194 if (state_setter == NULL) {
4195 if (save(self, state, 0) < 0 ||
4196 _Pickler_Write(self, &build_op, 1) < 0)
4197 return -1;
4198 }
4199 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004200
Pierre Glaser65d98d02019-05-08 21:40:25 +02004201 /* If a state_setter is specified, call it instead of load_build to
4202 * update obj's with its previous state.
4203 * The first 4 save/write instructions push state_setter and its
4204 * tuple of expected arguments (obj, state) onto the stack. The
4205 * REDUCE opcode triggers the state_setter(obj, state) function
4206 * call. Finally, because state-updating routines only do in-place
4207 * modification, the whole operation has to be stack-transparent.
4208 * Thus, we finally pop the call's output from the stack.*/
4209
4210 const char tupletwo_op = TUPLE2;
4211 const char pop_op = POP;
4212 if (save(self, state_setter, 0) < 0 ||
4213 save(self, obj, 0) < 0 || save(self, state, 0) < 0 ||
4214 _Pickler_Write(self, &tupletwo_op, 1) < 0 ||
4215 _Pickler_Write(self, &reduce_op, 1) < 0 ||
4216 _Pickler_Write(self, &pop_op, 1) < 0)
4217 return -1;
4218 }
4219 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004220 return 0;
4221}
4222
4223static int
4224save(PicklerObject *self, PyObject *obj, int pers_save)
4225{
4226 PyTypeObject *type;
4227 PyObject *reduce_func = NULL;
4228 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004229 int status = 0;
4230
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004231 if (_Pickler_OpcodeBoundary(self) < 0)
4232 return -1;
4233
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004234 /* The extra pers_save argument is necessary to avoid calling save_pers()
4235 on its returned object. */
4236 if (!pers_save && self->pers_func) {
4237 /* save_pers() returns:
4238 -1 to signal an error;
4239 0 if it did nothing successfully;
4240 1 if a persistent id was saved.
4241 */
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004242 if ((status = save_pers(self, obj)) != 0)
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004243 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004244 }
4245
4246 type = Py_TYPE(obj);
4247
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004248 /* The old cPickle had an optimization that used switch-case statement
4249 dispatching on the first letter of the type name. This has was removed
4250 since benchmarks shown that this optimization was actually slowing
4251 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004252
4253 /* Atom types; these aren't memoized, so don't check the memo. */
4254
4255 if (obj == Py_None) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004256 return save_none(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004257 }
4258 else if (obj == Py_False || obj == Py_True) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004259 return save_bool(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004260 }
4261 else if (type == &PyLong_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004262 return save_long(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004263 }
4264 else if (type == &PyFloat_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004265 return save_float(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004266 }
4267
4268 /* Check the memo to see if it has the object. If so, generate
4269 a GET (or BINGET) opcode, instead of pickling the object
4270 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004271 if (PyMemoTable_Get(self->memo, obj)) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004272 return memo_get(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004273 }
4274
4275 if (type == &PyBytes_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004276 return save_bytes(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004277 }
4278 else if (type == &PyUnicode_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004279 return save_unicode(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004280 }
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004281
4282 /* We're only calling Py_EnterRecursiveCall here so that atomic
4283 types above are pickled faster. */
4284 if (Py_EnterRecursiveCall(" while pickling an object")) {
4285 return -1;
4286 }
4287
4288 if (type == &PyDict_Type) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004289 status = save_dict(self, obj);
4290 goto done;
4291 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004292 else if (type == &PySet_Type) {
4293 status = save_set(self, obj);
4294 goto done;
4295 }
4296 else if (type == &PyFrozenSet_Type) {
4297 status = save_frozenset(self, obj);
4298 goto done;
4299 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004300 else if (type == &PyList_Type) {
4301 status = save_list(self, obj);
4302 goto done;
4303 }
4304 else if (type == &PyTuple_Type) {
4305 status = save_tuple(self, obj);
4306 goto done;
4307 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02004308 else if (type == &PyByteArray_Type) {
4309 status = save_bytearray(self, obj);
4310 goto done;
4311 }
4312 else if (type == &PyPickleBuffer_Type) {
4313 status = save_picklebuffer(self, obj);
4314 goto done;
4315 }
Pierre Glaser289f1f82019-05-08 23:08:25 +02004316
4317 /* Now, check reducer_override. If it returns NotImplemented,
4318 * fallback to save_type or save_global, and then perhaps to the
4319 * regular reduction mechanism.
4320 */
4321 if (self->reducer_override != NULL) {
4322 reduce_value = PyObject_CallFunctionObjArgs(self->reducer_override,
4323 obj, NULL);
4324 if (reduce_value == NULL) {
4325 goto error;
4326 }
4327 if (reduce_value != Py_NotImplemented) {
4328 goto reduce;
4329 }
4330 Py_DECREF(reduce_value);
4331 reduce_value = NULL;
4332 }
4333
4334 if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08004335 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004336 goto done;
4337 }
4338 else if (type == &PyFunction_Type) {
4339 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08004340 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004341 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004342
4343 /* XXX: This part needs some unit tests. */
4344
4345 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004346 * self.dispatch_table, copyreg.dispatch_table, the object's
4347 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004348 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004349 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004350 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004351 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
4352 (PyObject *)type);
4353 if (reduce_func == NULL) {
4354 if (PyErr_Occurred()) {
4355 goto error;
4356 }
4357 } else {
4358 /* PyDict_GetItemWithError() returns a borrowed reference.
4359 Increase the reference count to be consistent with
4360 PyObject_GetItem and _PyObject_GetAttrId used below. */
4361 Py_INCREF(reduce_func);
4362 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004363 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004364 reduce_func = PyObject_GetItem(self->dispatch_table,
4365 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004366 if (reduce_func == NULL) {
4367 if (PyErr_ExceptionMatches(PyExc_KeyError))
4368 PyErr_Clear();
4369 else
4370 goto error;
4371 }
4372 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004373 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004374 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004375 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004376 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02004377 else if (PyType_IsSubtype(type, &PyType_Type)) {
4378 status = save_global(self, obj, NULL);
4379 goto done;
4380 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004381 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004382 _Py_IDENTIFIER(__reduce__);
4383 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004384
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004385
4386 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
4387 automatically defined as __reduce__. While this is convenient, this
4388 make it impossible to know which method was actually called. Of
4389 course, this is not a big deal. But still, it would be nice to let
4390 the user know which method was called when something go
4391 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
4392 don't actually have to check for a __reduce__ method. */
4393
4394 /* Check for a __reduce_ex__ method. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004395 if (_PyObject_LookupAttrId(obj, &PyId___reduce_ex__, &reduce_func) < 0) {
4396 goto error;
4397 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004398 if (reduce_func != NULL) {
4399 PyObject *proto;
4400 proto = PyLong_FromLong(self->proto);
4401 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004402 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004403 }
4404 }
4405 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004406 PickleState *st = _Pickle_GetGlobalState();
4407
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004408 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004409 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004410 if (reduce_func != NULL) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02004411 reduce_value = _PyObject_CallNoArg(reduce_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004412 }
4413 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004414 PyErr_Format(st->PicklingError,
4415 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004416 type->tp_name, obj);
4417 goto error;
4418 }
4419 }
4420 }
4421
4422 if (reduce_value == NULL)
4423 goto error;
4424
Pierre Glaser289f1f82019-05-08 23:08:25 +02004425 reduce:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004426 if (PyUnicode_Check(reduce_value)) {
4427 status = save_global(self, obj, reduce_value);
4428 goto done;
4429 }
4430
4431 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004432 PickleState *st = _Pickle_GetGlobalState();
4433 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004434 "__reduce__ must return a string or tuple");
4435 goto error;
4436 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004437
4438 status = save_reduce(self, reduce_value, obj);
4439
4440 if (0) {
4441 error:
4442 status = -1;
4443 }
4444 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004445
Alexandre Vassalottidff18342008-07-13 18:48:30 +00004446 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004447 Py_XDECREF(reduce_func);
4448 Py_XDECREF(reduce_value);
4449
4450 return status;
4451}
4452
4453static int
4454dump(PicklerObject *self, PyObject *obj)
4455{
4456 const char stop_op = STOP;
Pierre Glaser289f1f82019-05-08 23:08:25 +02004457 PyObject *tmp;
4458 _Py_IDENTIFIER(reducer_override);
4459
4460 if (_PyObject_LookupAttrId((PyObject *)self, &PyId_reducer_override,
4461 &tmp) < 0) {
4462 return -1;
4463 }
4464 /* Cache the reducer_override method, if it exists. */
4465 if (tmp != NULL) {
4466 Py_XSETREF(self->reducer_override, tmp);
4467 }
4468 else {
4469 Py_CLEAR(self->reducer_override);
4470 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004471
4472 if (self->proto >= 2) {
4473 char header[2];
4474
4475 header[0] = PROTO;
4476 assert(self->proto >= 0 && self->proto < 256);
4477 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004478 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004479 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004480 if (self->proto >= 4)
4481 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004482 }
4483
4484 if (save(self, obj, 0) < 0 ||
Serhiy Storchakac8695292018-04-04 00:11:27 +03004485 _Pickler_Write(self, &stop_op, 1) < 0 ||
4486 _Pickler_CommitFrame(self) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004487 return -1;
Serhiy Storchakac8695292018-04-04 00:11:27 +03004488 self->framing = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004489 return 0;
4490}
4491
Larry Hastings61272b72014-01-07 12:41:53 -08004492/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004493
4494_pickle.Pickler.clear_memo
4495
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004496Clears the pickler's "memo".
4497
4498The memo is the data structure that remembers which objects the
4499pickler has already seen, so that shared or recursive objects are
4500pickled by reference and not by value. This method is useful when
4501re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08004502[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004503
Larry Hastings3cceb382014-01-04 11:09:09 -08004504static PyObject *
4505_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004506/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004507{
4508 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004509 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004510
4511 Py_RETURN_NONE;
4512}
4513
Larry Hastings61272b72014-01-07 12:41:53 -08004514/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004515
4516_pickle.Pickler.dump
4517
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004518 obj: object
4519 /
4520
4521Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08004522[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004523
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004524static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004525_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08004526/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004527{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004528 /* Check whether the Pickler was initialized correctly (issue3664).
4529 Developers often forget to call __init__() in their subclasses, which
4530 would trigger a segfault without this check. */
4531 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004532 PickleState *st = _Pickle_GetGlobalState();
4533 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004534 "Pickler.__init__() was not called by %s.__init__()",
4535 Py_TYPE(self)->tp_name);
4536 return NULL;
4537 }
4538
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004539 if (_Pickler_ClearBuffer(self) < 0)
4540 return NULL;
4541
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004542 if (dump(self, obj) < 0)
4543 return NULL;
4544
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004545 if (_Pickler_FlushToFile(self) < 0)
4546 return NULL;
4547
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004548 Py_RETURN_NONE;
4549}
4550
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004551/*[clinic input]
4552
4553_pickle.Pickler.__sizeof__ -> Py_ssize_t
4554
4555Returns size in memory, in bytes.
4556[clinic start generated code]*/
4557
4558static Py_ssize_t
4559_pickle_Pickler___sizeof___impl(PicklerObject *self)
4560/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4561{
4562 Py_ssize_t res, s;
4563
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004564 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004565 if (self->memo != NULL) {
4566 res += sizeof(PyMemoTable);
4567 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4568 }
4569 if (self->output_buffer != NULL) {
4570 s = _PySys_GetSizeOf(self->output_buffer);
4571 if (s == -1)
4572 return -1;
4573 res += s;
4574 }
4575 return res;
4576}
4577
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004578static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004579 _PICKLE_PICKLER_DUMP_METHODDEF
4580 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004581 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004582 {NULL, NULL} /* sentinel */
4583};
4584
4585static void
4586Pickler_dealloc(PicklerObject *self)
4587{
4588 PyObject_GC_UnTrack(self);
4589
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004590 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004591 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004592 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004593 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004594 Py_XDECREF(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004595 Py_XDECREF(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004596 Py_XDECREF(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004597
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004598 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004599
4600 Py_TYPE(self)->tp_free((PyObject *)self);
4601}
4602
4603static int
4604Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4605{
4606 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004607 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004608 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004609 Py_VISIT(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004610 Py_VISIT(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004611 Py_VISIT(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004612 return 0;
4613}
4614
4615static int
4616Pickler_clear(PicklerObject *self)
4617{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004618 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004619 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004620 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004621 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004622 Py_CLEAR(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004623 Py_CLEAR(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004624 Py_CLEAR(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004625
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004626 if (self->memo != NULL) {
4627 PyMemoTable *memo = self->memo;
4628 self->memo = NULL;
4629 PyMemoTable_Del(memo);
4630 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004631 return 0;
4632}
4633
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004634
Larry Hastings61272b72014-01-07 12:41:53 -08004635/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004636
4637_pickle.Pickler.__init__
4638
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004639 file: object
4640 protocol: object = NULL
4641 fix_imports: bool = True
Antoine Pitrou91f43802019-05-26 17:10:09 +02004642 buffer_callback: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004643
4644This takes a binary file for writing a pickle data stream.
4645
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004646The optional *protocol* argument tells the pickler to use the given
4647protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4648protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004649
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004650Specifying a negative protocol version selects the highest protocol
4651version supported. The higher the protocol used, the more recent the
4652version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004653
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004654The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004655bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004656writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004657this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004658
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004659If *fix_imports* is True and protocol is less than 3, pickle will try
4660to map the new Python 3 names to the old module names used in Python
46612, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02004662
4663If *buffer_callback* is None (the default), buffer views are
4664serialized into *file* as part of the pickle stream.
4665
4666If *buffer_callback* is not None, then it can be called any number
4667of times with a buffer view. If the callback returns a false value
4668(such as None), the given buffer is out-of-band; otherwise the
4669buffer is serialized in-band, i.e. inside the pickle stream.
4670
4671It is an error if *buffer_callback* is not None and *protocol*
4672is None or smaller than 5.
4673
Larry Hastings61272b72014-01-07 12:41:53 -08004674[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004675
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004676static int
Larry Hastings89964c42015-04-14 18:07:59 -04004677_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
Antoine Pitrou91f43802019-05-26 17:10:09 +02004678 PyObject *protocol, int fix_imports,
4679 PyObject *buffer_callback)
4680/*[clinic end generated code: output=0abedc50590d259b input=9a43a1c50ab91652]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004681{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004682 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004683 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004684
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004685 /* In case of multiple __init__() calls, clear previous content. */
4686 if (self->write != NULL)
4687 (void)Pickler_clear(self);
4688
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004689 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004690 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004691
4692 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004693 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004694
Antoine Pitrou91f43802019-05-26 17:10:09 +02004695 if (_Pickler_SetBufferCallback(self, buffer_callback) < 0)
4696 return -1;
4697
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004698 /* memo and output_buffer may have already been created in _Pickler_New */
4699 if (self->memo == NULL) {
4700 self->memo = PyMemoTable_New();
4701 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004702 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004703 }
4704 self->output_len = 0;
4705 if (self->output_buffer == NULL) {
4706 self->max_output_len = WRITE_BUF_SIZE;
4707 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4708 self->max_output_len);
4709 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004710 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004711 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004712
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004713 self->fast = 0;
4714 self->fast_nesting = 0;
4715 self->fast_memo = NULL;
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004716
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004717 if (init_method_ref((PyObject *)self, &PyId_persistent_id,
4718 &self->pers_func, &self->pers_func_self) < 0)
4719 {
4720 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004721 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004722
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004723 if (_PyObject_LookupAttrId((PyObject *)self,
4724 &PyId_dispatch_table, &self->dispatch_table) < 0) {
4725 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004726 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004727
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004728 return 0;
4729}
4730
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004731
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004732/* Define a proxy object for the Pickler's internal memo object. This is to
4733 * avoid breaking code like:
4734 * pickler.memo.clear()
4735 * and
4736 * pickler.memo = saved_memo
4737 * Is this a good idea? Not really, but we don't want to break code that uses
4738 * it. Note that we don't implement the entire mapping API here. This is
4739 * intentional, as these should be treated as black-box implementation details.
4740 */
4741
Larry Hastings61272b72014-01-07 12:41:53 -08004742/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004743_pickle.PicklerMemoProxy.clear
4744
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004745Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004746[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004747
Larry Hastings3cceb382014-01-04 11:09:09 -08004748static PyObject *
4749_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004750/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004751{
4752 if (self->pickler->memo)
4753 PyMemoTable_Clear(self->pickler->memo);
4754 Py_RETURN_NONE;
4755}
4756
Larry Hastings61272b72014-01-07 12:41:53 -08004757/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004758_pickle.PicklerMemoProxy.copy
4759
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004760Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004761[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004762
Larry Hastings3cceb382014-01-04 11:09:09 -08004763static PyObject *
4764_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004765/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004766{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004767 PyMemoTable *memo;
4768 PyObject *new_memo = PyDict_New();
4769 if (new_memo == NULL)
4770 return NULL;
4771
4772 memo = self->pickler->memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -07004773 for (size_t i = 0; i < memo->mt_allocated; ++i) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004774 PyMemoEntry entry = memo->mt_table[i];
4775 if (entry.me_key != NULL) {
4776 int status;
4777 PyObject *key, *value;
4778
4779 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004780 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004781
4782 if (key == NULL || value == NULL) {
4783 Py_XDECREF(key);
4784 Py_XDECREF(value);
4785 goto error;
4786 }
4787 status = PyDict_SetItem(new_memo, key, value);
4788 Py_DECREF(key);
4789 Py_DECREF(value);
4790 if (status < 0)
4791 goto error;
4792 }
4793 }
4794 return new_memo;
4795
4796 error:
4797 Py_XDECREF(new_memo);
4798 return NULL;
4799}
4800
Larry Hastings61272b72014-01-07 12:41:53 -08004801/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004802_pickle.PicklerMemoProxy.__reduce__
4803
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004804Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004805[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004806
Larry Hastings3cceb382014-01-04 11:09:09 -08004807static PyObject *
4808_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004809/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004810{
4811 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004812 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004813 if (contents == NULL)
4814 return NULL;
4815
4816 reduce_value = PyTuple_New(2);
4817 if (reduce_value == NULL) {
4818 Py_DECREF(contents);
4819 return NULL;
4820 }
4821 dict_args = PyTuple_New(1);
4822 if (dict_args == NULL) {
4823 Py_DECREF(contents);
4824 Py_DECREF(reduce_value);
4825 return NULL;
4826 }
4827 PyTuple_SET_ITEM(dict_args, 0, contents);
4828 Py_INCREF((PyObject *)&PyDict_Type);
4829 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4830 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4831 return reduce_value;
4832}
4833
4834static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004835 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4836 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4837 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004838 {NULL, NULL} /* sentinel */
4839};
4840
4841static void
4842PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4843{
4844 PyObject_GC_UnTrack(self);
4845 Py_XDECREF(self->pickler);
4846 PyObject_GC_Del((PyObject *)self);
4847}
4848
4849static int
4850PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4851 visitproc visit, void *arg)
4852{
4853 Py_VISIT(self->pickler);
4854 return 0;
4855}
4856
4857static int
4858PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4859{
4860 Py_CLEAR(self->pickler);
4861 return 0;
4862}
4863
4864static PyTypeObject PicklerMemoProxyType = {
4865 PyVarObject_HEAD_INIT(NULL, 0)
4866 "_pickle.PicklerMemoProxy", /*tp_name*/
4867 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4868 0,
4869 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4870 0, /* tp_print */
4871 0, /* tp_getattr */
4872 0, /* tp_setattr */
4873 0, /* tp_compare */
4874 0, /* tp_repr */
4875 0, /* tp_as_number */
4876 0, /* tp_as_sequence */
4877 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004878 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004879 0, /* tp_call */
4880 0, /* tp_str */
4881 PyObject_GenericGetAttr, /* tp_getattro */
4882 PyObject_GenericSetAttr, /* tp_setattro */
4883 0, /* tp_as_buffer */
4884 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4885 0, /* tp_doc */
4886 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4887 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4888 0, /* tp_richcompare */
4889 0, /* tp_weaklistoffset */
4890 0, /* tp_iter */
4891 0, /* tp_iternext */
4892 picklerproxy_methods, /* tp_methods */
4893};
4894
4895static PyObject *
4896PicklerMemoProxy_New(PicklerObject *pickler)
4897{
4898 PicklerMemoProxyObject *self;
4899
4900 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4901 if (self == NULL)
4902 return NULL;
4903 Py_INCREF(pickler);
4904 self->pickler = pickler;
4905 PyObject_GC_Track(self);
4906 return (PyObject *)self;
4907}
4908
4909/*****************************************************************************/
4910
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004911static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004912Pickler_get_memo(PicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004913{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004914 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004915}
4916
4917static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004918Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004919{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004920 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004921
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004922 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004923 PyErr_SetString(PyExc_TypeError,
4924 "attribute deletion is not supported");
4925 return -1;
4926 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004927
4928 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4929 PicklerObject *pickler =
4930 ((PicklerMemoProxyObject *)obj)->pickler;
4931
4932 new_memo = PyMemoTable_Copy(pickler->memo);
4933 if (new_memo == NULL)
4934 return -1;
4935 }
4936 else if (PyDict_Check(obj)) {
4937 Py_ssize_t i = 0;
4938 PyObject *key, *value;
4939
4940 new_memo = PyMemoTable_New();
4941 if (new_memo == NULL)
4942 return -1;
4943
4944 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004945 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004946 PyObject *memo_obj;
4947
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004948 if (!PyTuple_Check(value) || PyTuple_GET_SIZE(value) != 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004949 PyErr_SetString(PyExc_TypeError,
4950 "'memo' values must be 2-item tuples");
4951 goto error;
4952 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004953 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004954 if (memo_id == -1 && PyErr_Occurred())
4955 goto error;
4956 memo_obj = PyTuple_GET_ITEM(value, 1);
4957 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4958 goto error;
4959 }
4960 }
4961 else {
4962 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02004963 "'memo' attribute must be a PicklerMemoProxy object "
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004964 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004965 return -1;
4966 }
4967
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004968 PyMemoTable_Del(self->memo);
4969 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004970
4971 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004972
4973 error:
4974 if (new_memo)
4975 PyMemoTable_Del(new_memo);
4976 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004977}
4978
4979static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004980Pickler_get_persid(PicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004981{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004982 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004983 PyErr_SetString(PyExc_AttributeError, "persistent_id");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004984 return NULL;
4985 }
4986 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004987}
4988
4989static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004990Pickler_set_persid(PicklerObject *self, PyObject *value, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004991{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004992 if (value == NULL) {
4993 PyErr_SetString(PyExc_TypeError,
4994 "attribute deletion is not supported");
4995 return -1;
4996 }
4997 if (!PyCallable_Check(value)) {
4998 PyErr_SetString(PyExc_TypeError,
4999 "persistent_id must be a callable taking one argument");
5000 return -1;
5001 }
5002
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005003 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005004 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03005005 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005006
5007 return 0;
5008}
5009
5010static PyMemberDef Pickler_members[] = {
5011 {"bin", T_INT, offsetof(PicklerObject, bin)},
5012 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01005013 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005014 {NULL}
5015};
5016
5017static PyGetSetDef Pickler_getsets[] = {
5018 {"memo", (getter)Pickler_get_memo,
5019 (setter)Pickler_set_memo},
5020 {"persistent_id", (getter)Pickler_get_persid,
5021 (setter)Pickler_set_persid},
5022 {NULL}
5023};
5024
5025static PyTypeObject Pickler_Type = {
5026 PyVarObject_HEAD_INIT(NULL, 0)
5027 "_pickle.Pickler" , /*tp_name*/
5028 sizeof(PicklerObject), /*tp_basicsize*/
5029 0, /*tp_itemsize*/
5030 (destructor)Pickler_dealloc, /*tp_dealloc*/
5031 0, /*tp_print*/
5032 0, /*tp_getattr*/
5033 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00005034 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005035 0, /*tp_repr*/
5036 0, /*tp_as_number*/
5037 0, /*tp_as_sequence*/
5038 0, /*tp_as_mapping*/
5039 0, /*tp_hash*/
5040 0, /*tp_call*/
5041 0, /*tp_str*/
5042 0, /*tp_getattro*/
5043 0, /*tp_setattro*/
5044 0, /*tp_as_buffer*/
5045 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08005046 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005047 (traverseproc)Pickler_traverse, /*tp_traverse*/
5048 (inquiry)Pickler_clear, /*tp_clear*/
5049 0, /*tp_richcompare*/
5050 0, /*tp_weaklistoffset*/
5051 0, /*tp_iter*/
5052 0, /*tp_iternext*/
5053 Pickler_methods, /*tp_methods*/
5054 Pickler_members, /*tp_members*/
5055 Pickler_getsets, /*tp_getset*/
5056 0, /*tp_base*/
5057 0, /*tp_dict*/
5058 0, /*tp_descr_get*/
5059 0, /*tp_descr_set*/
5060 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08005061 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005062 PyType_GenericAlloc, /*tp_alloc*/
5063 PyType_GenericNew, /*tp_new*/
5064 PyObject_GC_Del, /*tp_free*/
5065 0, /*tp_is_gc*/
5066};
5067
Victor Stinner121aab42011-09-29 23:40:53 +02005068/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005069
5070 XXX: It would be nice to able to avoid Python function call overhead, by
5071 using directly the C version of find_class(), when find_class() is not
5072 overridden by a subclass. Although, this could become rather hackish. A
5073 simpler optimization would be to call the C function when self is not a
5074 subclass instance. */
5075static PyObject *
5076find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
5077{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005078 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005079
Victor Stinner55ba38a2016-12-09 16:09:30 +01005080 return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_find_class,
5081 module_name, global_name, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005082}
5083
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005084static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005085marker(UnpicklerObject *self)
5086{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005087 Py_ssize_t mark;
5088
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005089 if (self->num_marks < 1) {
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005090 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005091 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005092 return -1;
5093 }
5094
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005095 mark = self->marks[--self->num_marks];
5096 self->stack->mark_set = self->num_marks != 0;
5097 self->stack->fence = self->num_marks ?
5098 self->marks[self->num_marks - 1] : 0;
5099 return mark;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005100}
5101
5102static int
5103load_none(UnpicklerObject *self)
5104{
5105 PDATA_APPEND(self->stack, Py_None, -1);
5106 return 0;
5107}
5108
5109static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005110load_int(UnpicklerObject *self)
5111{
5112 PyObject *value;
5113 char *endptr, *s;
5114 Py_ssize_t len;
5115 long x;
5116
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005117 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005118 return -1;
5119 if (len < 2)
5120 return bad_readline();
5121
5122 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005123 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005124 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005125 x = strtol(s, &endptr, 0);
5126
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005127 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005128 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03005129 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005130 errno = 0;
5131 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005132 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005133 if (value == NULL) {
5134 PyErr_SetString(PyExc_ValueError,
5135 "could not convert string to int");
5136 return -1;
5137 }
5138 }
5139 else {
5140 if (len == 3 && (x == 0 || x == 1)) {
5141 if ((value = PyBool_FromLong(x)) == NULL)
5142 return -1;
5143 }
5144 else {
5145 if ((value = PyLong_FromLong(x)) == NULL)
5146 return -1;
5147 }
5148 }
5149
5150 PDATA_PUSH(self->stack, value, -1);
5151 return 0;
5152}
5153
5154static int
5155load_bool(UnpicklerObject *self, PyObject *boolean)
5156{
5157 assert(boolean == Py_True || boolean == Py_False);
5158 PDATA_APPEND(self->stack, boolean, -1);
5159 return 0;
5160}
5161
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005162/* s contains x bytes of an unsigned little-endian integer. Return its value
5163 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
5164 */
5165static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005166calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005167{
5168 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005169 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005170 size_t x = 0;
5171
Serhiy Storchakae0606192015-09-29 22:10:07 +03005172 if (nbytes > (int)sizeof(size_t)) {
5173 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
5174 * have 64-bit size that can't be represented on 32-bit platform.
5175 */
5176 for (i = (int)sizeof(size_t); i < nbytes; i++) {
5177 if (s[i])
5178 return -1;
5179 }
5180 nbytes = (int)sizeof(size_t);
5181 }
5182 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005183 x |= (size_t) s[i] << (8 * i);
5184 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005185
5186 if (x > PY_SSIZE_T_MAX)
5187 return -1;
5188 else
5189 return (Py_ssize_t) x;
5190}
5191
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005192/* s contains x bytes of a little-endian integer. Return its value as a
5193 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03005194 * int, but when x is 4 it's a signed one. This is a historical source
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005195 * of x-platform bugs.
5196 */
5197static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005198calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005199{
5200 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02005201 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005202 long x = 0;
5203
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005204 for (i = 0; i < nbytes; i++) {
5205 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005206 }
5207
5208 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
5209 * is signed, so on a box with longs bigger than 4 bytes we need
5210 * to extend a BININT's sign bit to the full width.
5211 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005212 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005213 x |= -(x & (1L << 31));
5214 }
5215
5216 return x;
5217}
5218
5219static int
5220load_binintx(UnpicklerObject *self, char *s, int size)
5221{
5222 PyObject *value;
5223 long x;
5224
5225 x = calc_binint(s, size);
5226
5227 if ((value = PyLong_FromLong(x)) == NULL)
5228 return -1;
5229
5230 PDATA_PUSH(self->stack, value, -1);
5231 return 0;
5232}
5233
5234static int
5235load_binint(UnpicklerObject *self)
5236{
5237 char *s;
5238
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005239 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005240 return -1;
5241
5242 return load_binintx(self, s, 4);
5243}
5244
5245static int
5246load_binint1(UnpicklerObject *self)
5247{
5248 char *s;
5249
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005250 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005251 return -1;
5252
5253 return load_binintx(self, s, 1);
5254}
5255
5256static int
5257load_binint2(UnpicklerObject *self)
5258{
5259 char *s;
5260
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005261 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005262 return -1;
5263
5264 return load_binintx(self, s, 2);
5265}
5266
5267static int
5268load_long(UnpicklerObject *self)
5269{
5270 PyObject *value;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005271 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005272 Py_ssize_t len;
5273
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005274 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005275 return -1;
5276 if (len < 2)
5277 return bad_readline();
5278
Mark Dickinson8dd05142009-01-20 20:43:58 +00005279 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
5280 the 'L' before calling PyLong_FromString. In order to maintain
5281 compatibility with Python 3.0.0, we don't actually *require*
5282 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005283 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00005284 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00005285 /* XXX: Should the base argument explicitly set to 10? */
5286 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00005287 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005288 return -1;
5289
5290 PDATA_PUSH(self->stack, value, -1);
5291 return 0;
5292}
5293
5294/* 'size' bytes contain the # of bytes of little-endian 256's-complement
5295 * data following.
5296 */
5297static int
5298load_counted_long(UnpicklerObject *self, int size)
5299{
5300 PyObject *value;
5301 char *nbytes;
5302 char *pdata;
5303
5304 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005305 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005306 return -1;
5307
5308 size = calc_binint(nbytes, size);
5309 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005310 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005311 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005312 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005313 "LONG pickle has negative byte count");
5314 return -1;
5315 }
5316
5317 if (size == 0)
5318 value = PyLong_FromLong(0L);
5319 else {
5320 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005321 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005322 return -1;
5323 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
5324 1 /* little endian */ , 1 /* signed */ );
5325 }
5326 if (value == NULL)
5327 return -1;
5328 PDATA_PUSH(self->stack, value, -1);
5329 return 0;
5330}
5331
5332static int
5333load_float(UnpicklerObject *self)
5334{
5335 PyObject *value;
5336 char *endptr, *s;
5337 Py_ssize_t len;
5338 double d;
5339
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005340 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005341 return -1;
5342 if (len < 2)
5343 return bad_readline();
5344
5345 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00005346 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
5347 if (d == -1.0 && PyErr_Occurred())
5348 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005349 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005350 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
5351 return -1;
5352 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00005353 value = PyFloat_FromDouble(d);
5354 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005355 return -1;
5356
5357 PDATA_PUSH(self->stack, value, -1);
5358 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005359}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005360
5361static int
5362load_binfloat(UnpicklerObject *self)
5363{
5364 PyObject *value;
5365 double x;
5366 char *s;
5367
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005368 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005369 return -1;
5370
5371 x = _PyFloat_Unpack8((unsigned char *)s, 0);
5372 if (x == -1.0 && PyErr_Occurred())
5373 return -1;
5374
5375 if ((value = PyFloat_FromDouble(x)) == NULL)
5376 return -1;
5377
5378 PDATA_PUSH(self->stack, value, -1);
5379 return 0;
5380}
5381
5382static int
5383load_string(UnpicklerObject *self)
5384{
5385 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005386 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005387 Py_ssize_t len;
5388 char *s, *p;
5389
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005390 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005391 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005392 /* Strip the newline */
5393 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005394 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005395 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005396 p = s + 1;
5397 len -= 2;
5398 }
5399 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005400 PickleState *st = _Pickle_GetGlobalState();
5401 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005402 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005403 return -1;
5404 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005405 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005406
5407 /* Use the PyBytes API to decode the string, since that is what is used
5408 to encode, and then coerce the result to Unicode. */
5409 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005410 if (bytes == NULL)
5411 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005412
5413 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
5414 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5415 if (strcmp(self->encoding, "bytes") == 0) {
5416 obj = bytes;
5417 }
5418 else {
5419 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
5420 Py_DECREF(bytes);
5421 if (obj == NULL) {
5422 return -1;
5423 }
5424 }
5425
5426 PDATA_PUSH(self->stack, obj, -1);
5427 return 0;
5428}
5429
5430static int
5431load_counted_binstring(UnpicklerObject *self, int nbytes)
5432{
5433 PyObject *obj;
5434 Py_ssize_t size;
5435 char *s;
5436
5437 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005438 return -1;
5439
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005440 size = calc_binsize(s, nbytes);
5441 if (size < 0) {
5442 PickleState *st = _Pickle_GetGlobalState();
5443 PyErr_Format(st->UnpicklingError,
5444 "BINSTRING exceeds system's maximum size of %zd bytes",
5445 PY_SSIZE_T_MAX);
5446 return -1;
5447 }
5448
5449 if (_Unpickler_Read(self, &s, size) < 0)
5450 return -1;
5451
5452 /* Convert Python 2.x strings to bytes if the *encoding* given to the
5453 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5454 if (strcmp(self->encoding, "bytes") == 0) {
5455 obj = PyBytes_FromStringAndSize(s, size);
5456 }
5457 else {
5458 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
5459 }
5460 if (obj == NULL) {
5461 return -1;
5462 }
5463
5464 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005465 return 0;
5466}
5467
5468static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005469load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005470{
5471 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005472 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005473 char *s;
5474
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005475 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005476 return -1;
5477
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005478 size = calc_binsize(s, nbytes);
5479 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005480 PyErr_Format(PyExc_OverflowError,
5481 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005482 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005483 return -1;
5484 }
5485
Antoine Pitrou91f43802019-05-26 17:10:09 +02005486 bytes = PyBytes_FromStringAndSize(NULL, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005487 if (bytes == NULL)
5488 return -1;
Antoine Pitrou91f43802019-05-26 17:10:09 +02005489 if (_Unpickler_ReadInto(self, PyBytes_AS_STRING(bytes), size) < 0) {
5490 Py_DECREF(bytes);
5491 return -1;
5492 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005493
5494 PDATA_PUSH(self->stack, bytes, -1);
5495 return 0;
5496}
5497
5498static int
Antoine Pitrou91f43802019-05-26 17:10:09 +02005499load_counted_bytearray(UnpicklerObject *self)
5500{
5501 PyObject *bytearray;
5502 Py_ssize_t size;
5503 char *s;
5504
5505 if (_Unpickler_Read(self, &s, 8) < 0) {
5506 return -1;
5507 }
5508
5509 size = calc_binsize(s, 8);
5510 if (size < 0) {
5511 PyErr_Format(PyExc_OverflowError,
5512 "BYTEARRAY8 exceeds system's maximum size of %zd bytes",
5513 PY_SSIZE_T_MAX);
5514 return -1;
5515 }
5516
5517 bytearray = PyByteArray_FromStringAndSize(NULL, size);
5518 if (bytearray == NULL) {
5519 return -1;
5520 }
5521 if (_Unpickler_ReadInto(self, PyByteArray_AS_STRING(bytearray), size) < 0) {
5522 Py_DECREF(bytearray);
5523 return -1;
5524 }
5525
5526 PDATA_PUSH(self->stack, bytearray, -1);
5527 return 0;
5528}
5529
5530static int
5531load_next_buffer(UnpicklerObject *self)
5532{
5533 if (self->buffers == NULL) {
5534 PickleState *st = _Pickle_GetGlobalState();
5535 PyErr_SetString(st->UnpicklingError,
5536 "pickle stream refers to out-of-band data "
5537 "but no *buffers* argument was given");
5538 return -1;
5539 }
5540 PyObject *buf = PyIter_Next(self->buffers);
5541 if (buf == NULL) {
5542 if (!PyErr_Occurred()) {
5543 PickleState *st = _Pickle_GetGlobalState();
5544 PyErr_SetString(st->UnpicklingError,
5545 "not enough out-of-band buffers");
5546 }
5547 return -1;
5548 }
5549
5550 PDATA_PUSH(self->stack, buf, -1);
5551 return 0;
5552}
5553
5554static int
5555load_readonly_buffer(UnpicklerObject *self)
5556{
5557 Py_ssize_t len = Py_SIZE(self->stack);
5558 if (len <= self->stack->fence) {
5559 return Pdata_stack_underflow(self->stack);
5560 }
5561
5562 PyObject *obj = self->stack->data[len - 1];
5563 PyObject *view = PyMemoryView_FromObject(obj);
5564 if (view == NULL) {
5565 return -1;
5566 }
5567 if (!PyMemoryView_GET_BUFFER(view)->readonly) {
5568 /* Original object is writable */
5569 PyMemoryView_GET_BUFFER(view)->readonly = 1;
5570 self->stack->data[len - 1] = view;
5571 Py_DECREF(obj);
5572 }
5573 else {
5574 /* Original object is read-only, no need to replace it */
5575 Py_DECREF(view);
5576 }
5577 return 0;
5578}
5579
5580static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005581load_unicode(UnpicklerObject *self)
5582{
5583 PyObject *str;
5584 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005585 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005586
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005587 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005588 return -1;
5589 if (len < 1)
5590 return bad_readline();
5591
5592 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
5593 if (str == NULL)
5594 return -1;
5595
5596 PDATA_PUSH(self->stack, str, -1);
5597 return 0;
5598}
5599
5600static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005601load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005602{
5603 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005604 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005605 char *s;
5606
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005607 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005608 return -1;
5609
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005610 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005611 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005612 PyErr_Format(PyExc_OverflowError,
5613 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005614 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005615 return -1;
5616 }
5617
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005618 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005619 return -1;
5620
Victor Stinner485fb562010-04-13 11:07:24 +00005621 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005622 if (str == NULL)
5623 return -1;
5624
5625 PDATA_PUSH(self->stack, str, -1);
5626 return 0;
5627}
5628
5629static int
Victor Stinner21b47112016-03-14 18:09:39 +01005630load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005631{
5632 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005633
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005634 if (Py_SIZE(self->stack) < len)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005635 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005636
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005637 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005638 if (tuple == NULL)
5639 return -1;
5640 PDATA_PUSH(self->stack, tuple, -1);
5641 return 0;
5642}
5643
5644static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005645load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005646{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005647 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005648
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005649 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005650 return -1;
5651
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005652 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005653}
5654
5655static int
5656load_empty_list(UnpicklerObject *self)
5657{
5658 PyObject *list;
5659
5660 if ((list = PyList_New(0)) == NULL)
5661 return -1;
5662 PDATA_PUSH(self->stack, list, -1);
5663 return 0;
5664}
5665
5666static int
5667load_empty_dict(UnpicklerObject *self)
5668{
5669 PyObject *dict;
5670
5671 if ((dict = PyDict_New()) == NULL)
5672 return -1;
5673 PDATA_PUSH(self->stack, dict, -1);
5674 return 0;
5675}
5676
5677static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005678load_empty_set(UnpicklerObject *self)
5679{
5680 PyObject *set;
5681
5682 if ((set = PySet_New(NULL)) == NULL)
5683 return -1;
5684 PDATA_PUSH(self->stack, set, -1);
5685 return 0;
5686}
5687
5688static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005689load_list(UnpicklerObject *self)
5690{
5691 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005692 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005693
5694 if ((i = marker(self)) < 0)
5695 return -1;
5696
5697 list = Pdata_poplist(self->stack, i);
5698 if (list == NULL)
5699 return -1;
5700 PDATA_PUSH(self->stack, list, -1);
5701 return 0;
5702}
5703
5704static int
5705load_dict(UnpicklerObject *self)
5706{
5707 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005708 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005709
5710 if ((i = marker(self)) < 0)
5711 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005712 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005713
5714 if ((dict = PyDict_New()) == NULL)
5715 return -1;
5716
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005717 if ((j - i) % 2 != 0) {
5718 PickleState *st = _Pickle_GetGlobalState();
5719 PyErr_SetString(st->UnpicklingError, "odd number of items for DICT");
Serhiy Storchaka3ac53802015-12-07 11:32:00 +02005720 Py_DECREF(dict);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005721 return -1;
5722 }
5723
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005724 for (k = i + 1; k < j; k += 2) {
5725 key = self->stack->data[k - 1];
5726 value = self->stack->data[k];
5727 if (PyDict_SetItem(dict, key, value) < 0) {
5728 Py_DECREF(dict);
5729 return -1;
5730 }
5731 }
5732 Pdata_clear(self->stack, i);
5733 PDATA_PUSH(self->stack, dict, -1);
5734 return 0;
5735}
5736
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005737static int
5738load_frozenset(UnpicklerObject *self)
5739{
5740 PyObject *items;
5741 PyObject *frozenset;
5742 Py_ssize_t i;
5743
5744 if ((i = marker(self)) < 0)
5745 return -1;
5746
5747 items = Pdata_poptuple(self->stack, i);
5748 if (items == NULL)
5749 return -1;
5750
5751 frozenset = PyFrozenSet_New(items);
5752 Py_DECREF(items);
5753 if (frozenset == NULL)
5754 return -1;
5755
5756 PDATA_PUSH(self->stack, frozenset, -1);
5757 return 0;
5758}
5759
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005760static PyObject *
5761instantiate(PyObject *cls, PyObject *args)
5762{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005763 /* Caller must assure args are a tuple. Normally, args come from
5764 Pdata_poptuple which packs objects from the top of the stack
5765 into a newly created tuple. */
5766 assert(PyTuple_Check(args));
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005767 if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
5768 _Py_IDENTIFIER(__getinitargs__);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005769 _Py_IDENTIFIER(__new__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005770 PyObject *func;
5771 if (_PyObject_LookupAttrId(cls, &PyId___getinitargs__, &func) < 0) {
5772 return NULL;
5773 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005774 if (func == NULL) {
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005775 return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
5776 }
5777 Py_DECREF(func);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005778 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005779 return PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005780}
5781
5782static int
5783load_obj(UnpicklerObject *self)
5784{
5785 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005786 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005787
5788 if ((i = marker(self)) < 0)
5789 return -1;
5790
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005791 if (Py_SIZE(self->stack) - i < 1)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005792 return Pdata_stack_underflow(self->stack);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005793
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005794 args = Pdata_poptuple(self->stack, i + 1);
5795 if (args == NULL)
5796 return -1;
5797
5798 PDATA_POP(self->stack, cls);
5799 if (cls) {
5800 obj = instantiate(cls, args);
5801 Py_DECREF(cls);
5802 }
5803 Py_DECREF(args);
5804 if (obj == NULL)
5805 return -1;
5806
5807 PDATA_PUSH(self->stack, obj, -1);
5808 return 0;
5809}
5810
5811static int
5812load_inst(UnpicklerObject *self)
5813{
5814 PyObject *cls = NULL;
5815 PyObject *args = NULL;
5816 PyObject *obj = NULL;
5817 PyObject *module_name;
5818 PyObject *class_name;
5819 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005820 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005821 char *s;
5822
5823 if ((i = marker(self)) < 0)
5824 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005825 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005826 return -1;
5827 if (len < 2)
5828 return bad_readline();
5829
5830 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5831 identifiers are permitted in Python 3.0, since the INST opcode is only
5832 supported by older protocols on Python 2.x. */
5833 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5834 if (module_name == NULL)
5835 return -1;
5836
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005837 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005838 if (len < 2) {
5839 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005840 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005841 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005842 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005843 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005844 cls = find_class(self, module_name, class_name);
5845 Py_DECREF(class_name);
5846 }
5847 }
5848 Py_DECREF(module_name);
5849
5850 if (cls == NULL)
5851 return -1;
5852
5853 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5854 obj = instantiate(cls, args);
5855 Py_DECREF(args);
5856 }
5857 Py_DECREF(cls);
5858
5859 if (obj == NULL)
5860 return -1;
5861
5862 PDATA_PUSH(self->stack, obj, -1);
5863 return 0;
5864}
5865
5866static int
5867load_newobj(UnpicklerObject *self)
5868{
5869 PyObject *args = NULL;
5870 PyObject *clsraw = NULL;
5871 PyTypeObject *cls; /* clsraw cast to its true type */
5872 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005873 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005874
5875 /* Stack is ... cls argtuple, and we want to call
5876 * cls.__new__(cls, *argtuple).
5877 */
5878 PDATA_POP(self->stack, args);
5879 if (args == NULL)
5880 goto error;
5881 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005882 PyErr_SetString(st->UnpicklingError,
5883 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005884 goto error;
5885 }
5886
5887 PDATA_POP(self->stack, clsraw);
5888 cls = (PyTypeObject *)clsraw;
5889 if (cls == NULL)
5890 goto error;
5891 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005892 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005893 "isn't a type object");
5894 goto error;
5895 }
5896 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005897 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005898 "has NULL tp_new");
5899 goto error;
5900 }
5901
5902 /* Call __new__. */
5903 obj = cls->tp_new(cls, args, NULL);
5904 if (obj == NULL)
5905 goto error;
5906
5907 Py_DECREF(args);
5908 Py_DECREF(clsraw);
5909 PDATA_PUSH(self->stack, obj, -1);
5910 return 0;
5911
5912 error:
5913 Py_XDECREF(args);
5914 Py_XDECREF(clsraw);
5915 return -1;
5916}
5917
5918static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005919load_newobj_ex(UnpicklerObject *self)
5920{
5921 PyObject *cls, *args, *kwargs;
5922 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005923 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005924
5925 PDATA_POP(self->stack, kwargs);
5926 if (kwargs == NULL) {
5927 return -1;
5928 }
5929 PDATA_POP(self->stack, args);
5930 if (args == NULL) {
5931 Py_DECREF(kwargs);
5932 return -1;
5933 }
5934 PDATA_POP(self->stack, cls);
5935 if (cls == NULL) {
5936 Py_DECREF(kwargs);
5937 Py_DECREF(args);
5938 return -1;
5939 }
Larry Hastings61272b72014-01-07 12:41:53 -08005940
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005941 if (!PyType_Check(cls)) {
5942 Py_DECREF(kwargs);
5943 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005944 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005945 "NEWOBJ_EX class argument must be a type, not %.200s",
5946 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005947 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005948 return -1;
5949 }
5950
5951 if (((PyTypeObject *)cls)->tp_new == NULL) {
5952 Py_DECREF(kwargs);
5953 Py_DECREF(args);
5954 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005955 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005956 "NEWOBJ_EX class argument doesn't have __new__");
5957 return -1;
5958 }
5959 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5960 Py_DECREF(kwargs);
5961 Py_DECREF(args);
5962 Py_DECREF(cls);
5963 if (obj == NULL) {
5964 return -1;
5965 }
5966 PDATA_PUSH(self->stack, obj, -1);
5967 return 0;
5968}
5969
5970static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005971load_global(UnpicklerObject *self)
5972{
5973 PyObject *global = NULL;
5974 PyObject *module_name;
5975 PyObject *global_name;
5976 Py_ssize_t len;
5977 char *s;
5978
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005979 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005980 return -1;
5981 if (len < 2)
5982 return bad_readline();
5983 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5984 if (!module_name)
5985 return -1;
5986
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005987 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005988 if (len < 2) {
5989 Py_DECREF(module_name);
5990 return bad_readline();
5991 }
5992 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5993 if (global_name) {
5994 global = find_class(self, module_name, global_name);
5995 Py_DECREF(global_name);
5996 }
5997 }
5998 Py_DECREF(module_name);
5999
6000 if (global == NULL)
6001 return -1;
6002 PDATA_PUSH(self->stack, global, -1);
6003 return 0;
6004}
6005
6006static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006007load_stack_global(UnpicklerObject *self)
6008{
6009 PyObject *global;
6010 PyObject *module_name;
6011 PyObject *global_name;
6012
6013 PDATA_POP(self->stack, global_name);
6014 PDATA_POP(self->stack, module_name);
6015 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
6016 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006017 PickleState *st = _Pickle_GetGlobalState();
6018 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006019 Py_XDECREF(global_name);
6020 Py_XDECREF(module_name);
6021 return -1;
6022 }
6023 global = find_class(self, module_name, global_name);
6024 Py_DECREF(global_name);
6025 Py_DECREF(module_name);
6026 if (global == NULL)
6027 return -1;
6028 PDATA_PUSH(self->stack, global, -1);
6029 return 0;
6030}
6031
6032static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006033load_persid(UnpicklerObject *self)
6034{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006035 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006036 Py_ssize_t len;
6037 char *s;
6038
6039 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006040 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006041 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08006042 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006043 return bad_readline();
6044
Serhiy Storchakadec25af2016-07-17 11:24:17 +03006045 pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
6046 if (pid == NULL) {
6047 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
6048 PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
6049 "persistent IDs in protocol 0 must be "
6050 "ASCII strings");
6051 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006052 return -1;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03006053 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006054
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006055 obj = call_method(self->pers_func, self->pers_func_self, pid);
6056 Py_DECREF(pid);
6057 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006058 return -1;
6059
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006060 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006061 return 0;
6062 }
6063 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006064 PickleState *st = _Pickle_GetGlobalState();
6065 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006066 "A load persistent id instruction was encountered,\n"
6067 "but no persistent_load function was specified.");
6068 return -1;
6069 }
6070}
6071
6072static int
6073load_binpersid(UnpicklerObject *self)
6074{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006075 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006076
6077 if (self->pers_func) {
6078 PDATA_POP(self->stack, pid);
6079 if (pid == NULL)
6080 return -1;
6081
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006082 obj = call_method(self->pers_func, self->pers_func_self, pid);
6083 Py_DECREF(pid);
6084 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006085 return -1;
6086
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006087 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006088 return 0;
6089 }
6090 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006091 PickleState *st = _Pickle_GetGlobalState();
6092 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006093 "A load persistent id instruction was encountered,\n"
6094 "but no persistent_load function was specified.");
6095 return -1;
6096 }
6097}
6098
6099static int
6100load_pop(UnpicklerObject *self)
6101{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006102 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006103
6104 /* Note that we split the (pickle.py) stack into two stacks,
6105 * an object stack and a mark stack. We have to be clever and
6106 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00006107 * mark stack first, and only signalling a stack underflow if
6108 * the object stack is empty and the mark stack doesn't match
6109 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006110 */
Collin Winter8ca69de2009-05-26 16:53:41 +00006111 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006112 self->num_marks--;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006113 self->stack->mark_set = self->num_marks != 0;
6114 self->stack->fence = self->num_marks ?
6115 self->marks[self->num_marks - 1] : 0;
6116 } else if (len <= self->stack->fence)
6117 return Pdata_stack_underflow(self->stack);
6118 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006119 len--;
6120 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006121 Py_SIZE(self->stack) = len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006122 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006123 return 0;
6124}
6125
6126static int
6127load_pop_mark(UnpicklerObject *self)
6128{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006129 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006130
6131 if ((i = marker(self)) < 0)
6132 return -1;
6133
6134 Pdata_clear(self->stack, i);
6135
6136 return 0;
6137}
6138
6139static int
6140load_dup(UnpicklerObject *self)
6141{
6142 PyObject *last;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006143 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006144
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006145 if (len <= self->stack->fence)
6146 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006147 last = self->stack->data[len - 1];
6148 PDATA_APPEND(self->stack, last, -1);
6149 return 0;
6150}
6151
6152static int
6153load_get(UnpicklerObject *self)
6154{
6155 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006156 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006157 Py_ssize_t len;
6158 char *s;
6159
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006160 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006161 return -1;
6162 if (len < 2)
6163 return bad_readline();
6164
6165 key = PyLong_FromString(s, NULL, 10);
6166 if (key == NULL)
6167 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006168 idx = PyLong_AsSsize_t(key);
6169 if (idx == -1 && PyErr_Occurred()) {
6170 Py_DECREF(key);
6171 return -1;
6172 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006173
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006174 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006175 if (value == NULL) {
6176 if (!PyErr_Occurred())
6177 PyErr_SetObject(PyExc_KeyError, key);
6178 Py_DECREF(key);
6179 return -1;
6180 }
6181 Py_DECREF(key);
6182
6183 PDATA_APPEND(self->stack, value, -1);
6184 return 0;
6185}
6186
6187static int
6188load_binget(UnpicklerObject *self)
6189{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006190 PyObject *value;
6191 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006192 char *s;
6193
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006194 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006195 return -1;
6196
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006197 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006198
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006199 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006200 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006201 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006202 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006203 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006204 Py_DECREF(key);
6205 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006206 return -1;
6207 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006208
6209 PDATA_APPEND(self->stack, value, -1);
6210 return 0;
6211}
6212
6213static int
6214load_long_binget(UnpicklerObject *self)
6215{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006216 PyObject *value;
6217 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006218 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006219
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006220 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006221 return -1;
6222
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006223 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006224
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006225 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006226 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006227 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006228 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006229 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006230 Py_DECREF(key);
6231 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006232 return -1;
6233 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006234
6235 PDATA_APPEND(self->stack, value, -1);
6236 return 0;
6237}
6238
6239/* Push an object from the extension registry (EXT[124]). nbytes is
6240 * the number of bytes following the opcode, holding the index (code) value.
6241 */
6242static int
6243load_extension(UnpicklerObject *self, int nbytes)
6244{
6245 char *codebytes; /* the nbytes bytes after the opcode */
6246 long code; /* calc_binint returns long */
6247 PyObject *py_code; /* code as a Python int */
6248 PyObject *obj; /* the object to push */
6249 PyObject *pair; /* (module_name, class_name) */
6250 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006251 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006252
6253 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006254 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006255 return -1;
6256 code = calc_binint(codebytes, nbytes);
6257 if (code <= 0) { /* note that 0 is forbidden */
6258 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006259 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006260 return -1;
6261 }
6262
6263 /* Look for the code in the cache. */
6264 py_code = PyLong_FromLong(code);
6265 if (py_code == NULL)
6266 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006267 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006268 if (obj != NULL) {
6269 /* Bingo. */
6270 Py_DECREF(py_code);
6271 PDATA_APPEND(self->stack, obj, -1);
6272 return 0;
6273 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006274 if (PyErr_Occurred()) {
6275 Py_DECREF(py_code);
6276 return -1;
6277 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006278
6279 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006280 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006281 if (pair == NULL) {
6282 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006283 if (!PyErr_Occurred()) {
6284 PyErr_Format(PyExc_ValueError, "unregistered extension "
6285 "code %ld", code);
6286 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006287 return -1;
6288 }
6289 /* Since the extension registry is manipulable via Python code,
6290 * confirm that pair is really a 2-tuple of strings.
6291 */
Victor Stinnerb37672d2018-11-22 03:37:50 +01006292 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2) {
6293 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006294 }
Victor Stinnerb37672d2018-11-22 03:37:50 +01006295
6296 module_name = PyTuple_GET_ITEM(pair, 0);
6297 if (!PyUnicode_Check(module_name)) {
6298 goto error;
6299 }
6300
6301 class_name = PyTuple_GET_ITEM(pair, 1);
6302 if (!PyUnicode_Check(class_name)) {
6303 goto error;
6304 }
6305
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006306 /* Load the object. */
6307 obj = find_class(self, module_name, class_name);
6308 if (obj == NULL) {
6309 Py_DECREF(py_code);
6310 return -1;
6311 }
6312 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006313 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006314 Py_DECREF(py_code);
6315 if (code < 0) {
6316 Py_DECREF(obj);
6317 return -1;
6318 }
6319 PDATA_PUSH(self->stack, obj, -1);
6320 return 0;
Victor Stinnerb37672d2018-11-22 03:37:50 +01006321
6322error:
6323 Py_DECREF(py_code);
6324 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
6325 "isn't a 2-tuple of strings", code);
6326 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006327}
6328
6329static int
6330load_put(UnpicklerObject *self)
6331{
6332 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006333 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006334 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01006335 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006336
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006337 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006338 return -1;
6339 if (len < 2)
6340 return bad_readline();
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006341 if (Py_SIZE(self->stack) <= self->stack->fence)
6342 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006343 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006344
6345 key = PyLong_FromString(s, NULL, 10);
6346 if (key == NULL)
6347 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006348 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006349 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006350 if (idx < 0) {
6351 if (!PyErr_Occurred())
6352 PyErr_SetString(PyExc_ValueError,
6353 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006354 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006355 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006356
6357 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006358}
6359
6360static int
6361load_binput(UnpicklerObject *self)
6362{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006363 PyObject *value;
6364 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006365 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006366
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006367 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006368 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006369
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006370 if (Py_SIZE(self->stack) <= self->stack->fence)
6371 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006372 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006373
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006374 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006375
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006376 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006377}
6378
6379static int
6380load_long_binput(UnpicklerObject *self)
6381{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006382 PyObject *value;
6383 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006384 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006385
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006386 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006387 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006388
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006389 if (Py_SIZE(self->stack) <= self->stack->fence)
6390 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006391 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006392
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006393 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006394 if (idx < 0) {
6395 PyErr_SetString(PyExc_ValueError,
6396 "negative LONG_BINPUT argument");
6397 return -1;
6398 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006399
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006400 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006401}
6402
6403static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006404load_memoize(UnpicklerObject *self)
6405{
6406 PyObject *value;
6407
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006408 if (Py_SIZE(self->stack) <= self->stack->fence)
6409 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006410 value = self->stack->data[Py_SIZE(self->stack) - 1];
6411
6412 return _Unpickler_MemoPut(self, self->memo_len, value);
6413}
6414
6415static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006416do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006417{
6418 PyObject *value;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006419 PyObject *slice;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006420 PyObject *list;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006421 PyObject *result;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006422 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006423
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006424 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006425 if (x > len || x <= self->stack->fence)
6426 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006427 if (len == x) /* nothing to do */
6428 return 0;
6429
6430 list = self->stack->data[x - 1];
6431
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006432 if (PyList_CheckExact(list)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006433 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006434 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006435
6436 slice = Pdata_poplist(self->stack, x);
6437 if (!slice)
6438 return -1;
6439 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006440 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006441 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006442 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006443 }
6444 else {
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006445 PyObject *extend_func;
6446 _Py_IDENTIFIER(extend);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006447
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006448 extend_func = _PyObject_GetAttrId(list, &PyId_extend);
6449 if (extend_func != NULL) {
6450 slice = Pdata_poplist(self->stack, x);
6451 if (!slice) {
6452 Py_DECREF(extend_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006453 return -1;
6454 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006455 result = _Pickle_FastCall(extend_func, slice);
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006456 Py_DECREF(extend_func);
6457 if (result == NULL)
6458 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006459 Py_DECREF(result);
6460 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006461 else {
6462 PyObject *append_func;
6463 _Py_IDENTIFIER(append);
6464
6465 /* Even if the PEP 307 requires extend() and append() methods,
6466 fall back on append() if the object has no extend() method
6467 for backward compatibility. */
6468 PyErr_Clear();
6469 append_func = _PyObject_GetAttrId(list, &PyId_append);
6470 if (append_func == NULL)
6471 return -1;
6472 for (i = x; i < len; i++) {
6473 value = self->stack->data[i];
6474 result = _Pickle_FastCall(append_func, value);
6475 if (result == NULL) {
6476 Pdata_clear(self->stack, i + 1);
6477 Py_SIZE(self->stack) = x;
6478 Py_DECREF(append_func);
6479 return -1;
6480 }
6481 Py_DECREF(result);
6482 }
6483 Py_SIZE(self->stack) = x;
6484 Py_DECREF(append_func);
6485 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006486 }
6487
6488 return 0;
6489}
6490
6491static int
6492load_append(UnpicklerObject *self)
6493{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006494 if (Py_SIZE(self->stack) - 1 <= self->stack->fence)
6495 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006496 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006497}
6498
6499static int
6500load_appends(UnpicklerObject *self)
6501{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006502 Py_ssize_t i = marker(self);
6503 if (i < 0)
6504 return -1;
6505 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006506}
6507
6508static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006509do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006510{
6511 PyObject *value, *key;
6512 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006513 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006514 int status = 0;
6515
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006516 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006517 if (x > len || x <= self->stack->fence)
6518 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006519 if (len == x) /* nothing to do */
6520 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02006521 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006522 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006523 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006524 PyErr_SetString(st->UnpicklingError,
6525 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006526 return -1;
6527 }
6528
6529 /* Here, dict does not actually need to be a PyDict; it could be anything
6530 that supports the __setitem__ attribute. */
6531 dict = self->stack->data[x - 1];
6532
6533 for (i = x + 1; i < len; i += 2) {
6534 key = self->stack->data[i - 1];
6535 value = self->stack->data[i];
6536 if (PyObject_SetItem(dict, key, value) < 0) {
6537 status = -1;
6538 break;
6539 }
6540 }
6541
6542 Pdata_clear(self->stack, x);
6543 return status;
6544}
6545
6546static int
6547load_setitem(UnpicklerObject *self)
6548{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006549 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006550}
6551
6552static int
6553load_setitems(UnpicklerObject *self)
6554{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006555 Py_ssize_t i = marker(self);
6556 if (i < 0)
6557 return -1;
6558 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006559}
6560
6561static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006562load_additems(UnpicklerObject *self)
6563{
6564 PyObject *set;
6565 Py_ssize_t mark, len, i;
6566
6567 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006568 if (mark < 0)
6569 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006570 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006571 if (mark > len || mark <= self->stack->fence)
6572 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006573 if (len == mark) /* nothing to do */
6574 return 0;
6575
6576 set = self->stack->data[mark - 1];
6577
6578 if (PySet_Check(set)) {
6579 PyObject *items;
6580 int status;
6581
6582 items = Pdata_poptuple(self->stack, mark);
6583 if (items == NULL)
6584 return -1;
6585
6586 status = _PySet_Update(set, items);
6587 Py_DECREF(items);
6588 return status;
6589 }
6590 else {
6591 PyObject *add_func;
6592 _Py_IDENTIFIER(add);
6593
6594 add_func = _PyObject_GetAttrId(set, &PyId_add);
6595 if (add_func == NULL)
6596 return -1;
6597 for (i = mark; i < len; i++) {
6598 PyObject *result;
6599 PyObject *item;
6600
6601 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006602 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006603 if (result == NULL) {
6604 Pdata_clear(self->stack, i + 1);
6605 Py_SIZE(self->stack) = mark;
6606 return -1;
6607 }
6608 Py_DECREF(result);
6609 }
6610 Py_SIZE(self->stack) = mark;
6611 }
6612
6613 return 0;
6614}
6615
6616static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006617load_build(UnpicklerObject *self)
6618{
6619 PyObject *state, *inst, *slotstate;
6620 PyObject *setstate;
6621 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006622 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006623
6624 /* Stack is ... instance, state. We want to leave instance at
6625 * the stack top, possibly mutated via instance.__setstate__(state).
6626 */
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006627 if (Py_SIZE(self->stack) - 2 < self->stack->fence)
6628 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006629
6630 PDATA_POP(self->stack, state);
6631 if (state == NULL)
6632 return -1;
6633
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006634 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006635
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006636 if (_PyObject_LookupAttrId(inst, &PyId___setstate__, &setstate) < 0) {
6637 Py_DECREF(state);
6638 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006639 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006640 if (setstate != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006641 PyObject *result;
6642
6643 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006644 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006645 Py_DECREF(setstate);
6646 if (result == NULL)
6647 return -1;
6648 Py_DECREF(result);
6649 return 0;
6650 }
6651
6652 /* A default __setstate__. First see whether state embeds a
6653 * slot state dict too (a proto 2 addition).
6654 */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02006655 if (PyTuple_Check(state) && PyTuple_GET_SIZE(state) == 2) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006656 PyObject *tmp = state;
6657
6658 state = PyTuple_GET_ITEM(tmp, 0);
6659 slotstate = PyTuple_GET_ITEM(tmp, 1);
6660 Py_INCREF(state);
6661 Py_INCREF(slotstate);
6662 Py_DECREF(tmp);
6663 }
6664 else
6665 slotstate = NULL;
6666
6667 /* Set inst.__dict__ from the state dict (if any). */
6668 if (state != Py_None) {
6669 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006670 PyObject *d_key, *d_value;
6671 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006672 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006673
6674 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006675 PickleState *st = _Pickle_GetGlobalState();
6676 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006677 goto error;
6678 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006679 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006680 if (dict == NULL)
6681 goto error;
6682
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006683 i = 0;
6684 while (PyDict_Next(state, &i, &d_key, &d_value)) {
6685 /* normally the keys for instance attributes are
6686 interned. we should try to do that here. */
6687 Py_INCREF(d_key);
6688 if (PyUnicode_CheckExact(d_key))
6689 PyUnicode_InternInPlace(&d_key);
6690 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6691 Py_DECREF(d_key);
6692 goto error;
6693 }
6694 Py_DECREF(d_key);
6695 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006696 Py_DECREF(dict);
6697 }
6698
6699 /* Also set instance attributes from the slotstate dict (if any). */
6700 if (slotstate != NULL) {
6701 PyObject *d_key, *d_value;
6702 Py_ssize_t i;
6703
6704 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006705 PickleState *st = _Pickle_GetGlobalState();
6706 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006707 "slot state is not a dictionary");
6708 goto error;
6709 }
6710 i = 0;
6711 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6712 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6713 goto error;
6714 }
6715 }
6716
6717 if (0) {
6718 error:
6719 status = -1;
6720 }
6721
6722 Py_DECREF(state);
6723 Py_XDECREF(slotstate);
6724 return status;
6725}
6726
6727static int
6728load_mark(UnpicklerObject *self)
6729{
6730
6731 /* Note that we split the (pickle.py) stack into two stacks, an
6732 * object stack and a mark stack. Here we push a mark onto the
6733 * mark stack.
6734 */
6735
Sergey Fedoseev86b89912018-08-25 12:54:40 +05006736 if (self->num_marks >= self->marks_size) {
Sergey Fedoseev90555ec2018-08-25 15:41:58 +05006737 size_t alloc = ((size_t)self->num_marks << 1) + 20;
6738 Py_ssize_t *marks_new = self->marks;
6739 PyMem_RESIZE(marks_new, Py_ssize_t, alloc);
6740 if (marks_new == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006741 PyErr_NoMemory();
6742 return -1;
6743 }
Sergey Fedoseev90555ec2018-08-25 15:41:58 +05006744 self->marks = marks_new;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006745 self->marks_size = (Py_ssize_t)alloc;
6746 }
6747
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006748 self->stack->mark_set = 1;
6749 self->marks[self->num_marks++] = self->stack->fence = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006750
6751 return 0;
6752}
6753
6754static int
6755load_reduce(UnpicklerObject *self)
6756{
6757 PyObject *callable = NULL;
6758 PyObject *argtup = NULL;
6759 PyObject *obj = NULL;
6760
6761 PDATA_POP(self->stack, argtup);
6762 if (argtup == NULL)
6763 return -1;
6764 PDATA_POP(self->stack, callable);
6765 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006766 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006767 Py_DECREF(callable);
6768 }
6769 Py_DECREF(argtup);
6770
6771 if (obj == NULL)
6772 return -1;
6773
6774 PDATA_PUSH(self->stack, obj, -1);
6775 return 0;
6776}
6777
6778/* Just raises an error if we don't know the protocol specified. PROTO
6779 * is the first opcode for protocols >= 2.
6780 */
6781static int
6782load_proto(UnpicklerObject *self)
6783{
6784 char *s;
6785 int i;
6786
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006787 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006788 return -1;
6789
6790 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006791 if (i <= HIGHEST_PROTOCOL) {
6792 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006793 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006794 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006795
6796 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6797 return -1;
6798}
6799
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006800static int
6801load_frame(UnpicklerObject *self)
6802{
6803 char *s;
6804 Py_ssize_t frame_len;
6805
6806 if (_Unpickler_Read(self, &s, 8) < 0)
6807 return -1;
6808
6809 frame_len = calc_binsize(s, 8);
6810 if (frame_len < 0) {
6811 PyErr_Format(PyExc_OverflowError,
6812 "FRAME length exceeds system's maximum of %zd bytes",
6813 PY_SSIZE_T_MAX);
6814 return -1;
6815 }
6816
6817 if (_Unpickler_Read(self, &s, frame_len) < 0)
6818 return -1;
6819
6820 /* Rewind to start of frame */
6821 self->next_read_idx -= frame_len;
6822 return 0;
6823}
6824
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006825static PyObject *
6826load(UnpicklerObject *self)
6827{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006828 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006829 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006830
6831 self->num_marks = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006832 self->stack->mark_set = 0;
6833 self->stack->fence = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006834 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006835 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006836 Pdata_clear(self->stack, 0);
6837
6838 /* Convenient macros for the dispatch while-switch loop just below. */
6839#define OP(opcode, load_func) \
6840 case opcode: if (load_func(self) < 0) break; continue;
6841
6842#define OP_ARG(opcode, load_func, arg) \
6843 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6844
6845 while (1) {
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006846 if (_Unpickler_Read(self, &s, 1) < 0) {
6847 PickleState *st = _Pickle_GetGlobalState();
6848 if (PyErr_ExceptionMatches(st->UnpicklingError)) {
6849 PyErr_Format(PyExc_EOFError, "Ran out of input");
6850 }
6851 return NULL;
6852 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006853
6854 switch ((enum opcode)s[0]) {
6855 OP(NONE, load_none)
6856 OP(BININT, load_binint)
6857 OP(BININT1, load_binint1)
6858 OP(BININT2, load_binint2)
6859 OP(INT, load_int)
6860 OP(LONG, load_long)
6861 OP_ARG(LONG1, load_counted_long, 1)
6862 OP_ARG(LONG4, load_counted_long, 4)
6863 OP(FLOAT, load_float)
6864 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006865 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6866 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6867 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
Antoine Pitrou91f43802019-05-26 17:10:09 +02006868 OP(BYTEARRAY8, load_counted_bytearray)
6869 OP(NEXT_BUFFER, load_next_buffer)
6870 OP(READONLY_BUFFER, load_readonly_buffer)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006871 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6872 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006873 OP(STRING, load_string)
6874 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006875 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6876 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6877 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006878 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6879 OP_ARG(TUPLE1, load_counted_tuple, 1)
6880 OP_ARG(TUPLE2, load_counted_tuple, 2)
6881 OP_ARG(TUPLE3, load_counted_tuple, 3)
6882 OP(TUPLE, load_tuple)
6883 OP(EMPTY_LIST, load_empty_list)
6884 OP(LIST, load_list)
6885 OP(EMPTY_DICT, load_empty_dict)
6886 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006887 OP(EMPTY_SET, load_empty_set)
6888 OP(ADDITEMS, load_additems)
6889 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006890 OP(OBJ, load_obj)
6891 OP(INST, load_inst)
6892 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006893 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006894 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006895 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006896 OP(APPEND, load_append)
6897 OP(APPENDS, load_appends)
6898 OP(BUILD, load_build)
6899 OP(DUP, load_dup)
6900 OP(BINGET, load_binget)
6901 OP(LONG_BINGET, load_long_binget)
6902 OP(GET, load_get)
6903 OP(MARK, load_mark)
6904 OP(BINPUT, load_binput)
6905 OP(LONG_BINPUT, load_long_binput)
6906 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006907 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006908 OP(POP, load_pop)
6909 OP(POP_MARK, load_pop_mark)
6910 OP(SETITEM, load_setitem)
6911 OP(SETITEMS, load_setitems)
6912 OP(PERSID, load_persid)
6913 OP(BINPERSID, load_binpersid)
6914 OP(REDUCE, load_reduce)
6915 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006916 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006917 OP_ARG(EXT1, load_extension, 1)
6918 OP_ARG(EXT2, load_extension, 2)
6919 OP_ARG(EXT4, load_extension, 4)
6920 OP_ARG(NEWTRUE, load_bool, Py_True)
6921 OP_ARG(NEWFALSE, load_bool, Py_False)
6922
6923 case STOP:
6924 break;
6925
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006926 default:
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006927 {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006928 PickleState *st = _Pickle_GetGlobalState();
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006929 unsigned char c = (unsigned char) *s;
6930 if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') {
6931 PyErr_Format(st->UnpicklingError,
6932 "invalid load key, '%c'.", c);
6933 }
6934 else {
6935 PyErr_Format(st->UnpicklingError,
6936 "invalid load key, '\\x%02x'.", c);
6937 }
6938 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006939 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006940 }
6941
6942 break; /* and we are done! */
6943 }
6944
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006945 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006946 return NULL;
6947 }
6948
Victor Stinner2ae57e32013-10-31 13:39:23 +01006949 if (_Unpickler_SkipConsumed(self) < 0)
6950 return NULL;
6951
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006952 PDATA_POP(self->stack, value);
6953 return value;
6954}
6955
Larry Hastings61272b72014-01-07 12:41:53 -08006956/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006957
6958_pickle.Unpickler.load
6959
6960Load a pickle.
6961
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006962Read a pickled object representation from the open file object given
6963in the constructor, and return the reconstituted object hierarchy
6964specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006965[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006966
Larry Hastings3cceb382014-01-04 11:09:09 -08006967static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006968_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006969/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006970{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006971 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006972
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006973 /* Check whether the Unpickler was initialized correctly. This prevents
6974 segfaulting if a subclass overridden __init__ with a function that does
6975 not call Unpickler.__init__(). Here, we simply ensure that self->read
6976 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006977 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006978 PickleState *st = _Pickle_GetGlobalState();
6979 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006980 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006981 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006982 return NULL;
6983 }
6984
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006985 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006986}
6987
6988/* The name of find_class() is misleading. In newer pickle protocols, this
6989 function is used for loading any global (i.e., functions), not just
6990 classes. The name is kept only for backward compatibility. */
6991
Larry Hastings61272b72014-01-07 12:41:53 -08006992/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006993
6994_pickle.Unpickler.find_class
6995
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006996 module_name: object
6997 global_name: object
6998 /
6999
7000Return an object from a specified module.
7001
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007002If necessary, the module will be imported. Subclasses may override
7003this method (e.g. to restrict unpickling of arbitrary classes and
7004functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007005
7006This method is called whenever a class or a function object is
7007needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007008[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007009
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007010static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007011_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
7012 PyObject *module_name,
7013 PyObject *global_name)
7014/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007015{
7016 PyObject *global;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007017 PyObject *module;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007018
Steve Dowerb82e17e2019-05-23 08:45:22 -07007019 if (PySys_Audit("pickle.find_class", "OO",
7020 module_name, global_name) < 0) {
7021 return NULL;
7022 }
7023
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007024 /* Try to map the old names used in Python 2.x to the new ones used in
7025 Python 3.x. We do this only with old pickle protocols and when the
7026 user has not disabled the feature. */
7027 if (self->proto < 3 && self->fix_imports) {
7028 PyObject *key;
7029 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007030 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007031
7032 /* Check if the global (i.e., a function or a class) was renamed
7033 or moved to another module. */
7034 key = PyTuple_Pack(2, module_name, global_name);
7035 if (key == NULL)
7036 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007037 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007038 Py_DECREF(key);
7039 if (item) {
7040 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
7041 PyErr_Format(PyExc_RuntimeError,
7042 "_compat_pickle.NAME_MAPPING values should be "
7043 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
7044 return NULL;
7045 }
7046 module_name = PyTuple_GET_ITEM(item, 0);
7047 global_name = PyTuple_GET_ITEM(item, 1);
7048 if (!PyUnicode_Check(module_name) ||
7049 !PyUnicode_Check(global_name)) {
7050 PyErr_Format(PyExc_RuntimeError,
7051 "_compat_pickle.NAME_MAPPING values should be "
7052 "pairs of str, not (%.200s, %.200s)",
7053 Py_TYPE(module_name)->tp_name,
7054 Py_TYPE(global_name)->tp_name);
7055 return NULL;
7056 }
7057 }
7058 else if (PyErr_Occurred()) {
7059 return NULL;
7060 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03007061 else {
7062 /* Check if the module was renamed. */
7063 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
7064 if (item) {
7065 if (!PyUnicode_Check(item)) {
7066 PyErr_Format(PyExc_RuntimeError,
7067 "_compat_pickle.IMPORT_MAPPING values should be "
7068 "strings, not %.200s", Py_TYPE(item)->tp_name);
7069 return NULL;
7070 }
7071 module_name = item;
7072 }
7073 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007074 return NULL;
7075 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007076 }
7077 }
7078
tjb9004371c0a2019-02-18 23:30:51 +08007079 /*
7080 * we don't use PyImport_GetModule here, because it can return partially-
7081 * initialised modules, which then cause the getattribute to fail.
7082 */
7083 module = PyImport_Import(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007084 if (module == NULL) {
tjb9004371c0a2019-02-18 23:30:51 +08007085 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007086 }
Eric Snow3f9eee62017-09-15 16:35:20 -06007087 global = getattribute(module, global_name, self->proto >= 4);
7088 Py_DECREF(module);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007089 return global;
7090}
7091
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007092/*[clinic input]
7093
7094_pickle.Unpickler.__sizeof__ -> Py_ssize_t
7095
7096Returns size in memory, in bytes.
7097[clinic start generated code]*/
7098
7099static Py_ssize_t
7100_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
7101/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
7102{
7103 Py_ssize_t res;
7104
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02007105 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007106 if (self->memo != NULL)
7107 res += self->memo_size * sizeof(PyObject *);
7108 if (self->marks != NULL)
7109 res += self->marks_size * sizeof(Py_ssize_t);
7110 if (self->input_line != NULL)
7111 res += strlen(self->input_line) + 1;
7112 if (self->encoding != NULL)
7113 res += strlen(self->encoding) + 1;
7114 if (self->errors != NULL)
7115 res += strlen(self->errors) + 1;
7116 return res;
7117}
7118
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007119static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007120 _PICKLE_UNPICKLER_LOAD_METHODDEF
7121 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007122 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007123 {NULL, NULL} /* sentinel */
7124};
7125
7126static void
7127Unpickler_dealloc(UnpicklerObject *self)
7128{
7129 PyObject_GC_UnTrack((PyObject *)self);
7130 Py_XDECREF(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007131 Py_XDECREF(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007132 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007133 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007134 Py_XDECREF(self->stack);
7135 Py_XDECREF(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007136 Py_XDECREF(self->buffers);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007137 if (self->buffer.buf != NULL) {
7138 PyBuffer_Release(&self->buffer);
7139 self->buffer.buf = NULL;
7140 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007141
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007142 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007143 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007144 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007145 PyMem_Free(self->encoding);
7146 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007147
7148 Py_TYPE(self)->tp_free((PyObject *)self);
7149}
7150
7151static int
7152Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
7153{
7154 Py_VISIT(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007155 Py_VISIT(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007156 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007157 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007158 Py_VISIT(self->stack);
7159 Py_VISIT(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007160 Py_VISIT(self->buffers);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007161 return 0;
7162}
7163
7164static int
7165Unpickler_clear(UnpicklerObject *self)
7166{
7167 Py_CLEAR(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007168 Py_CLEAR(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007169 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007170 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007171 Py_CLEAR(self->stack);
7172 Py_CLEAR(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007173 Py_CLEAR(self->buffers);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007174 if (self->buffer.buf != NULL) {
7175 PyBuffer_Release(&self->buffer);
7176 self->buffer.buf = NULL;
7177 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007178
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007179 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007180 PyMem_Free(self->marks);
7181 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007182 PyMem_Free(self->input_line);
7183 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007184 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007185 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007186 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007187 self->errors = NULL;
7188
7189 return 0;
7190}
7191
Larry Hastings61272b72014-01-07 12:41:53 -08007192/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007193
7194_pickle.Unpickler.__init__
7195
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007196 file: object
7197 *
7198 fix_imports: bool = True
7199 encoding: str = 'ASCII'
7200 errors: str = 'strict'
Antoine Pitrou91f43802019-05-26 17:10:09 +02007201 buffers: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007202
7203This takes a binary file for reading a pickle data stream.
7204
7205The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007206protocol argument is needed. Bytes past the pickled object's
7207representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007208
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007209The argument *file* must have two methods, a read() method that takes
7210an integer argument, and a readline() method that requires no
7211arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007212binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007213other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007214
7215Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007216which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007217generated by Python 2. If *fix_imports* is True, pickle will try to
7218map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007219*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007220instances pickled by Python 2; these default to 'ASCII' and 'strict',
7221respectively. The *encoding* can be 'bytes' to read these 8-bit
7222string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007223[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007224
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007225static int
Larry Hastings89964c42015-04-14 18:07:59 -04007226_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
7227 int fix_imports, const char *encoding,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007228 const char *errors, PyObject *buffers)
7229/*[clinic end generated code: output=09f0192649ea3f85 input=da4b62d9edb68700]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007230{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02007231 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007232
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007233 /* In case of multiple __init__() calls, clear previous content. */
7234 if (self->read != NULL)
7235 (void)Unpickler_clear(self);
7236
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007237 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007238 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007239
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007240 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007241 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007242
Antoine Pitrou91f43802019-05-26 17:10:09 +02007243 if (_Unpickler_SetBuffers(self, buffers) < 0)
7244 return -1;
7245
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007246 self->fix_imports = fix_imports;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007247
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007248 if (init_method_ref((PyObject *)self, &PyId_persistent_load,
7249 &self->pers_func, &self->pers_func_self) < 0)
7250 {
7251 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007252 }
7253
7254 self->stack = (Pdata *)Pdata_New();
7255 if (self->stack == NULL)
Zackery Spytz4b430e52018-09-28 23:48:46 -06007256 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007257
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007258 self->memo_size = 32;
7259 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007260 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007261 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007262
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007263 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00007264
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007265 return 0;
7266}
7267
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007268
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007269/* Define a proxy object for the Unpickler's internal memo object. This is to
7270 * avoid breaking code like:
7271 * unpickler.memo.clear()
7272 * and
7273 * unpickler.memo = saved_memo
7274 * Is this a good idea? Not really, but we don't want to break code that uses
7275 * it. Note that we don't implement the entire mapping API here. This is
7276 * intentional, as these should be treated as black-box implementation details.
7277 *
7278 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02007279 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007280 */
7281
Larry Hastings61272b72014-01-07 12:41:53 -08007282/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007283_pickle.UnpicklerMemoProxy.clear
7284
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007285Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08007286[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007287
Larry Hastings3cceb382014-01-04 11:09:09 -08007288static PyObject *
7289_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007290/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007291{
7292 _Unpickler_MemoCleanup(self->unpickler);
7293 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
7294 if (self->unpickler->memo == NULL)
7295 return NULL;
7296 Py_RETURN_NONE;
7297}
7298
Larry Hastings61272b72014-01-07 12:41:53 -08007299/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007300_pickle.UnpicklerMemoProxy.copy
7301
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007302Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08007303[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007304
Larry Hastings3cceb382014-01-04 11:09:09 -08007305static PyObject *
7306_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007307/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007308{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007309 size_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007310 PyObject *new_memo = PyDict_New();
7311 if (new_memo == NULL)
7312 return NULL;
7313
7314 for (i = 0; i < self->unpickler->memo_size; i++) {
7315 int status;
7316 PyObject *key, *value;
7317
7318 value = self->unpickler->memo[i];
7319 if (value == NULL)
7320 continue;
7321
7322 key = PyLong_FromSsize_t(i);
7323 if (key == NULL)
7324 goto error;
7325 status = PyDict_SetItem(new_memo, key, value);
7326 Py_DECREF(key);
7327 if (status < 0)
7328 goto error;
7329 }
7330 return new_memo;
7331
7332error:
7333 Py_DECREF(new_memo);
7334 return NULL;
7335}
7336
Larry Hastings61272b72014-01-07 12:41:53 -08007337/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007338_pickle.UnpicklerMemoProxy.__reduce__
7339
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007340Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08007341[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007342
Larry Hastings3cceb382014-01-04 11:09:09 -08007343static PyObject *
7344_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007345/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007346{
7347 PyObject *reduce_value;
7348 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08007349 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007350 if (contents == NULL)
7351 return NULL;
7352
7353 reduce_value = PyTuple_New(2);
7354 if (reduce_value == NULL) {
7355 Py_DECREF(contents);
7356 return NULL;
7357 }
7358 constructor_args = PyTuple_New(1);
7359 if (constructor_args == NULL) {
7360 Py_DECREF(contents);
7361 Py_DECREF(reduce_value);
7362 return NULL;
7363 }
7364 PyTuple_SET_ITEM(constructor_args, 0, contents);
7365 Py_INCREF((PyObject *)&PyDict_Type);
7366 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
7367 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
7368 return reduce_value;
7369}
7370
7371static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007372 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
7373 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
7374 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007375 {NULL, NULL} /* sentinel */
7376};
7377
7378static void
7379UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
7380{
7381 PyObject_GC_UnTrack(self);
7382 Py_XDECREF(self->unpickler);
7383 PyObject_GC_Del((PyObject *)self);
7384}
7385
7386static int
7387UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
7388 visitproc visit, void *arg)
7389{
7390 Py_VISIT(self->unpickler);
7391 return 0;
7392}
7393
7394static int
7395UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
7396{
7397 Py_CLEAR(self->unpickler);
7398 return 0;
7399}
7400
7401static PyTypeObject UnpicklerMemoProxyType = {
7402 PyVarObject_HEAD_INIT(NULL, 0)
7403 "_pickle.UnpicklerMemoProxy", /*tp_name*/
7404 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
7405 0,
7406 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
7407 0, /* tp_print */
7408 0, /* tp_getattr */
7409 0, /* tp_setattr */
7410 0, /* tp_compare */
7411 0, /* tp_repr */
7412 0, /* tp_as_number */
7413 0, /* tp_as_sequence */
7414 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00007415 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007416 0, /* tp_call */
7417 0, /* tp_str */
7418 PyObject_GenericGetAttr, /* tp_getattro */
7419 PyObject_GenericSetAttr, /* tp_setattro */
7420 0, /* tp_as_buffer */
7421 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
7422 0, /* tp_doc */
7423 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
7424 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
7425 0, /* tp_richcompare */
7426 0, /* tp_weaklistoffset */
7427 0, /* tp_iter */
7428 0, /* tp_iternext */
7429 unpicklerproxy_methods, /* tp_methods */
7430};
7431
7432static PyObject *
7433UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
7434{
7435 UnpicklerMemoProxyObject *self;
7436
7437 self = PyObject_GC_New(UnpicklerMemoProxyObject,
7438 &UnpicklerMemoProxyType);
7439 if (self == NULL)
7440 return NULL;
7441 Py_INCREF(unpickler);
7442 self->unpickler = unpickler;
7443 PyObject_GC_Track(self);
7444 return (PyObject *)self;
7445}
7446
7447/*****************************************************************************/
7448
7449
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007450static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007451Unpickler_get_memo(UnpicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007452{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007453 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007454}
7455
7456static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007457Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007458{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007459 PyObject **new_memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007460 size_t new_memo_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007461
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007462 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007463 PyErr_SetString(PyExc_TypeError,
7464 "attribute deletion is not supported");
7465 return -1;
7466 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007467
7468 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
7469 UnpicklerObject *unpickler =
7470 ((UnpicklerMemoProxyObject *)obj)->unpickler;
7471
7472 new_memo_size = unpickler->memo_size;
7473 new_memo = _Unpickler_NewMemo(new_memo_size);
7474 if (new_memo == NULL)
7475 return -1;
7476
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007477 for (size_t i = 0; i < new_memo_size; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007478 Py_XINCREF(unpickler->memo[i]);
7479 new_memo[i] = unpickler->memo[i];
7480 }
7481 }
7482 else if (PyDict_Check(obj)) {
7483 Py_ssize_t i = 0;
7484 PyObject *key, *value;
7485
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02007486 new_memo_size = PyDict_GET_SIZE(obj);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007487 new_memo = _Unpickler_NewMemo(new_memo_size);
7488 if (new_memo == NULL)
7489 return -1;
7490
7491 while (PyDict_Next(obj, &i, &key, &value)) {
7492 Py_ssize_t idx;
7493 if (!PyLong_Check(key)) {
7494 PyErr_SetString(PyExc_TypeError,
7495 "memo key must be integers");
7496 goto error;
7497 }
7498 idx = PyLong_AsSsize_t(key);
7499 if (idx == -1 && PyErr_Occurred())
7500 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02007501 if (idx < 0) {
7502 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02007503 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02007504 goto error;
7505 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007506 if (_Unpickler_MemoPut(self, idx, value) < 0)
7507 goto error;
7508 }
7509 }
7510 else {
7511 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02007512 "'memo' attribute must be an UnpicklerMemoProxy object "
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007513 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007514 return -1;
7515 }
7516
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007517 _Unpickler_MemoCleanup(self);
7518 self->memo_size = new_memo_size;
7519 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007520
7521 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007522
7523 error:
7524 if (new_memo_size) {
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007525 for (size_t i = new_memo_size - 1; i != SIZE_MAX; i--) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007526 Py_XDECREF(new_memo[i]);
7527 }
7528 PyMem_FREE(new_memo);
7529 }
7530 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007531}
7532
7533static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007534Unpickler_get_persload(UnpicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007535{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007536 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007537 PyErr_SetString(PyExc_AttributeError, "persistent_load");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007538 return NULL;
7539 }
7540 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007541}
7542
7543static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007544Unpickler_set_persload(UnpicklerObject *self, PyObject *value, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007545{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007546 if (value == NULL) {
7547 PyErr_SetString(PyExc_TypeError,
7548 "attribute deletion is not supported");
7549 return -1;
7550 }
7551 if (!PyCallable_Check(value)) {
7552 PyErr_SetString(PyExc_TypeError,
7553 "persistent_load must be a callable taking "
7554 "one argument");
7555 return -1;
7556 }
7557
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007558 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007559 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03007560 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007561
7562 return 0;
7563}
7564
7565static PyGetSetDef Unpickler_getsets[] = {
7566 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
7567 {"persistent_load", (getter)Unpickler_get_persload,
7568 (setter)Unpickler_set_persload},
7569 {NULL}
7570};
7571
7572static PyTypeObject Unpickler_Type = {
7573 PyVarObject_HEAD_INIT(NULL, 0)
7574 "_pickle.Unpickler", /*tp_name*/
7575 sizeof(UnpicklerObject), /*tp_basicsize*/
7576 0, /*tp_itemsize*/
7577 (destructor)Unpickler_dealloc, /*tp_dealloc*/
7578 0, /*tp_print*/
7579 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007580 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00007581 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007582 0, /*tp_repr*/
7583 0, /*tp_as_number*/
7584 0, /*tp_as_sequence*/
7585 0, /*tp_as_mapping*/
7586 0, /*tp_hash*/
7587 0, /*tp_call*/
7588 0, /*tp_str*/
7589 0, /*tp_getattro*/
7590 0, /*tp_setattro*/
7591 0, /*tp_as_buffer*/
7592 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007593 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007594 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7595 (inquiry)Unpickler_clear, /*tp_clear*/
7596 0, /*tp_richcompare*/
7597 0, /*tp_weaklistoffset*/
7598 0, /*tp_iter*/
7599 0, /*tp_iternext*/
7600 Unpickler_methods, /*tp_methods*/
7601 0, /*tp_members*/
7602 Unpickler_getsets, /*tp_getset*/
7603 0, /*tp_base*/
7604 0, /*tp_dict*/
7605 0, /*tp_descr_get*/
7606 0, /*tp_descr_set*/
7607 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007608 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007609 PyType_GenericAlloc, /*tp_alloc*/
7610 PyType_GenericNew, /*tp_new*/
7611 PyObject_GC_Del, /*tp_free*/
7612 0, /*tp_is_gc*/
7613};
7614
Larry Hastings61272b72014-01-07 12:41:53 -08007615/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007616
7617_pickle.dump
7618
7619 obj: object
7620 file: object
7621 protocol: object = NULL
7622 *
7623 fix_imports: bool = True
Antoine Pitrou91f43802019-05-26 17:10:09 +02007624 buffer_callback: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007625
7626Write a pickled representation of obj to the open file object file.
7627
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007628This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7629be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007630
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007631The optional *protocol* argument tells the pickler to use the given
Łukasz Langac51d8c92018-04-03 23:06:53 -07007632protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7633protocol is 4. It was introduced in Python 3.4, it is incompatible
7634with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007635
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007636Specifying a negative protocol version selects the highest protocol
7637version supported. The higher the protocol used, the more recent the
7638version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007639
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007640The *file* argument must have a write() method that accepts a single
7641bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00007642writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007643this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007644
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007645If *fix_imports* is True and protocol is less than 3, pickle will try
7646to map the new Python 3 names to the old module names used in Python
76472, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02007648
7649If *buffer_callback* is None (the default), buffer views are serialized
7650into *file* as part of the pickle stream. It is an error if
7651*buffer_callback* is not None and *protocol* is None or smaller than 5.
7652
Larry Hastings61272b72014-01-07 12:41:53 -08007653[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007654
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007655static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007656_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007657 PyObject *protocol, int fix_imports,
7658 PyObject *buffer_callback)
7659/*[clinic end generated code: output=706186dba996490c input=2f035f02cc0f9547]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007660{
7661 PicklerObject *pickler = _Pickler_New();
7662
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007663 if (pickler == NULL)
7664 return NULL;
7665
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007666 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007667 goto error;
7668
7669 if (_Pickler_SetOutputStream(pickler, file) < 0)
7670 goto error;
7671
Antoine Pitrou91f43802019-05-26 17:10:09 +02007672 if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0)
7673 goto error;
7674
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007675 if (dump(pickler, obj) < 0)
7676 goto error;
7677
7678 if (_Pickler_FlushToFile(pickler) < 0)
7679 goto error;
7680
7681 Py_DECREF(pickler);
7682 Py_RETURN_NONE;
7683
7684 error:
7685 Py_XDECREF(pickler);
7686 return NULL;
7687}
7688
Larry Hastings61272b72014-01-07 12:41:53 -08007689/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007690
7691_pickle.dumps
7692
7693 obj: object
7694 protocol: object = NULL
7695 *
7696 fix_imports: bool = True
Antoine Pitrou91f43802019-05-26 17:10:09 +02007697 buffer_callback: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007698
7699Return the pickled representation of the object as a bytes object.
7700
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007701The optional *protocol* argument tells the pickler to use the given
7702protocol; supported protocols are 0, 1, 2, 3 and 4. The default
Łukasz Langac51d8c92018-04-03 23:06:53 -07007703protocol is 4. It was introduced in Python 3.4, it is incompatible
7704with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007705
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007706Specifying a negative protocol version selects the highest protocol
7707version supported. The higher the protocol used, the more recent the
7708version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007709
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007710If *fix_imports* is True and *protocol* is less than 3, pickle will
7711try to map the new Python 3 names to the old module names used in
7712Python 2, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02007713
7714If *buffer_callback* is None (the default), buffer views are serialized
7715into *file* as part of the pickle stream. It is an error if
7716*buffer_callback* is not None and *protocol* is None or smaller than 5.
7717
Larry Hastings61272b72014-01-07 12:41:53 -08007718[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007719
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007720static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007721_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007722 int fix_imports, PyObject *buffer_callback)
7723/*[clinic end generated code: output=fbab0093a5580fdf input=001f167df711b9f1]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007724{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007725 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007726 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007727
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007728 if (pickler == NULL)
7729 return NULL;
7730
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007731 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007732 goto error;
7733
Antoine Pitrou91f43802019-05-26 17:10:09 +02007734 if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0)
7735 goto error;
7736
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007737 if (dump(pickler, obj) < 0)
7738 goto error;
7739
7740 result = _Pickler_GetString(pickler);
7741 Py_DECREF(pickler);
7742 return result;
7743
7744 error:
7745 Py_XDECREF(pickler);
7746 return NULL;
7747}
7748
Larry Hastings61272b72014-01-07 12:41:53 -08007749/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007750
7751_pickle.load
7752
7753 file: object
7754 *
7755 fix_imports: bool = True
7756 encoding: str = 'ASCII'
7757 errors: str = 'strict'
Antoine Pitrou91f43802019-05-26 17:10:09 +02007758 buffers: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007759
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007760Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007761
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007762This is equivalent to ``Unpickler(file).load()``, but may be more
7763efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007764
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007765The protocol version of the pickle is detected automatically, so no
7766protocol argument is needed. Bytes past the pickled object's
7767representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007768
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007769The argument *file* must have two methods, a read() method that takes
7770an integer argument, and a readline() method that requires no
7771arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007772binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007773other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007774
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007775Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007776which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007777generated by Python 2. If *fix_imports* is True, pickle will try to
7778map the old Python 2 names to the new names used in Python 3. The
7779*encoding* and *errors* tell pickle how to decode 8-bit string
7780instances pickled by Python 2; these default to 'ASCII' and 'strict',
7781respectively. The *encoding* can be 'bytes' to read these 8-bit
7782string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007783[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007784
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007785static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007786_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007787 const char *encoding, const char *errors,
7788 PyObject *buffers)
7789/*[clinic end generated code: output=250452d141c23e76 input=29fae982fe778156]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007790{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007791 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007792 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007793
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007794 if (unpickler == NULL)
7795 return NULL;
7796
7797 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7798 goto error;
7799
7800 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7801 goto error;
7802
Antoine Pitrou91f43802019-05-26 17:10:09 +02007803 if (_Unpickler_SetBuffers(unpickler, buffers) < 0)
7804 goto error;
7805
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007806 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007807
7808 result = load(unpickler);
7809 Py_DECREF(unpickler);
7810 return result;
7811
7812 error:
7813 Py_XDECREF(unpickler);
7814 return NULL;
7815}
7816
Larry Hastings61272b72014-01-07 12:41:53 -08007817/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007818
7819_pickle.loads
7820
7821 data: object
7822 *
7823 fix_imports: bool = True
7824 encoding: str = 'ASCII'
7825 errors: str = 'strict'
Antoine Pitrou91f43802019-05-26 17:10:09 +02007826 buffers: object = NULL
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007827
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007828Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007829
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007830The protocol version of the pickle is detected automatically, so no
7831protocol argument is needed. Bytes past the pickled object's
7832representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007833
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007834Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007835which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007836generated by Python 2. If *fix_imports* is True, pickle will try to
7837map the old Python 2 names to the new names used in Python 3. The
7838*encoding* and *errors* tell pickle how to decode 8-bit string
7839instances pickled by Python 2; these default to 'ASCII' and 'strict',
7840respectively. The *encoding* can be 'bytes' to read these 8-bit
7841string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007842[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007843
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007844static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007845_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007846 const char *encoding, const char *errors,
7847 PyObject *buffers)
7848/*[clinic end generated code: output=82ac1e6b588e6d02 input=c6004393f8276867]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007849{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007850 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007851 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007852
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007853 if (unpickler == NULL)
7854 return NULL;
7855
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007856 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007857 goto error;
7858
7859 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7860 goto error;
7861
Antoine Pitrou91f43802019-05-26 17:10:09 +02007862 if (_Unpickler_SetBuffers(unpickler, buffers) < 0)
7863 goto error;
7864
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007865 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007866
7867 result = load(unpickler);
7868 Py_DECREF(unpickler);
7869 return result;
7870
7871 error:
7872 Py_XDECREF(unpickler);
7873 return NULL;
7874}
7875
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007876static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007877 _PICKLE_DUMP_METHODDEF
7878 _PICKLE_DUMPS_METHODDEF
7879 _PICKLE_LOAD_METHODDEF
7880 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007881 {NULL, NULL} /* sentinel */
7882};
7883
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007884static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007885pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007886{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007887 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007888 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007889}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007890
Stefan Krahf483b0f2013-12-14 13:43:10 +01007891static void
7892pickle_free(PyObject *m)
7893{
7894 _Pickle_ClearState(_Pickle_GetState(m));
7895}
7896
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007897static int
7898pickle_traverse(PyObject *m, visitproc visit, void *arg)
7899{
7900 PickleState *st = _Pickle_GetState(m);
7901 Py_VISIT(st->PickleError);
7902 Py_VISIT(st->PicklingError);
7903 Py_VISIT(st->UnpicklingError);
7904 Py_VISIT(st->dispatch_table);
7905 Py_VISIT(st->extension_registry);
7906 Py_VISIT(st->extension_cache);
7907 Py_VISIT(st->inverted_registry);
7908 Py_VISIT(st->name_mapping_2to3);
7909 Py_VISIT(st->import_mapping_2to3);
7910 Py_VISIT(st->name_mapping_3to2);
7911 Py_VISIT(st->import_mapping_3to2);
7912 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007913 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007914 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007915}
7916
7917static struct PyModuleDef _picklemodule = {
7918 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007919 "_pickle", /* m_name */
7920 pickle_module_doc, /* m_doc */
7921 sizeof(PickleState), /* m_size */
7922 pickle_methods, /* m_methods */
7923 NULL, /* m_reload */
7924 pickle_traverse, /* m_traverse */
7925 pickle_clear, /* m_clear */
7926 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007927};
7928
7929PyMODINIT_FUNC
7930PyInit__pickle(void)
7931{
7932 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007933 PickleState *st;
7934
7935 m = PyState_FindModule(&_picklemodule);
7936 if (m) {
7937 Py_INCREF(m);
7938 return m;
7939 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007940
7941 if (PyType_Ready(&Unpickler_Type) < 0)
7942 return NULL;
7943 if (PyType_Ready(&Pickler_Type) < 0)
7944 return NULL;
7945 if (PyType_Ready(&Pdata_Type) < 0)
7946 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007947 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7948 return NULL;
7949 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7950 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007951
7952 /* Create the module and add the functions. */
7953 m = PyModule_Create(&_picklemodule);
7954 if (m == NULL)
7955 return NULL;
7956
Antoine Pitrou91f43802019-05-26 17:10:09 +02007957 /* Add types */
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007958 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007959 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7960 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007961 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007962 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7963 return NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02007964 Py_INCREF(&PyPickleBuffer_Type);
7965 if (PyModule_AddObject(m, "PickleBuffer",
7966 (PyObject *)&PyPickleBuffer_Type) < 0)
7967 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007968
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007969 st = _Pickle_GetState(m);
7970
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007971 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007972 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7973 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007974 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007975 st->PicklingError = \
7976 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7977 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007978 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007979 st->UnpicklingError = \
7980 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7981 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007982 return NULL;
7983
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007984 Py_INCREF(st->PickleError);
7985 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007986 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007987 Py_INCREF(st->PicklingError);
7988 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007989 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007990 Py_INCREF(st->UnpicklingError);
7991 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007992 return NULL;
7993
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007994 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007995 return NULL;
7996
7997 return m;
7998}