blob: ea778c763520fcee4a65401a3ab752c9cb328693 [file] [log] [blame]
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001
2/* Core extension modules are built-in on some platforms (e.g. Windows). */
3#ifdef Py_BUILD_CORE
Eric Snowfc1bf872017-09-11 18:30:43 -07004#define Py_BUILD_CORE_BUILTIN
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#undef Py_BUILD_CORE
6#endif
7
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008#include "Python.h"
9#include "structmember.h"
10
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -080011PyDoc_STRVAR(pickle_module_doc,
12"Optimized C implementation for the Python pickle module.");
13
Larry Hastings61272b72014-01-07 12:41:53 -080014/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080015module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -080016class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
17class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
18class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
19class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080020[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030021/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080022
Łukasz Langac51d8c92018-04-03 23:06:53 -070023/* Bump HIGHEST_PROTOCOL when new opcodes are added to the pickle protocol.
24 Bump DEFAULT_PROTOCOL only when the oldest still supported version of Python
25 already includes it. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000026enum {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010027 HIGHEST_PROTOCOL = 4,
Łukasz Langac51d8c92018-04-03 23:06:53 -070028 DEFAULT_PROTOCOL = 4
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000029};
30
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000031/* Pickle opcodes. These must be kept updated with pickle.py.
32 Extensive docs are in pickletools.py. */
33enum opcode {
34 MARK = '(',
35 STOP = '.',
36 POP = '0',
37 POP_MARK = '1',
38 DUP = '2',
39 FLOAT = 'F',
40 INT = 'I',
41 BININT = 'J',
42 BININT1 = 'K',
43 LONG = 'L',
44 BININT2 = 'M',
45 NONE = 'N',
46 PERSID = 'P',
47 BINPERSID = 'Q',
48 REDUCE = 'R',
49 STRING = 'S',
50 BINSTRING = 'T',
51 SHORT_BINSTRING = 'U',
52 UNICODE = 'V',
53 BINUNICODE = 'X',
54 APPEND = 'a',
55 BUILD = 'b',
56 GLOBAL = 'c',
57 DICT = 'd',
58 EMPTY_DICT = '}',
59 APPENDS = 'e',
60 GET = 'g',
61 BINGET = 'h',
62 INST = 'i',
63 LONG_BINGET = 'j',
64 LIST = 'l',
65 EMPTY_LIST = ']',
66 OBJ = 'o',
67 PUT = 'p',
68 BINPUT = 'q',
69 LONG_BINPUT = 'r',
70 SETITEM = 's',
71 TUPLE = 't',
72 EMPTY_TUPLE = ')',
73 SETITEMS = 'u',
74 BINFLOAT = 'G',
75
76 /* Protocol 2. */
77 PROTO = '\x80',
78 NEWOBJ = '\x81',
79 EXT1 = '\x82',
80 EXT2 = '\x83',
81 EXT4 = '\x84',
82 TUPLE1 = '\x85',
83 TUPLE2 = '\x86',
84 TUPLE3 = '\x87',
85 NEWTRUE = '\x88',
86 NEWFALSE = '\x89',
87 LONG1 = '\x8a',
88 LONG4 = '\x8b',
89
90 /* Protocol 3 (Python 3.x) */
91 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010092 SHORT_BINBYTES = 'C',
93
94 /* Protocol 4 */
95 SHORT_BINUNICODE = '\x8c',
96 BINUNICODE8 = '\x8d',
97 BINBYTES8 = '\x8e',
98 EMPTY_SET = '\x8f',
99 ADDITEMS = '\x90',
100 FROZENSET = '\x91',
101 NEWOBJ_EX = '\x92',
102 STACK_GLOBAL = '\x93',
103 MEMOIZE = '\x94',
104 FRAME = '\x95'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000105};
106
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000107enum {
108 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
109 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
110 break if this gets out of synch with pickle.py, but it's unclear that would
111 help anything either. */
112 BATCHSIZE = 1000,
113
114 /* Nesting limit until Pickler, when running in "fast mode", starts
115 checking for self-referential data-structures. */
116 FAST_NESTING_LIMIT = 50,
117
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000118 /* Initial size of the write buffer of Pickler. */
119 WRITE_BUF_SIZE = 4096,
120
Antoine Pitrou04248a82010-10-12 20:51:21 +0000121 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100122 PREFETCH = 8192 * 16,
123
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200124 FRAME_SIZE_MIN = 4,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100125 FRAME_SIZE_TARGET = 64 * 1024,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100126 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000127};
128
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800129/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000130
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800131/* State of the pickle module, per PEP 3121. */
132typedef struct {
133 /* Exception classes for pickle. */
134 PyObject *PickleError;
135 PyObject *PicklingError;
136 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800137
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800138 /* copyreg.dispatch_table, {type_object: pickling_function} */
139 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000140
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800141 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000142
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800143 /* copyreg._extension_registry, {(module_name, function_name): code} */
144 PyObject *extension_registry;
145 /* copyreg._extension_cache, {code: object} */
146 PyObject *extension_cache;
147 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
148 PyObject *inverted_registry;
149
150 /* Import mappings for compatibility with Python 2.x */
151
152 /* _compat_pickle.NAME_MAPPING,
153 {(oldmodule, oldname): (newmodule, newname)} */
154 PyObject *name_mapping_2to3;
155 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
156 PyObject *import_mapping_2to3;
157 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
158 PyObject *name_mapping_3to2;
159 PyObject *import_mapping_3to2;
160
161 /* codecs.encode, used for saving bytes in older protocols */
162 PyObject *codecs_encode;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300163 /* builtins.getattr, used for saving nested names with protocol < 4 */
164 PyObject *getattr;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300165 /* functools.partial, used for implementing __newobj_ex__ with protocols
166 2 and 3 */
167 PyObject *partial;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800168} PickleState;
169
170/* Forward declaration of the _pickle module definition. */
171static struct PyModuleDef _picklemodule;
172
173/* Given a module object, get its per-module state. */
174static PickleState *
175_Pickle_GetState(PyObject *module)
176{
177 return (PickleState *)PyModule_GetState(module);
178}
179
180/* Find the module instance imported in the currently running sub-interpreter
181 and get its state. */
182static PickleState *
183_Pickle_GetGlobalState(void)
184{
185 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
186}
187
188/* Clear the given pickle module state. */
189static void
190_Pickle_ClearState(PickleState *st)
191{
192 Py_CLEAR(st->PickleError);
193 Py_CLEAR(st->PicklingError);
194 Py_CLEAR(st->UnpicklingError);
195 Py_CLEAR(st->dispatch_table);
196 Py_CLEAR(st->extension_registry);
197 Py_CLEAR(st->extension_cache);
198 Py_CLEAR(st->inverted_registry);
199 Py_CLEAR(st->name_mapping_2to3);
200 Py_CLEAR(st->import_mapping_2to3);
201 Py_CLEAR(st->name_mapping_3to2);
202 Py_CLEAR(st->import_mapping_3to2);
203 Py_CLEAR(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300204 Py_CLEAR(st->getattr);
Victor Stinner9ba97df2015-11-17 12:15:07 +0100205 Py_CLEAR(st->partial);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800206}
207
208/* Initialize the given pickle module state. */
209static int
210_Pickle_InitState(PickleState *st)
211{
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300212 PyObject *builtins;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800213 PyObject *copyreg = NULL;
214 PyObject *compat_pickle = NULL;
215 PyObject *codecs = NULL;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300216 PyObject *functools = NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800217
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300218 builtins = PyEval_GetBuiltins();
219 if (builtins == NULL)
220 goto error;
221 st->getattr = PyDict_GetItemString(builtins, "getattr");
222 if (st->getattr == NULL)
223 goto error;
224 Py_INCREF(st->getattr);
225
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800226 copyreg = PyImport_ImportModule("copyreg");
227 if (!copyreg)
228 goto error;
229 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
230 if (!st->dispatch_table)
231 goto error;
232 if (!PyDict_CheckExact(st->dispatch_table)) {
233 PyErr_Format(PyExc_RuntimeError,
234 "copyreg.dispatch_table should be a dict, not %.200s",
235 Py_TYPE(st->dispatch_table)->tp_name);
236 goto error;
237 }
238 st->extension_registry = \
239 PyObject_GetAttrString(copyreg, "_extension_registry");
240 if (!st->extension_registry)
241 goto error;
242 if (!PyDict_CheckExact(st->extension_registry)) {
243 PyErr_Format(PyExc_RuntimeError,
244 "copyreg._extension_registry should be a dict, "
245 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
246 goto error;
247 }
248 st->inverted_registry = \
249 PyObject_GetAttrString(copyreg, "_inverted_registry");
250 if (!st->inverted_registry)
251 goto error;
252 if (!PyDict_CheckExact(st->inverted_registry)) {
253 PyErr_Format(PyExc_RuntimeError,
254 "copyreg._inverted_registry should be a dict, "
255 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
256 goto error;
257 }
258 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
259 if (!st->extension_cache)
260 goto error;
261 if (!PyDict_CheckExact(st->extension_cache)) {
262 PyErr_Format(PyExc_RuntimeError,
263 "copyreg._extension_cache should be a dict, "
264 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
265 goto error;
266 }
267 Py_CLEAR(copyreg);
268
269 /* Load the 2.x -> 3.x stdlib module mapping tables */
270 compat_pickle = PyImport_ImportModule("_compat_pickle");
271 if (!compat_pickle)
272 goto error;
273 st->name_mapping_2to3 = \
274 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
275 if (!st->name_mapping_2to3)
276 goto error;
277 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
278 PyErr_Format(PyExc_RuntimeError,
279 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
280 Py_TYPE(st->name_mapping_2to3)->tp_name);
281 goto error;
282 }
283 st->import_mapping_2to3 = \
284 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
285 if (!st->import_mapping_2to3)
286 goto error;
287 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
288 PyErr_Format(PyExc_RuntimeError,
289 "_compat_pickle.IMPORT_MAPPING should be a dict, "
290 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
291 goto error;
292 }
293 /* ... and the 3.x -> 2.x mapping tables */
294 st->name_mapping_3to2 = \
295 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
296 if (!st->name_mapping_3to2)
297 goto error;
298 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
299 PyErr_Format(PyExc_RuntimeError,
300 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
301 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
302 goto error;
303 }
304 st->import_mapping_3to2 = \
305 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
306 if (!st->import_mapping_3to2)
307 goto error;
308 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
309 PyErr_Format(PyExc_RuntimeError,
310 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
311 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
312 goto error;
313 }
314 Py_CLEAR(compat_pickle);
315
316 codecs = PyImport_ImportModule("codecs");
317 if (codecs == NULL)
318 goto error;
319 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
320 if (st->codecs_encode == NULL) {
321 goto error;
322 }
323 if (!PyCallable_Check(st->codecs_encode)) {
324 PyErr_Format(PyExc_RuntimeError,
325 "codecs.encode should be a callable, not %.200s",
326 Py_TYPE(st->codecs_encode)->tp_name);
327 goto error;
328 }
329 Py_CLEAR(codecs);
330
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300331 functools = PyImport_ImportModule("functools");
332 if (!functools)
333 goto error;
334 st->partial = PyObject_GetAttrString(functools, "partial");
335 if (!st->partial)
336 goto error;
337 Py_CLEAR(functools);
338
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800339 return 0;
340
341 error:
342 Py_CLEAR(copyreg);
343 Py_CLEAR(compat_pickle);
344 Py_CLEAR(codecs);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300345 Py_CLEAR(functools);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800346 _Pickle_ClearState(st);
347 return -1;
348}
349
350/* Helper for calling a function with a single argument quickly.
351
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800352 This function steals the reference of the given argument. */
353static PyObject *
354_Pickle_FastCall(PyObject *func, PyObject *obj)
355{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800356 PyObject *result;
357
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100358 result = PyObject_CallFunctionObjArgs(func, obj, NULL);
Victor Stinner75210692016-08-19 18:59:15 +0200359 Py_DECREF(obj);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800360 return result;
361}
362
363/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000364
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200365/* Retrieve and deconstruct a method for avoiding a reference cycle
366 (pickler -> bound method of pickler -> pickler) */
367static int
368init_method_ref(PyObject *self, _Py_Identifier *name,
369 PyObject **method_func, PyObject **method_self)
370{
371 PyObject *func, *func2;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200372 int ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200373
374 /* *method_func and *method_self should be consistent. All refcount decrements
375 should be occurred after setting *method_self and *method_func. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200376 ret = _PyObject_LookupAttrId(self, name, &func);
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200377 if (func == NULL) {
378 *method_self = NULL;
379 Py_CLEAR(*method_func);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200380 return ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200381 }
382
383 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
384 /* Deconstruct a bound Python method */
385 func2 = PyMethod_GET_FUNCTION(func);
386 Py_INCREF(func2);
387 *method_self = self; /* borrowed */
388 Py_XSETREF(*method_func, func2);
389 Py_DECREF(func);
390 return 0;
391 }
392 else {
393 *method_self = NULL;
394 Py_XSETREF(*method_func, func);
395 return 0;
396 }
397}
398
399/* Bind a method if it was deconstructed */
400static PyObject *
401reconstruct_method(PyObject *func, PyObject *self)
402{
403 if (self) {
404 return PyMethod_New(func, self);
405 }
406 else {
407 Py_INCREF(func);
408 return func;
409 }
410}
411
412static PyObject *
413call_method(PyObject *func, PyObject *self, PyObject *obj)
414{
415 if (self) {
416 return PyObject_CallFunctionObjArgs(func, self, obj, NULL);
417 }
418 else {
419 return PyObject_CallFunctionObjArgs(func, obj, NULL);
420 }
421}
422
423/*************************************************************************/
424
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000425/* Internal data type used as the unpickling stack. */
426typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000427 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000428 PyObject **data;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200429 int mark_set; /* is MARK set? */
430 Py_ssize_t fence; /* position of top MARK or 0 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000431 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000432} Pdata;
433
434static void
435Pdata_dealloc(Pdata *self)
436{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200437 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000438 while (--i >= 0) {
439 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000440 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000441 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000442 PyObject_Del(self);
443}
444
445static PyTypeObject Pdata_Type = {
446 PyVarObject_HEAD_INIT(NULL, 0)
447 "_pickle.Pdata", /*tp_name*/
448 sizeof(Pdata), /*tp_basicsize*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200449 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000450 (destructor)Pdata_dealloc, /*tp_dealloc*/
451};
452
453static PyObject *
454Pdata_New(void)
455{
456 Pdata *self;
457
458 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
459 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000460 Py_SIZE(self) = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200461 self->mark_set = 0;
462 self->fence = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000463 self->allocated = 8;
464 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000465 if (self->data)
466 return (PyObject *)self;
467 Py_DECREF(self);
468 return PyErr_NoMemory();
469}
470
471
472/* Retain only the initial clearto items. If clearto >= the current
473 * number of items, this is a (non-erroneous) NOP.
474 */
475static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200476Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000477{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200478 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000479
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200480 assert(clearto >= self->fence);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000481 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000482 return 0;
483
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000484 while (--i >= clearto) {
485 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000486 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000487 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000488 return 0;
489}
490
491static int
492Pdata_grow(Pdata *self)
493{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000494 PyObject **data = self->data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200495 size_t allocated = (size_t)self->allocated;
496 size_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000497
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000498 new_allocated = (allocated >> 3) + 6;
499 /* check for integer overflow */
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200500 if (new_allocated > (size_t)PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000501 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000502 new_allocated += allocated;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500503 PyMem_RESIZE(data, PyObject *, new_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000504 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000505 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000506
507 self->data = data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200508 self->allocated = (Py_ssize_t)new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000509 return 0;
510
511 nomemory:
512 PyErr_NoMemory();
513 return -1;
514}
515
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200516static int
517Pdata_stack_underflow(Pdata *self)
518{
519 PickleState *st = _Pickle_GetGlobalState();
520 PyErr_SetString(st->UnpicklingError,
521 self->mark_set ?
522 "unexpected MARK found" :
523 "unpickling stack underflow");
524 return -1;
525}
526
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000527/* D is a Pdata*. Pop the topmost element and store it into V, which
528 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
529 * is raised and V is set to NULL.
530 */
531static PyObject *
532Pdata_pop(Pdata *self)
533{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200534 if (Py_SIZE(self) <= self->fence) {
535 Pdata_stack_underflow(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000536 return NULL;
537 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000538 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000539}
540#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
541
542static int
543Pdata_push(Pdata *self, PyObject *obj)
544{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000545 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000546 return -1;
547 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000548 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000549 return 0;
550}
551
552/* Push an object on stack, transferring its ownership to the stack. */
553#define PDATA_PUSH(D, O, ER) do { \
554 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
555
556/* Push an object on stack, adding a new reference to the object. */
557#define PDATA_APPEND(D, O, ER) do { \
558 Py_INCREF((O)); \
559 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
560
561static PyObject *
562Pdata_poptuple(Pdata *self, Py_ssize_t start)
563{
564 PyObject *tuple;
565 Py_ssize_t len, i, j;
566
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200567 if (start < self->fence) {
568 Pdata_stack_underflow(self);
569 return NULL;
570 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000571 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000572 tuple = PyTuple_New(len);
573 if (tuple == NULL)
574 return NULL;
575 for (i = start, j = 0; j < len; i++, j++)
576 PyTuple_SET_ITEM(tuple, j, self->data[i]);
577
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000578 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000579 return tuple;
580}
581
582static PyObject *
583Pdata_poplist(Pdata *self, Py_ssize_t start)
584{
585 PyObject *list;
586 Py_ssize_t len, i, j;
587
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000588 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000589 list = PyList_New(len);
590 if (list == NULL)
591 return NULL;
592 for (i = start, j = 0; j < len; i++, j++)
593 PyList_SET_ITEM(list, j, self->data[i]);
594
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000595 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000596 return list;
597}
598
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000599typedef struct {
600 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200601 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000602} PyMemoEntry;
603
604typedef struct {
605 Py_ssize_t mt_mask;
606 Py_ssize_t mt_used;
607 Py_ssize_t mt_allocated;
608 PyMemoEntry *mt_table;
609} PyMemoTable;
610
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000611typedef struct PicklerObject {
612 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000613 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000614 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000615 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000616 PyObject *pers_func; /* persistent_id() method, can be NULL */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200617 PyObject *pers_func_self; /* borrowed reference to self if pers_func
618 is an unbound method, NULL otherwise */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100619 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000620
621 PyObject *write; /* write() method of the output stream. */
622 PyObject *output_buffer; /* Write into a local bytearray buffer before
623 flushing to the stream. */
624 Py_ssize_t output_len; /* Length of output_buffer. */
625 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000626 int proto; /* Pickle protocol number, >= 0 */
627 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100628 int framing; /* True when framing is enabled, proto >= 4 */
629 Py_ssize_t frame_start; /* Position in output_buffer where the
Martin Pantera90a4a92016-05-30 04:04:50 +0000630 current frame begins. -1 if there
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100631 is no frame currently open. */
632
633 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000634 int fast; /* Enable fast mode if set to a true value.
635 The fast mode disable the usage of memo,
636 therefore speeding the pickling process by
637 not generating superfluous PUT opcodes. It
638 should not be used if with self-referential
639 objects. */
640 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000641 int fix_imports; /* Indicate whether Pickler should fix
642 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000643 PyObject *fast_memo;
644} PicklerObject;
645
646typedef struct UnpicklerObject {
647 PyObject_HEAD
648 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000649
650 /* The unpickler memo is just an array of PyObject *s. Using a dict
651 is unnecessary, since the keys are contiguous ints. */
652 PyObject **memo;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100653 Py_ssize_t memo_size; /* Capacity of the memo array */
654 Py_ssize_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000655
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000656 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200657 PyObject *pers_func_self; /* borrowed reference to self if pers_func
658 is an unbound method, NULL otherwise */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000659
660 Py_buffer buffer;
661 char *input_buffer;
662 char *input_line;
663 Py_ssize_t input_len;
664 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000665 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100666
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000667 PyObject *read; /* read() method of the input stream. */
668 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000669 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000670
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000671 char *encoding; /* Name of the encoding to be used for
672 decoding strings pickled using Python
673 2.x. The default value is "ASCII" */
674 char *errors; /* Name of errors handling scheme to used when
675 decoding strings. The default value is
676 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500677 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000678 objects. */
679 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
680 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000681 int proto; /* Protocol of the pickle loaded. */
682 int fix_imports; /* Indicate whether Unpickler should fix
683 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000684} UnpicklerObject;
685
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200686typedef struct {
687 PyObject_HEAD
688 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
689} PicklerMemoProxyObject;
690
691typedef struct {
692 PyObject_HEAD
693 UnpicklerObject *unpickler;
694} UnpicklerMemoProxyObject;
695
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000696/* Forward declarations */
697static int save(PicklerObject *, PyObject *, int);
698static int save_reduce(PicklerObject *, PyObject *, PyObject *);
699static PyTypeObject Pickler_Type;
700static PyTypeObject Unpickler_Type;
701
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200702#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000703
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000704/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300705 A custom hashtable mapping void* to Python ints. This is used by the pickler
706 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000707 a bunch of unnecessary object creation. This makes a huge performance
708 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000709
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000710#define MT_MINSIZE 8
711#define PERTURB_SHIFT 5
712
713
714static PyMemoTable *
715PyMemoTable_New(void)
716{
717 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
718 if (memo == NULL) {
719 PyErr_NoMemory();
720 return NULL;
721 }
722
723 memo->mt_used = 0;
724 memo->mt_allocated = MT_MINSIZE;
725 memo->mt_mask = MT_MINSIZE - 1;
726 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
727 if (memo->mt_table == NULL) {
728 PyMem_FREE(memo);
729 PyErr_NoMemory();
730 return NULL;
731 }
732 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
733
734 return memo;
735}
736
737static PyMemoTable *
738PyMemoTable_Copy(PyMemoTable *self)
739{
740 Py_ssize_t i;
741 PyMemoTable *new = PyMemoTable_New();
742 if (new == NULL)
743 return NULL;
744
745 new->mt_used = self->mt_used;
746 new->mt_allocated = self->mt_allocated;
747 new->mt_mask = self->mt_mask;
748 /* The table we get from _New() is probably smaller than we wanted.
749 Free it and allocate one that's the right size. */
750 PyMem_FREE(new->mt_table);
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500751 new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000752 if (new->mt_table == NULL) {
753 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200754 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000755 return NULL;
756 }
757 for (i = 0; i < self->mt_allocated; i++) {
758 Py_XINCREF(self->mt_table[i].me_key);
759 }
760 memcpy(new->mt_table, self->mt_table,
761 sizeof(PyMemoEntry) * self->mt_allocated);
762
763 return new;
764}
765
766static Py_ssize_t
767PyMemoTable_Size(PyMemoTable *self)
768{
769 return self->mt_used;
770}
771
772static int
773PyMemoTable_Clear(PyMemoTable *self)
774{
775 Py_ssize_t i = self->mt_allocated;
776
777 while (--i >= 0) {
778 Py_XDECREF(self->mt_table[i].me_key);
779 }
780 self->mt_used = 0;
781 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
782 return 0;
783}
784
785static void
786PyMemoTable_Del(PyMemoTable *self)
787{
788 if (self == NULL)
789 return;
790 PyMemoTable_Clear(self);
791
792 PyMem_FREE(self->mt_table);
793 PyMem_FREE(self);
794}
795
796/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
797 can be considerably simpler than dictobject.c's lookdict(). */
798static PyMemoEntry *
799_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
800{
801 size_t i;
802 size_t perturb;
803 size_t mask = (size_t)self->mt_mask;
804 PyMemoEntry *table = self->mt_table;
805 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000806 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000807
808 i = hash & mask;
809 entry = &table[i];
810 if (entry->me_key == NULL || entry->me_key == key)
811 return entry;
812
813 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
814 i = (i << 2) + i + perturb + 1;
815 entry = &table[i & mask];
816 if (entry->me_key == NULL || entry->me_key == key)
817 return entry;
818 }
Barry Warsawb2e57942017-09-14 18:13:16 -0700819 Py_UNREACHABLE();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000820}
821
822/* Returns -1 on failure, 0 on success. */
823static int
824_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
825{
826 PyMemoEntry *oldtable = NULL;
827 PyMemoEntry *oldentry, *newentry;
828 Py_ssize_t new_size = MT_MINSIZE;
829 Py_ssize_t to_process;
830
831 assert(min_size > 0);
832
833 /* Find the smallest valid table size >= min_size. */
834 while (new_size < min_size && new_size > 0)
835 new_size <<= 1;
836 if (new_size <= 0) {
837 PyErr_NoMemory();
838 return -1;
839 }
840 /* new_size needs to be a power of two. */
841 assert((new_size & (new_size - 1)) == 0);
842
843 /* Allocate new table. */
844 oldtable = self->mt_table;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500845 self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000846 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200847 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000848 PyErr_NoMemory();
849 return -1;
850 }
851 self->mt_allocated = new_size;
852 self->mt_mask = new_size - 1;
853 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
854
855 /* Copy entries from the old table. */
856 to_process = self->mt_used;
857 for (oldentry = oldtable; to_process > 0; oldentry++) {
858 if (oldentry->me_key != NULL) {
859 to_process--;
860 /* newentry is a pointer to a chunk of the new
861 mt_table, so we're setting the key:value pair
862 in-place. */
863 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
864 newentry->me_key = oldentry->me_key;
865 newentry->me_value = oldentry->me_value;
866 }
867 }
868
869 /* Deallocate the old table. */
870 PyMem_FREE(oldtable);
871 return 0;
872}
873
874/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200875static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000876PyMemoTable_Get(PyMemoTable *self, PyObject *key)
877{
878 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
879 if (entry->me_key == NULL)
880 return NULL;
881 return &entry->me_value;
882}
883
884/* Returns -1 on failure, 0 on success. */
885static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200886PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000887{
888 PyMemoEntry *entry;
889
890 assert(key != NULL);
891
892 entry = _PyMemoTable_Lookup(self, key);
893 if (entry->me_key != NULL) {
894 entry->me_value = value;
895 return 0;
896 }
897 Py_INCREF(key);
898 entry->me_key = key;
899 entry->me_value = value;
900 self->mt_used++;
901
902 /* If we added a key, we can safely resize. Otherwise just return!
903 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
904 *
905 * Quadrupling the size improves average table sparseness
906 * (reducing collisions) at the cost of some memory. It also halves
907 * the number of expensive resize operations in a growing memo table.
908 *
909 * Very large memo tables (over 50K items) use doubling instead.
910 * This may help applications with severe memory constraints.
911 */
912 if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
913 return 0;
914 return _PyMemoTable_ResizeTable(self,
915 (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
916}
917
918#undef MT_MINSIZE
919#undef PERTURB_SHIFT
920
921/*************************************************************************/
922
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000923
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000924static int
925_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000926{
Serhiy Storchaka48842712016-04-06 09:45:48 +0300927 Py_XSETREF(self->output_buffer,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +0200928 PyBytes_FromStringAndSize(NULL, self->max_output_len));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000929 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000930 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000931 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100932 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000933 return 0;
934}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000935
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100936static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100937_write_size64(char *out, size_t value)
938{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200939 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800940
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200941 Py_BUILD_ASSERT(sizeof(size_t) <= 8);
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800942
943 for (i = 0; i < sizeof(size_t); i++) {
944 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
945 }
946 for (i = sizeof(size_t); i < 8; i++) {
947 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800948 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100949}
950
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100951static int
952_Pickler_CommitFrame(PicklerObject *self)
953{
954 size_t frame_len;
955 char *qdata;
956
957 if (!self->framing || self->frame_start == -1)
958 return 0;
959 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
960 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200961 if (frame_len >= FRAME_SIZE_MIN) {
962 qdata[0] = FRAME;
963 _write_size64(qdata + 1, frame_len);
964 }
965 else {
966 memmove(qdata, qdata + FRAME_HEADER_SIZE, frame_len);
967 self->output_len -= FRAME_HEADER_SIZE;
968 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100969 self->frame_start = -1;
970 return 0;
971}
972
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000973static PyObject *
974_Pickler_GetString(PicklerObject *self)
975{
976 PyObject *output_buffer = self->output_buffer;
977
978 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100979
980 if (_Pickler_CommitFrame(self))
981 return NULL;
982
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000983 self->output_buffer = NULL;
984 /* Resize down to exact size */
985 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
986 return NULL;
987 return output_buffer;
988}
989
990static int
991_Pickler_FlushToFile(PicklerObject *self)
992{
993 PyObject *output, *result;
994
995 assert(self->write != NULL);
996
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100997 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000998 output = _Pickler_GetString(self);
999 if (output == NULL)
1000 return -1;
1001
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001002 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001003 Py_XDECREF(result);
1004 return (result == NULL) ? -1 : 0;
1005}
1006
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001007static int
1008_Pickler_OpcodeBoundary(PicklerObject *self)
1009{
1010 Py_ssize_t frame_len;
1011
1012 if (!self->framing || self->frame_start == -1) {
1013 return 0;
1014 }
1015 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
1016 if (frame_len >= FRAME_SIZE_TARGET) {
1017 if(_Pickler_CommitFrame(self)) {
1018 return -1;
1019 }
Leo Ariasc3d95082018-02-03 18:36:10 -06001020 /* Flush the content of the committed frame to the underlying
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001021 * file and reuse the pickler buffer for the next frame so as
1022 * to limit memory usage when dumping large complex objects to
1023 * a file.
1024 *
1025 * self->write is NULL when called via dumps.
1026 */
1027 if (self->write != NULL) {
1028 if (_Pickler_FlushToFile(self) < 0) {
1029 return -1;
1030 }
1031 if (_Pickler_ClearBuffer(self) < 0) {
1032 return -1;
1033 }
1034 }
1035 }
1036 return 0;
1037}
1038
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001039static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001040_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001041{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001042 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001043 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001044 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001045
1046 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001047 need_new_frame = (self->framing && self->frame_start == -1);
1048
1049 if (need_new_frame)
1050 n = data_len + FRAME_HEADER_SIZE;
1051 else
1052 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001053
1054 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001055 if (required > self->max_output_len) {
1056 /* Make place in buffer for the pickle chunk */
1057 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
1058 PyErr_NoMemory();
1059 return -1;
1060 }
1061 self->max_output_len = (self->output_len + n) / 2 * 3;
1062 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
1063 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001064 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001065 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001066 if (need_new_frame) {
1067 /* Setup new frame */
1068 Py_ssize_t frame_start = self->output_len;
1069 self->frame_start = frame_start;
1070 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
1071 /* Write an invalid value, for debugging */
1072 buffer[frame_start + i] = 0xFE;
1073 }
1074 self->output_len += FRAME_HEADER_SIZE;
1075 }
1076 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001077 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001078 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001079 buffer[self->output_len + i] = s[i];
1080 }
1081 }
1082 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001083 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001084 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001085 self->output_len += data_len;
1086 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001087}
1088
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001089static PicklerObject *
1090_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001091{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001092 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001093
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001094 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1095 if (self == NULL)
1096 return NULL;
1097
1098 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01001099 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001100 self->write = NULL;
1101 self->proto = 0;
1102 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001103 self->framing = 0;
1104 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001105 self->fast = 0;
1106 self->fast_nesting = 0;
1107 self->fix_imports = 0;
1108 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001109 self->max_output_len = WRITE_BUF_SIZE;
1110 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001111
1112 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001113 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1114 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001115
1116 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001117 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001118 return NULL;
1119 }
1120 return self;
1121}
1122
1123static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001124_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001125{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001126 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001127
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001128 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001129 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001130 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001131 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001132 proto = PyLong_AsLong(protocol);
1133 if (proto < 0) {
1134 if (proto == -1 && PyErr_Occurred())
1135 return -1;
1136 proto = HIGHEST_PROTOCOL;
1137 }
1138 else if (proto > HIGHEST_PROTOCOL) {
1139 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1140 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001141 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001142 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001143 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001144 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001145 self->bin = proto > 0;
1146 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001147 return 0;
1148}
1149
1150/* Returns -1 (with an exception set) on failure, 0 on success. This may
1151 be called once on a freshly created Pickler. */
1152static int
1153_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1154{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001155 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001156 assert(file != NULL);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001157 if (_PyObject_LookupAttrId(file, &PyId_write, &self->write) < 0) {
1158 return -1;
1159 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001160 if (self->write == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001161 PyErr_SetString(PyExc_TypeError,
1162 "file must have a 'write' attribute");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001163 return -1;
1164 }
1165
1166 return 0;
1167}
1168
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001169/* Returns the size of the input on success, -1 on failure. This takes its
1170 own reference to `input`. */
1171static Py_ssize_t
1172_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1173{
1174 if (self->buffer.buf != NULL)
1175 PyBuffer_Release(&self->buffer);
1176 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1177 return -1;
1178 self->input_buffer = self->buffer.buf;
1179 self->input_len = self->buffer.len;
1180 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001181 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001182 return self->input_len;
1183}
1184
Antoine Pitrou04248a82010-10-12 20:51:21 +00001185static int
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001186bad_readline(void)
1187{
1188 PickleState *st = _Pickle_GetGlobalState();
1189 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
1190 return -1;
1191}
1192
1193static int
Antoine Pitrou04248a82010-10-12 20:51:21 +00001194_Unpickler_SkipConsumed(UnpicklerObject *self)
1195{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001196 Py_ssize_t consumed;
1197 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001198
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001199 consumed = self->next_read_idx - self->prefetched_idx;
1200 if (consumed <= 0)
1201 return 0;
1202
1203 assert(self->peek); /* otherwise we did something wrong */
Martin Panter6245cb32016-04-15 02:14:19 +00001204 /* This makes a useless copy... */
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001205 r = PyObject_CallFunction(self->read, "n", consumed);
1206 if (r == NULL)
1207 return -1;
1208 Py_DECREF(r);
1209
1210 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001211 return 0;
1212}
1213
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001214static const Py_ssize_t READ_WHOLE_LINE = -1;
1215
1216/* If reading from a file, we need to only pull the bytes we need, since there
1217 may be multiple pickle objects arranged contiguously in the same input
1218 buffer.
1219
1220 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1221 bytes from the input stream/buffer.
1222
1223 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1224 failure; on success, returns the number of bytes read from the file.
1225
1226 On success, self->input_len will be 0; this is intentional so that when
1227 unpickling from a file, the "we've run out of data" code paths will trigger,
1228 causing the Unpickler to go back to the file for more data. Use the returned
1229 size to tell you how much data you can process. */
1230static Py_ssize_t
1231_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1232{
1233 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001234 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001235
1236 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001237
Antoine Pitrou04248a82010-10-12 20:51:21 +00001238 if (_Unpickler_SkipConsumed(self) < 0)
1239 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001240
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001241 if (n == READ_WHOLE_LINE) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02001242 data = _PyObject_CallNoArg(self->readline);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001243 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001244 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001245 PyObject *len;
1246 /* Prefetch some data without advancing the file pointer, if possible */
1247 if (self->peek && n < PREFETCH) {
1248 len = PyLong_FromSsize_t(PREFETCH);
1249 if (len == NULL)
1250 return -1;
1251 data = _Pickle_FastCall(self->peek, len);
1252 if (data == NULL) {
1253 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1254 return -1;
1255 /* peek() is probably not supported by the given file object */
1256 PyErr_Clear();
1257 Py_CLEAR(self->peek);
1258 }
1259 else {
1260 read_size = _Unpickler_SetStringInput(self, data);
1261 Py_DECREF(data);
1262 self->prefetched_idx = 0;
1263 if (n <= read_size)
1264 return n;
1265 }
1266 }
1267 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001268 if (len == NULL)
1269 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001270 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001271 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001272 if (data == NULL)
1273 return -1;
1274
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001275 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001276 Py_DECREF(data);
1277 return read_size;
1278}
1279
Victor Stinner19ed27e2016-05-20 11:42:37 +02001280/* Don't call it directly: use _Unpickler_Read() */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001281static Py_ssize_t
Victor Stinner19ed27e2016-05-20 11:42:37 +02001282_Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001283{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001284 Py_ssize_t num_read;
1285
Benjamin Peterson6aa15642015-09-27 01:16:03 -07001286 *s = NULL;
Benjamin Petersone48cf7e2015-09-26 00:08:34 -07001287 if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1288 PickleState *st = _Pickle_GetGlobalState();
1289 PyErr_SetString(st->UnpicklingError,
1290 "read would overflow (invalid bytecode)");
1291 return -1;
1292 }
Victor Stinner19ed27e2016-05-20 11:42:37 +02001293
1294 /* This case is handled by the _Unpickler_Read() macro for efficiency */
1295 assert(self->next_read_idx + n > self->input_len);
1296
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001297 if (!self->read)
1298 return bad_readline();
1299
Antoine Pitrou04248a82010-10-12 20:51:21 +00001300 num_read = _Unpickler_ReadFromFile(self, n);
1301 if (num_read < 0)
1302 return -1;
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001303 if (num_read < n)
1304 return bad_readline();
Antoine Pitrou04248a82010-10-12 20:51:21 +00001305 *s = self->input_buffer;
1306 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001307 return n;
1308}
1309
Victor Stinner19ed27e2016-05-20 11:42:37 +02001310/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1311
1312 This should be used for all data reads, rather than accessing the unpickler's
1313 input buffer directly. This method deals correctly with reading from input
1314 streams, which the input buffer doesn't deal with.
1315
1316 Note that when reading from a file-like object, self->next_read_idx won't
1317 be updated (it should remain at 0 for the entire unpickling process). You
1318 should use this function's return value to know how many bytes you can
1319 consume.
1320
1321 Returns -1 (with an exception set) on failure. On success, return the
1322 number of chars read. */
1323#define _Unpickler_Read(self, s, n) \
Victor Stinnerda230562016-05-20 21:16:59 +02001324 (((n) <= (self)->input_len - (self)->next_read_idx) \
Victor Stinner19ed27e2016-05-20 11:42:37 +02001325 ? (*(s) = (self)->input_buffer + (self)->next_read_idx, \
1326 (self)->next_read_idx += (n), \
1327 (n)) \
1328 : _Unpickler_ReadImpl(self, (s), (n)))
1329
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001330static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001331_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1332 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001333{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001334 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001335 if (input_line == NULL) {
1336 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001337 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001338 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001339
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001340 memcpy(input_line, line, len);
1341 input_line[len] = '\0';
1342 self->input_line = input_line;
1343 *result = self->input_line;
1344 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001345}
1346
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001347/* Read a line from the input stream/buffer. If we run off the end of the input
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001348 before hitting \n, raise an error.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001349
1350 Returns the number of chars read, or -1 on failure. */
1351static Py_ssize_t
1352_Unpickler_Readline(UnpicklerObject *self, char **result)
1353{
1354 Py_ssize_t i, num_read;
1355
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001356 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001357 if (self->input_buffer[i] == '\n') {
1358 char *line_start = self->input_buffer + self->next_read_idx;
1359 num_read = i - self->next_read_idx + 1;
1360 self->next_read_idx = i + 1;
1361 return _Unpickler_CopyLine(self, line_start, num_read, result);
1362 }
1363 }
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001364 if (!self->read)
1365 return bad_readline();
Victor Stinner121aab42011-09-29 23:40:53 +02001366
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001367 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1368 if (num_read < 0)
1369 return -1;
1370 if (num_read == 0 || self->input_buffer[num_read - 1] != '\n')
1371 return bad_readline();
1372 self->next_read_idx = num_read;
1373 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001374}
1375
1376/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1377 will be modified in place. */
1378static int
1379_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1380{
1381 Py_ssize_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001382
1383 assert(new_size > self->memo_size);
1384
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05001385 PyObject **memo_new = self->memo;
1386 PyMem_RESIZE(memo_new, PyObject *, new_size);
1387 if (memo_new == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001388 PyErr_NoMemory();
1389 return -1;
1390 }
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05001391 self->memo = memo_new;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001392 for (i = self->memo_size; i < new_size; i++)
1393 self->memo[i] = NULL;
1394 self->memo_size = new_size;
1395 return 0;
1396}
1397
1398/* Returns NULL if idx is out of bounds. */
1399static PyObject *
1400_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1401{
1402 if (idx < 0 || idx >= self->memo_size)
1403 return NULL;
1404
1405 return self->memo[idx];
1406}
1407
1408/* Returns -1 (with an exception set) on failure, 0 on success.
1409 This takes its own reference to `value`. */
1410static int
1411_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1412{
1413 PyObject *old_item;
1414
1415 if (idx >= self->memo_size) {
1416 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1417 return -1;
1418 assert(idx < self->memo_size);
1419 }
1420 Py_INCREF(value);
1421 old_item = self->memo[idx];
1422 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001423 if (old_item != NULL) {
1424 Py_DECREF(old_item);
1425 }
1426 else {
1427 self->memo_len++;
1428 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001429 return 0;
1430}
1431
1432static PyObject **
1433_Unpickler_NewMemo(Py_ssize_t new_size)
1434{
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001435 PyObject **memo = PyMem_NEW(PyObject *, new_size);
Victor Stinner42024562013-07-12 00:53:57 +02001436 if (memo == NULL) {
1437 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001438 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001439 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001440 memset(memo, 0, new_size * sizeof(PyObject *));
1441 return memo;
1442}
1443
1444/* Free the unpickler's memo, taking care to decref any items left in it. */
1445static void
1446_Unpickler_MemoCleanup(UnpicklerObject *self)
1447{
1448 Py_ssize_t i;
1449 PyObject **memo = self->memo;
1450
1451 if (self->memo == NULL)
1452 return;
1453 self->memo = NULL;
1454 i = self->memo_size;
1455 while (--i >= 0) {
1456 Py_XDECREF(memo[i]);
1457 }
1458 PyMem_FREE(memo);
1459}
1460
1461static UnpicklerObject *
1462_Unpickler_New(void)
1463{
1464 UnpicklerObject *self;
1465
1466 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1467 if (self == NULL)
1468 return NULL;
1469
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001470 self->pers_func = NULL;
1471 self->input_buffer = NULL;
1472 self->input_line = NULL;
1473 self->input_len = 0;
1474 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001475 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001476 self->read = NULL;
1477 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001478 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001479 self->encoding = NULL;
1480 self->errors = NULL;
1481 self->marks = NULL;
1482 self->num_marks = 0;
1483 self->marks_size = 0;
1484 self->proto = 0;
1485 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001486 memset(&self->buffer, 0, sizeof(Py_buffer));
1487 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001488 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001489 self->memo = _Unpickler_NewMemo(self->memo_size);
1490 self->stack = (Pdata *)Pdata_New();
1491
1492 if (self->memo == NULL || self->stack == NULL) {
1493 Py_DECREF(self);
1494 return NULL;
1495 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001496
1497 return self;
1498}
1499
1500/* Returns -1 (with an exception set) on failure, 0 on success. This may
1501 be called once on a freshly created Pickler. */
1502static int
1503_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1504{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001505 _Py_IDENTIFIER(peek);
1506 _Py_IDENTIFIER(read);
1507 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001508
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001509 if (_PyObject_LookupAttrId(file, &PyId_peek, &self->peek) < 0) {
1510 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001511 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001512 (void)_PyObject_LookupAttrId(file, &PyId_read, &self->read);
1513 (void)_PyObject_LookupAttrId(file, &PyId_readline, &self->readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001514 if (self->readline == NULL || self->read == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001515 if (!PyErr_Occurred()) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001516 PyErr_SetString(PyExc_TypeError,
1517 "file must have 'read' and 'readline' attributes");
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001518 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001519 Py_CLEAR(self->read);
1520 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001521 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001522 return -1;
1523 }
1524 return 0;
1525}
1526
1527/* Returns -1 (with an exception set) on failure, 0 on success. This may
1528 be called once on a freshly created Pickler. */
1529static int
1530_Unpickler_SetInputEncoding(UnpicklerObject *self,
1531 const char *encoding,
1532 const char *errors)
1533{
1534 if (encoding == NULL)
1535 encoding = "ASCII";
1536 if (errors == NULL)
1537 errors = "strict";
1538
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001539 self->encoding = _PyMem_Strdup(encoding);
1540 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001541 if (self->encoding == NULL || self->errors == NULL) {
1542 PyErr_NoMemory();
1543 return -1;
1544 }
1545 return 0;
1546}
1547
1548/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001549static int
1550memo_get(PicklerObject *self, PyObject *key)
1551{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001552 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001553 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001554 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001555
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001556 value = PyMemoTable_Get(self->memo, key);
1557 if (value == NULL) {
1558 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001559 return -1;
1560 }
1561
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001562 if (!self->bin) {
1563 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001564 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1565 "%" PY_FORMAT_SIZE_T "d\n", *value);
1566 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001567 }
1568 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001569 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001570 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001571 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001572 len = 2;
1573 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001574 else if ((size_t)*value <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001575 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001576 pdata[1] = (unsigned char)(*value & 0xff);
1577 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1578 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1579 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001580 len = 5;
1581 }
1582 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001583 PickleState *st = _Pickle_GetGlobalState();
1584 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001585 "memo id too large for LONG_BINGET");
1586 return -1;
1587 }
1588 }
1589
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001590 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001591 return -1;
1592
1593 return 0;
1594}
1595
1596/* Store an object in the memo, assign it a new unique ID based on the number
1597 of objects currently stored in the memo and generate a PUT opcode. */
1598static int
1599memo_put(PicklerObject *self, PyObject *obj)
1600{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001601 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001602 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001603 Py_ssize_t idx;
1604
1605 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001606
1607 if (self->fast)
1608 return 0;
1609
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001610 idx = PyMemoTable_Size(self->memo);
1611 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1612 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001613
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001614 if (self->proto >= 4) {
1615 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1616 return -1;
1617 return 0;
1618 }
1619 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001620 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001621 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001622 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001623 len = strlen(pdata);
1624 }
1625 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001626 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001627 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001628 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001629 len = 2;
1630 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001631 else if ((size_t)idx <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001632 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001633 pdata[1] = (unsigned char)(idx & 0xff);
1634 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1635 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1636 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001637 len = 5;
1638 }
1639 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001640 PickleState *st = _Pickle_GetGlobalState();
1641 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001642 "memo id too large for LONG_BINPUT");
1643 return -1;
1644 }
1645 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001646 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001647 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001648
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001649 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001650}
1651
1652static PyObject *
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001653get_dotted_path(PyObject *obj, PyObject *name)
1654{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001655 _Py_static_string(PyId_dot, ".");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001656 PyObject *dotted_path;
1657 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001658
1659 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001660 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001661 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001662 n = PyList_GET_SIZE(dotted_path);
1663 assert(n >= 1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001664 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001665 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001666 if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001667 if (obj == NULL)
1668 PyErr_Format(PyExc_AttributeError,
1669 "Can't pickle local object %R", name);
1670 else
1671 PyErr_Format(PyExc_AttributeError,
1672 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001673 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001674 return NULL;
1675 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001676 }
1677 return dotted_path;
1678}
1679
1680static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001681get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001682{
1683 Py_ssize_t i, n;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001684 PyObject *parent = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001685
1686 assert(PyList_CheckExact(names));
1687 Py_INCREF(obj);
1688 n = PyList_GET_SIZE(names);
1689 for (i = 0; i < n; i++) {
1690 PyObject *name = PyList_GET_ITEM(names, i);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001691 Py_XDECREF(parent);
1692 parent = obj;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001693 (void)_PyObject_LookupAttr(parent, name, &obj);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001694 if (obj == NULL) {
1695 Py_DECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001696 return NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001697 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001698 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001699 if (pparent != NULL)
1700 *pparent = parent;
1701 else
1702 Py_XDECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001703 return obj;
1704}
1705
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001706
1707static PyObject *
1708getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1709{
1710 PyObject *dotted_path, *attr;
1711
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001712 if (allow_qualname) {
1713 dotted_path = get_dotted_path(obj, name);
1714 if (dotted_path == NULL)
1715 return NULL;
1716 attr = get_deep_attribute(obj, dotted_path, NULL);
1717 Py_DECREF(dotted_path);
1718 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001719 else {
1720 (void)_PyObject_LookupAttr(obj, name, &attr);
1721 }
1722 if (attr == NULL && !PyErr_Occurred()) {
1723 PyErr_Format(PyExc_AttributeError,
1724 "Can't get attribute %R on %R", name, obj);
1725 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001726 return attr;
1727}
1728
Eric Snow3f9eee62017-09-15 16:35:20 -06001729static int
1730_checkmodule(PyObject *module_name, PyObject *module,
1731 PyObject *global, PyObject *dotted_path)
1732{
1733 if (module == Py_None) {
1734 return -1;
1735 }
1736 if (PyUnicode_Check(module_name) &&
1737 _PyUnicode_EqualToASCIIString(module_name, "__main__")) {
1738 return -1;
1739 }
1740
1741 PyObject *candidate = get_deep_attribute(module, dotted_path, NULL);
1742 if (candidate == NULL) {
Eric Snow3f9eee62017-09-15 16:35:20 -06001743 return -1;
1744 }
1745 if (candidate != global) {
1746 Py_DECREF(candidate);
1747 return -1;
1748 }
1749 Py_DECREF(candidate);
1750 return 0;
1751}
1752
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001753static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001754whichmodule(PyObject *global, PyObject *dotted_path)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001755{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001756 PyObject *module_name;
Eric Snow3f9eee62017-09-15 16:35:20 -06001757 PyObject *module = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001758 Py_ssize_t i;
Eric Snow3f9eee62017-09-15 16:35:20 -06001759 PyObject *modules;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001760 _Py_IDENTIFIER(__module__);
1761 _Py_IDENTIFIER(modules);
1762 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001763
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001764 if (_PyObject_LookupAttrId(global, &PyId___module__, &module_name) < 0) {
1765 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001766 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001767 if (module_name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001768 /* In some rare cases (e.g., bound methods of extension types),
1769 __module__ can be None. If it is so, then search sys.modules for
1770 the module of global. */
1771 if (module_name != Py_None)
1772 return module_name;
1773 Py_CLEAR(module_name);
1774 }
1775 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001776
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001777 /* Fallback on walking sys.modules */
Eric Snow3f9eee62017-09-15 16:35:20 -06001778 modules = _PySys_GetObjectId(&PyId_modules);
1779 if (modules == NULL) {
Victor Stinner1e53bba2013-07-16 22:26:05 +02001780 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001781 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001782 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001783 if (PyDict_CheckExact(modules)) {
1784 i = 0;
1785 while (PyDict_Next(modules, &i, &module_name, &module)) {
1786 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1787 Py_INCREF(module_name);
1788 return module_name;
1789 }
1790 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001791 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001792 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001793 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001794 }
1795 else {
1796 PyObject *iterator = PyObject_GetIter(modules);
1797 if (iterator == NULL) {
1798 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001799 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001800 while ((module_name = PyIter_Next(iterator))) {
1801 module = PyObject_GetItem(modules, module_name);
1802 if (module == NULL) {
1803 Py_DECREF(module_name);
1804 Py_DECREF(iterator);
1805 return NULL;
1806 }
1807 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1808 Py_DECREF(module);
1809 Py_DECREF(iterator);
1810 return module_name;
1811 }
1812 Py_DECREF(module);
1813 Py_DECREF(module_name);
1814 if (PyErr_Occurred()) {
1815 Py_DECREF(iterator);
1816 return NULL;
1817 }
1818 }
1819 Py_DECREF(iterator);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001820 }
1821
1822 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001823 module_name = _PyUnicode_FromId(&PyId___main__);
Victor Stinneraf46eb82017-09-05 23:30:16 +02001824 Py_XINCREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001825 return module_name;
1826}
1827
1828/* fast_save_enter() and fast_save_leave() are guards against recursive
1829 objects when Pickler is used with the "fast mode" (i.e., with object
1830 memoization disabled). If the nesting of a list or dict object exceed
1831 FAST_NESTING_LIMIT, these guards will start keeping an internal
1832 reference to the seen list or dict objects and check whether these objects
1833 are recursive. These are not strictly necessary, since save() has a
1834 hard-coded recursion limit, but they give a nicer error message than the
1835 typical RuntimeError. */
1836static int
1837fast_save_enter(PicklerObject *self, PyObject *obj)
1838{
1839 /* if fast_nesting < 0, we're doing an error exit. */
1840 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1841 PyObject *key = NULL;
1842 if (self->fast_memo == NULL) {
1843 self->fast_memo = PyDict_New();
1844 if (self->fast_memo == NULL) {
1845 self->fast_nesting = -1;
1846 return 0;
1847 }
1848 }
1849 key = PyLong_FromVoidPtr(obj);
Mat Mf76231f2017-11-13 02:50:16 -05001850 if (key == NULL) {
1851 self->fast_nesting = -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001852 return 0;
Mat Mf76231f2017-11-13 02:50:16 -05001853 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001854 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001855 Py_DECREF(key);
1856 PyErr_Format(PyExc_ValueError,
1857 "fast mode: can't pickle cyclic objects "
1858 "including object type %.200s at %p",
1859 obj->ob_type->tp_name, obj);
1860 self->fast_nesting = -1;
1861 return 0;
1862 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001863 if (PyErr_Occurred()) {
Mat Mf76231f2017-11-13 02:50:16 -05001864 Py_DECREF(key);
1865 self->fast_nesting = -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001866 return 0;
1867 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001868 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1869 Py_DECREF(key);
1870 self->fast_nesting = -1;
1871 return 0;
1872 }
1873 Py_DECREF(key);
1874 }
1875 return 1;
1876}
1877
1878static int
1879fast_save_leave(PicklerObject *self, PyObject *obj)
1880{
1881 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1882 PyObject *key = PyLong_FromVoidPtr(obj);
1883 if (key == NULL)
1884 return 0;
1885 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1886 Py_DECREF(key);
1887 return 0;
1888 }
1889 Py_DECREF(key);
1890 }
1891 return 1;
1892}
1893
1894static int
1895save_none(PicklerObject *self, PyObject *obj)
1896{
1897 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001898 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001899 return -1;
1900
1901 return 0;
1902}
1903
1904static int
1905save_bool(PicklerObject *self, PyObject *obj)
1906{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001907 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001908 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001909 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001910 return -1;
1911 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001912 else {
1913 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1914 * so that unpicklers written before bools were introduced unpickle them
1915 * as ints, but unpicklers after can recognize that bools were intended.
1916 * Note that protocol 2 added direct ways to pickle bools.
1917 */
1918 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1919 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1920 return -1;
1921 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001922 return 0;
1923}
1924
1925static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001926save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001927{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001928 PyObject *repr = NULL;
1929 Py_ssize_t size;
1930 long val;
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001931 int overflow;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001932 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001933
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001934 val= PyLong_AsLongAndOverflow(obj, &overflow);
1935 if (!overflow && (sizeof(long) <= 4 ||
1936 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1))))
1937 {
Larry Hastings61272b72014-01-07 12:41:53 -08001938 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001939
1940 Note: we can't use -0x80000000L in the above condition because some
1941 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1942 before applying the unary minus when sizeof(long) <= 4. The
1943 resulting value stays unsigned which is commonly not what we want,
1944 so MSVC happily warns us about it. However, that result would have
1945 been fine because we guard for sizeof(long) <= 4 which turns the
1946 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001947 char pdata[32];
1948 Py_ssize_t len = 0;
1949
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001950 if (self->bin) {
1951 pdata[1] = (unsigned char)(val & 0xff);
1952 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1953 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1954 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001955
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001956 if ((pdata[4] != 0) || (pdata[3] != 0)) {
1957 pdata[0] = BININT;
1958 len = 5;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001959 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001960 else if (pdata[2] != 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001961 pdata[0] = BININT2;
1962 len = 3;
1963 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001964 else {
1965 pdata[0] = BININT1;
1966 len = 2;
1967 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001968 }
1969 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001970 sprintf(pdata, "%c%ld\n", INT, val);
1971 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001973 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001974 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001975
1976 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001977 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02001978 assert(!PyErr_Occurred());
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001979
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001980 if (self->proto >= 2) {
1981 /* Linear-time pickling. */
1982 size_t nbits;
1983 size_t nbytes;
1984 unsigned char *pdata;
1985 char header[5];
1986 int i;
1987 int sign = _PyLong_Sign(obj);
1988
1989 if (sign == 0) {
1990 header[0] = LONG1;
1991 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001992 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001993 goto error;
1994 return 0;
1995 }
1996 nbits = _PyLong_NumBits(obj);
1997 if (nbits == (size_t)-1 && PyErr_Occurred())
1998 goto error;
1999 /* How many bytes do we need? There are nbits >> 3 full
2000 * bytes of data, and nbits & 7 leftover bits. If there
2001 * are any leftover bits, then we clearly need another
2002 * byte. Wnat's not so obvious is that we *probably*
2003 * need another byte even if there aren't any leftovers:
2004 * the most-significant bit of the most-significant byte
2005 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03002006 * opposite of the one we need. The exception is ints
2007 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002008 * its own 256's-complement, so has the right sign bit
2009 * even without the extra byte. That's a pain to check
2010 * for in advance, though, so we always grab an extra
2011 * byte at the start, and cut it back later if possible.
2012 */
2013 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01002014 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002015 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03002016 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002017 goto error;
2018 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002019 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002020 if (repr == NULL)
2021 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002022 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002023 i = _PyLong_AsByteArray((PyLongObject *)obj,
2024 pdata, nbytes,
2025 1 /* little endian */ , 1 /* signed */ );
2026 if (i < 0)
2027 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03002028 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002029 * needed. This is so iff the MSB is all redundant sign
2030 * bits.
2031 */
2032 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02002033 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002034 pdata[nbytes - 1] == 0xff &&
2035 (pdata[nbytes - 2] & 0x80) != 0) {
2036 nbytes--;
2037 }
2038
2039 if (nbytes < 256) {
2040 header[0] = LONG1;
2041 header[1] = (unsigned char)nbytes;
2042 size = 2;
2043 }
2044 else {
2045 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002046 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002047 for (i = 1; i < 5; i++) {
2048 header[i] = (unsigned char)(size & 0xff);
2049 size >>= 8;
2050 }
2051 size = 5;
2052 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002053 if (_Pickler_Write(self, header, size) < 0 ||
2054 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002055 goto error;
2056 }
2057 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002058 const char long_op = LONG;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002059 const char *string;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002060
Mark Dickinson8dd05142009-01-20 20:43:58 +00002061 /* proto < 2: write the repr and newline. This is quadratic-time (in
2062 the number of digits), in both directions. We add a trailing 'L'
2063 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002064
2065 repr = PyObject_Repr(obj);
2066 if (repr == NULL)
2067 goto error;
2068
Serhiy Storchaka06515832016-11-20 09:13:07 +02002069 string = PyUnicode_AsUTF8AndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002070 if (string == NULL)
2071 goto error;
2072
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002073 if (_Pickler_Write(self, &long_op, 1) < 0 ||
2074 _Pickler_Write(self, string, size) < 0 ||
2075 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002076 goto error;
2077 }
2078
2079 if (0) {
2080 error:
2081 status = -1;
2082 }
2083 Py_XDECREF(repr);
2084
2085 return status;
2086}
2087
2088static int
2089save_float(PicklerObject *self, PyObject *obj)
2090{
2091 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
2092
2093 if (self->bin) {
2094 char pdata[9];
2095 pdata[0] = BINFLOAT;
2096 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
2097 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002098 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002099 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02002100 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002101 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00002102 int result = -1;
2103 char *buf = NULL;
2104 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002105
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002106 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002107 goto done;
2108
Serhiy Storchakac86ca262015-02-15 14:18:32 +02002109 buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00002110 if (!buf) {
2111 PyErr_NoMemory();
2112 goto done;
2113 }
2114
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002115 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002116 goto done;
2117
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002118 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002119 goto done;
2120
2121 result = 0;
2122done:
2123 PyMem_Free(buf);
2124 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002125 }
2126
2127 return 0;
2128}
2129
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002130/* Perform direct write of the header and payload of the binary object.
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002131
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002132 The large contiguous data is written directly into the underlying file
2133 object, bypassing the output_buffer of the Pickler. We intentionally
2134 do not insert a protocol 4 frame opcode to make it possible to optimize
2135 file.read calls in the loader.
2136 */
2137static int
2138_Pickler_write_bytes(PicklerObject *self,
2139 const char *header, Py_ssize_t header_size,
2140 const char *data, Py_ssize_t data_size,
2141 PyObject *payload)
2142{
2143 int bypass_buffer = (data_size >= FRAME_SIZE_TARGET);
2144 int framing = self->framing;
2145
2146 if (bypass_buffer) {
2147 assert(self->output_buffer != NULL);
2148 /* Commit the previous frame. */
2149 if (_Pickler_CommitFrame(self)) {
2150 return -1;
2151 }
2152 /* Disable framing temporarily */
2153 self->framing = 0;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002154 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002155
2156 if (_Pickler_Write(self, header, header_size) < 0) {
2157 return -1;
2158 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002159
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002160 if (bypass_buffer && self->write != NULL) {
2161 /* Bypass the in-memory buffer to directly stream large data
2162 into the underlying file object. */
2163 PyObject *result, *mem = NULL;
2164 /* Dump the output buffer to the file. */
2165 if (_Pickler_FlushToFile(self) < 0) {
2166 return -1;
2167 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002168
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002169 /* Stream write the payload into the file without going through the
2170 output buffer. */
2171 if (payload == NULL) {
Serhiy Storchaka5b76bdb2018-01-13 00:28:31 +02002172 /* TODO: It would be better to use a memoryview with a linked
2173 original string if this is possible. */
2174 payload = mem = PyBytes_FromStringAndSize(data, data_size);
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002175 if (payload == NULL) {
2176 return -1;
2177 }
2178 }
2179 result = PyObject_CallFunctionObjArgs(self->write, payload, NULL);
2180 Py_XDECREF(mem);
2181 if (result == NULL) {
2182 return -1;
2183 }
2184 Py_DECREF(result);
2185
2186 /* Reinitialize the buffer for subsequent calls to _Pickler_Write. */
2187 if (_Pickler_ClearBuffer(self) < 0) {
2188 return -1;
2189 }
2190 }
2191 else {
2192 if (_Pickler_Write(self, data, data_size) < 0) {
2193 return -1;
2194 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002195 }
2196
2197 /* Re-enable framing for subsequent calls to _Pickler_Write. */
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002198 self->framing = framing;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002199
2200 return 0;
2201}
2202
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002203static int
2204save_bytes(PicklerObject *self, PyObject *obj)
2205{
2206 if (self->proto < 3) {
2207 /* Older pickle protocols do not have an opcode for pickling bytes
2208 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002209 the __reduce__ method) to permit bytes object unpickling.
2210
2211 Here we use a hack to be compatible with Python 2. Since in Python
2212 2 'bytes' is just an alias for 'str' (which has different
2213 parameters than the actual bytes object), we use codecs.encode
2214 to create the appropriate 'str' object when unpickled using
2215 Python 2 *and* the appropriate 'bytes' object when unpickled
2216 using Python 3. Again this is a hack and we don't need to do this
2217 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002218 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002219 int status;
2220
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002221 if (PyBytes_GET_SIZE(obj) == 0) {
2222 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2223 }
2224 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002225 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002226 PyObject *unicode_str =
2227 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2228 PyBytes_GET_SIZE(obj),
2229 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002230 _Py_IDENTIFIER(latin1);
2231
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002232 if (unicode_str == NULL)
2233 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002234 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002235 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002236 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002237 Py_DECREF(unicode_str);
2238 }
2239
2240 if (reduce_value == NULL)
2241 return -1;
2242
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002243 /* save_reduce() will memoize the object automatically. */
2244 status = save_reduce(self, reduce_value, obj);
2245 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002246 return status;
2247 }
2248 else {
2249 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002250 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002251 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002252
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002253 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002254 if (size < 0)
2255 return -1;
2256
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002257 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002258 header[0] = SHORT_BINBYTES;
2259 header[1] = (unsigned char)size;
2260 len = 2;
2261 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03002262 else if ((size_t)size <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002263 header[0] = BINBYTES;
2264 header[1] = (unsigned char)(size & 0xff);
2265 header[2] = (unsigned char)((size >> 8) & 0xff);
2266 header[3] = (unsigned char)((size >> 16) & 0xff);
2267 header[4] = (unsigned char)((size >> 24) & 0xff);
2268 len = 5;
2269 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002270 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002271 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002272 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002273 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002274 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002275 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002276 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002277 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002278 return -1; /* string too large */
2279 }
2280
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002281 if (_Pickler_write_bytes(self, header, len,
2282 PyBytes_AS_STRING(obj), size, obj) < 0)
2283 {
2284 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002285 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002286
2287 if (memo_put(self, obj) < 0)
2288 return -1;
2289
2290 return 0;
2291 }
2292}
2293
2294/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2295 backslash and newline characters to \uXXXX escapes. */
2296static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002297raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002298{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002299 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002300 Py_ssize_t i, size;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002301 void *data;
2302 unsigned int kind;
Victor Stinner358af132015-10-12 22:36:57 +02002303 _PyBytesWriter writer;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002304
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002305 if (PyUnicode_READY(obj))
2306 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002307
Victor Stinner358af132015-10-12 22:36:57 +02002308 _PyBytesWriter_Init(&writer);
2309
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002310 size = PyUnicode_GET_LENGTH(obj);
2311 data = PyUnicode_DATA(obj);
2312 kind = PyUnicode_KIND(obj);
Victor Stinner121aab42011-09-29 23:40:53 +02002313
Victor Stinner358af132015-10-12 22:36:57 +02002314 p = _PyBytesWriter_Alloc(&writer, size);
2315 if (p == NULL)
2316 goto error;
2317 writer.overallocate = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002318
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002319 for (i=0; i < size; i++) {
2320 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002321 /* Map 32-bit characters to '\Uxxxxxxxx' */
2322 if (ch >= 0x10000) {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002323 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002324 p = _PyBytesWriter_Prepare(&writer, p, 10-1);
2325 if (p == NULL)
2326 goto error;
2327
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002328 *p++ = '\\';
2329 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002330 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2331 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2332 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2333 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2334 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2335 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2336 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2337 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002338 }
Victor Stinner358af132015-10-12 22:36:57 +02002339 /* Map 16-bit characters, '\\' and '\n' to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002340 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002341 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002342 p = _PyBytesWriter_Prepare(&writer, p, 6-1);
2343 if (p == NULL)
2344 goto error;
2345
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002346 *p++ = '\\';
2347 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002348 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2349 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2350 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2351 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002352 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002353 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002354 else
2355 *p++ = (char) ch;
2356 }
Victor Stinner358af132015-10-12 22:36:57 +02002357
2358 return _PyBytesWriter_Finish(&writer, p);
2359
2360error:
2361 _PyBytesWriter_Dealloc(&writer);
2362 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002363}
2364
2365static int
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002366write_unicode_binary(PicklerObject *self, PyObject *obj)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002367{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002368 char header[9];
2369 Py_ssize_t len;
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002370 PyObject *encoded = NULL;
2371 Py_ssize_t size;
2372 const char *data;
2373
2374 if (PyUnicode_READY(obj))
2375 return -1;
2376
2377 data = PyUnicode_AsUTF8AndSize(obj, &size);
2378 if (data == NULL) {
2379 /* Issue #8383: for strings with lone surrogates, fallback on the
2380 "surrogatepass" error handler. */
2381 PyErr_Clear();
2382 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2383 if (encoded == NULL)
2384 return -1;
2385
2386 data = PyBytes_AS_STRING(encoded);
2387 size = PyBytes_GET_SIZE(encoded);
2388 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002389
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002390 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002391 if (size <= 0xff && self->proto >= 4) {
2392 header[0] = SHORT_BINUNICODE;
2393 header[1] = (unsigned char)(size & 0xff);
2394 len = 2;
2395 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002396 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002397 header[0] = BINUNICODE;
2398 header[1] = (unsigned char)(size & 0xff);
2399 header[2] = (unsigned char)((size >> 8) & 0xff);
2400 header[3] = (unsigned char)((size >> 16) & 0xff);
2401 header[4] = (unsigned char)((size >> 24) & 0xff);
2402 len = 5;
2403 }
2404 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002405 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002406 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002407 len = 9;
2408 }
2409 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002410 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002411 "cannot serialize a string larger than 4GiB");
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002412 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002413 return -1;
2414 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002415
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002416 if (_Pickler_write_bytes(self, header, len, data, size, encoded) < 0) {
2417 Py_XDECREF(encoded);
2418 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002419 }
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002420 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002421 return 0;
2422}
2423
2424static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002425save_unicode(PicklerObject *self, PyObject *obj)
2426{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002427 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002428 if (write_unicode_binary(self, obj) < 0)
2429 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002430 }
2431 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002432 PyObject *encoded;
2433 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002434 const char unicode_op = UNICODE;
2435
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002436 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002437 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002438 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002439
Antoine Pitrou299978d2013-04-07 17:38:11 +02002440 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2441 Py_DECREF(encoded);
2442 return -1;
2443 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002444
2445 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002446 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2447 Py_DECREF(encoded);
2448 return -1;
2449 }
2450 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002451
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002452 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002453 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002454 }
2455 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002456 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002457
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002458 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002459}
2460
2461/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2462static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002463store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002464{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002465 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002466
2467 assert(PyTuple_Size(t) == len);
2468
2469 for (i = 0; i < len; i++) {
2470 PyObject *element = PyTuple_GET_ITEM(t, i);
2471
2472 if (element == NULL)
2473 return -1;
2474 if (save(self, element, 0) < 0)
2475 return -1;
2476 }
2477
2478 return 0;
2479}
2480
2481/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2482 * used across protocols to minimize the space needed to pickle them.
2483 * Tuples are also the only builtin immutable type that can be recursive
2484 * (a tuple can be reached from itself), and that requires some subtle
2485 * magic so that it works in all cases. IOW, this is a long routine.
2486 */
2487static int
2488save_tuple(PicklerObject *self, PyObject *obj)
2489{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002490 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002491
2492 const char mark_op = MARK;
2493 const char tuple_op = TUPLE;
2494 const char pop_op = POP;
2495 const char pop_mark_op = POP_MARK;
2496 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2497
2498 if ((len = PyTuple_Size(obj)) < 0)
2499 return -1;
2500
2501 if (len == 0) {
2502 char pdata[2];
2503
2504 if (self->proto) {
2505 pdata[0] = EMPTY_TUPLE;
2506 len = 1;
2507 }
2508 else {
2509 pdata[0] = MARK;
2510 pdata[1] = TUPLE;
2511 len = 2;
2512 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002513 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002514 return -1;
2515 return 0;
2516 }
2517
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002518 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002519 * saving the tuple elements, the tuple must be recursive, in
2520 * which case we'll pop everything we put on the stack, and fetch
2521 * its value from the memo.
2522 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002523 if (len <= 3 && self->proto >= 2) {
2524 /* Use TUPLE{1,2,3} opcodes. */
2525 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002526 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002527
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002528 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002529 /* pop the len elements */
2530 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002531 if (_Pickler_Write(self, &pop_op, 1) < 0)
2532 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002533 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002534 if (memo_get(self, obj) < 0)
2535 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002536
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002537 return 0;
2538 }
2539 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002540 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2541 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002542 }
2543 goto memoize;
2544 }
2545
2546 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2547 * Generate MARK e1 e2 ... TUPLE
2548 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002549 if (_Pickler_Write(self, &mark_op, 1) < 0)
2550 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002551
2552 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002553 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002554
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002555 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002556 /* pop the stack stuff we pushed */
2557 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002558 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2559 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002560 }
2561 else {
2562 /* Note that we pop one more than len, to remove
2563 * the MARK too.
2564 */
2565 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002566 if (_Pickler_Write(self, &pop_op, 1) < 0)
2567 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002568 }
2569 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002570 if (memo_get(self, obj) < 0)
2571 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002572
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002573 return 0;
2574 }
2575 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002576 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2577 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002578 }
2579
2580 memoize:
2581 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002582 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002583
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002584 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002585}
2586
2587/* iter is an iterator giving items, and we batch up chunks of
2588 * MARK item item ... item APPENDS
2589 * opcode sequences. Calling code should have arranged to first create an
2590 * empty list, or list-like object, for the APPENDS to operate on.
2591 * Returns 0 on success, <0 on error.
2592 */
2593static int
2594batch_list(PicklerObject *self, PyObject *iter)
2595{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002596 PyObject *obj = NULL;
2597 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002598 int i, n;
2599
2600 const char mark_op = MARK;
2601 const char append_op = APPEND;
2602 const char appends_op = APPENDS;
2603
2604 assert(iter != NULL);
2605
2606 /* XXX: I think this function could be made faster by avoiding the
2607 iterator interface and fetching objects directly from list using
2608 PyList_GET_ITEM.
2609 */
2610
2611 if (self->proto == 0) {
2612 /* APPENDS isn't available; do one at a time. */
2613 for (;;) {
2614 obj = PyIter_Next(iter);
2615 if (obj == NULL) {
2616 if (PyErr_Occurred())
2617 return -1;
2618 break;
2619 }
2620 i = save(self, obj, 0);
2621 Py_DECREF(obj);
2622 if (i < 0)
2623 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002624 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002625 return -1;
2626 }
2627 return 0;
2628 }
2629
2630 /* proto > 0: write in batches of BATCHSIZE. */
2631 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002632 /* Get first item */
2633 firstitem = PyIter_Next(iter);
2634 if (firstitem == NULL) {
2635 if (PyErr_Occurred())
2636 goto error;
2637
2638 /* nothing more to add */
2639 break;
2640 }
2641
2642 /* Try to get a second item */
2643 obj = PyIter_Next(iter);
2644 if (obj == NULL) {
2645 if (PyErr_Occurred())
2646 goto error;
2647
2648 /* Only one item to write */
2649 if (save(self, firstitem, 0) < 0)
2650 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002651 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002652 goto error;
2653 Py_CLEAR(firstitem);
2654 break;
2655 }
2656
2657 /* More than one item to write */
2658
2659 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002660 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002661 goto error;
2662
2663 if (save(self, firstitem, 0) < 0)
2664 goto error;
2665 Py_CLEAR(firstitem);
2666 n = 1;
2667
2668 /* Fetch and save up to BATCHSIZE items */
2669 while (obj) {
2670 if (save(self, obj, 0) < 0)
2671 goto error;
2672 Py_CLEAR(obj);
2673 n += 1;
2674
2675 if (n == BATCHSIZE)
2676 break;
2677
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002678 obj = PyIter_Next(iter);
2679 if (obj == NULL) {
2680 if (PyErr_Occurred())
2681 goto error;
2682 break;
2683 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002684 }
2685
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002686 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002687 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002688
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002689 } while (n == BATCHSIZE);
2690 return 0;
2691
2692 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002693 Py_XDECREF(firstitem);
2694 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002695 return -1;
2696}
2697
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002698/* This is a variant of batch_list() above, specialized for lists (with no
2699 * support for list subclasses). Like batch_list(), we batch up chunks of
2700 * MARK item item ... item APPENDS
2701 * opcode sequences. Calling code should have arranged to first create an
2702 * empty list, or list-like object, for the APPENDS to operate on.
2703 * Returns 0 on success, -1 on error.
2704 *
2705 * This version is considerably faster than batch_list(), if less general.
2706 *
2707 * Note that this only works for protocols > 0.
2708 */
2709static int
2710batch_list_exact(PicklerObject *self, PyObject *obj)
2711{
2712 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002713 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002714
2715 const char append_op = APPEND;
2716 const char appends_op = APPENDS;
2717 const char mark_op = MARK;
2718
2719 assert(obj != NULL);
2720 assert(self->proto > 0);
2721 assert(PyList_CheckExact(obj));
2722
2723 if (PyList_GET_SIZE(obj) == 1) {
2724 item = PyList_GET_ITEM(obj, 0);
2725 if (save(self, item, 0) < 0)
2726 return -1;
2727 if (_Pickler_Write(self, &append_op, 1) < 0)
2728 return -1;
2729 return 0;
2730 }
2731
2732 /* Write in batches of BATCHSIZE. */
2733 total = 0;
2734 do {
2735 this_batch = 0;
2736 if (_Pickler_Write(self, &mark_op, 1) < 0)
2737 return -1;
2738 while (total < PyList_GET_SIZE(obj)) {
2739 item = PyList_GET_ITEM(obj, total);
2740 if (save(self, item, 0) < 0)
2741 return -1;
2742 total++;
2743 if (++this_batch == BATCHSIZE)
2744 break;
2745 }
2746 if (_Pickler_Write(self, &appends_op, 1) < 0)
2747 return -1;
2748
2749 } while (total < PyList_GET_SIZE(obj));
2750
2751 return 0;
2752}
2753
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002754static int
2755save_list(PicklerObject *self, PyObject *obj)
2756{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002757 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002758 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002759 int status = 0;
2760
2761 if (self->fast && !fast_save_enter(self, obj))
2762 goto error;
2763
2764 /* Create an empty list. */
2765 if (self->bin) {
2766 header[0] = EMPTY_LIST;
2767 len = 1;
2768 }
2769 else {
2770 header[0] = MARK;
2771 header[1] = LIST;
2772 len = 2;
2773 }
2774
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002775 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002776 goto error;
2777
2778 /* Get list length, and bow out early if empty. */
2779 if ((len = PyList_Size(obj)) < 0)
2780 goto error;
2781
2782 if (memo_put(self, obj) < 0)
2783 goto error;
2784
2785 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002786 /* Materialize the list elements. */
2787 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002788 if (Py_EnterRecursiveCall(" while pickling an object"))
2789 goto error;
2790 status = batch_list_exact(self, obj);
2791 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002792 } else {
2793 PyObject *iter = PyObject_GetIter(obj);
2794 if (iter == NULL)
2795 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002796
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002797 if (Py_EnterRecursiveCall(" while pickling an object")) {
2798 Py_DECREF(iter);
2799 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002800 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002801 status = batch_list(self, iter);
2802 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002803 Py_DECREF(iter);
2804 }
2805 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002806 if (0) {
2807 error:
2808 status = -1;
2809 }
2810
2811 if (self->fast && !fast_save_leave(self, obj))
2812 status = -1;
2813
2814 return status;
2815}
2816
2817/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2818 * MARK key value ... key value SETITEMS
2819 * opcode sequences. Calling code should have arranged to first create an
2820 * empty dict, or dict-like object, for the SETITEMS to operate on.
2821 * Returns 0 on success, <0 on error.
2822 *
2823 * This is very much like batch_list(). The difference between saving
2824 * elements directly, and picking apart two-tuples, is so long-winded at
2825 * the C level, though, that attempts to combine these routines were too
2826 * ugly to bear.
2827 */
2828static int
2829batch_dict(PicklerObject *self, PyObject *iter)
2830{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002831 PyObject *obj = NULL;
2832 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002833 int i, n;
2834
2835 const char mark_op = MARK;
2836 const char setitem_op = SETITEM;
2837 const char setitems_op = SETITEMS;
2838
2839 assert(iter != NULL);
2840
2841 if (self->proto == 0) {
2842 /* SETITEMS isn't available; do one at a time. */
2843 for (;;) {
2844 obj = PyIter_Next(iter);
2845 if (obj == NULL) {
2846 if (PyErr_Occurred())
2847 return -1;
2848 break;
2849 }
2850 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2851 PyErr_SetString(PyExc_TypeError, "dict items "
2852 "iterator must return 2-tuples");
2853 return -1;
2854 }
2855 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2856 if (i >= 0)
2857 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2858 Py_DECREF(obj);
2859 if (i < 0)
2860 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002861 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002862 return -1;
2863 }
2864 return 0;
2865 }
2866
2867 /* proto > 0: write in batches of BATCHSIZE. */
2868 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002869 /* Get first item */
2870 firstitem = PyIter_Next(iter);
2871 if (firstitem == NULL) {
2872 if (PyErr_Occurred())
2873 goto error;
2874
2875 /* nothing more to add */
2876 break;
2877 }
2878 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2879 PyErr_SetString(PyExc_TypeError, "dict items "
2880 "iterator must return 2-tuples");
2881 goto error;
2882 }
2883
2884 /* Try to get a second item */
2885 obj = PyIter_Next(iter);
2886 if (obj == NULL) {
2887 if (PyErr_Occurred())
2888 goto error;
2889
2890 /* Only one item to write */
2891 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2892 goto error;
2893 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2894 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002895 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002896 goto error;
2897 Py_CLEAR(firstitem);
2898 break;
2899 }
2900
2901 /* More than one item to write */
2902
2903 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002904 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002905 goto error;
2906
2907 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2908 goto error;
2909 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2910 goto error;
2911 Py_CLEAR(firstitem);
2912 n = 1;
2913
2914 /* Fetch and save up to BATCHSIZE items */
2915 while (obj) {
2916 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2917 PyErr_SetString(PyExc_TypeError, "dict items "
2918 "iterator must return 2-tuples");
2919 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002920 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002921 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2922 save(self, PyTuple_GET_ITEM(obj, 1), 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, &setitems_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
Collin Winter5c9b02d2009-05-25 05:43:30 +00002950/* This is a variant of batch_dict() above that specializes for dicts, with no
2951 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2952 * MARK key value ... key value SETITEMS
2953 * opcode sequences. Calling code should have arranged to first create an
2954 * empty dict, or dict-like object, for the SETITEMS to operate on.
2955 * Returns 0 on success, -1 on error.
2956 *
2957 * Note that this currently doesn't work for protocol 0.
2958 */
2959static int
2960batch_dict_exact(PicklerObject *self, PyObject *obj)
2961{
2962 PyObject *key = NULL, *value = NULL;
2963 int i;
2964 Py_ssize_t dict_size, ppos = 0;
2965
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002966 const char mark_op = MARK;
2967 const char setitem_op = SETITEM;
2968 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002969
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002970 assert(obj != NULL && PyDict_CheckExact(obj));
Collin Winter5c9b02d2009-05-25 05:43:30 +00002971 assert(self->proto > 0);
2972
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002973 dict_size = PyDict_GET_SIZE(obj);
Collin Winter5c9b02d2009-05-25 05:43:30 +00002974
2975 /* Special-case len(d) == 1 to save space. */
2976 if (dict_size == 1) {
2977 PyDict_Next(obj, &ppos, &key, &value);
2978 if (save(self, key, 0) < 0)
2979 return -1;
2980 if (save(self, value, 0) < 0)
2981 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002982 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002983 return -1;
2984 return 0;
2985 }
2986
2987 /* Write in batches of BATCHSIZE. */
2988 do {
2989 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002990 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002991 return -1;
2992 while (PyDict_Next(obj, &ppos, &key, &value)) {
2993 if (save(self, key, 0) < 0)
2994 return -1;
2995 if (save(self, value, 0) < 0)
2996 return -1;
2997 if (++i == BATCHSIZE)
2998 break;
2999 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003000 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003001 return -1;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003002 if (PyDict_GET_SIZE(obj) != dict_size) {
Collin Winter5c9b02d2009-05-25 05:43:30 +00003003 PyErr_Format(
3004 PyExc_RuntimeError,
3005 "dictionary changed size during iteration");
3006 return -1;
3007 }
3008
3009 } while (i == BATCHSIZE);
3010 return 0;
3011}
3012
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003013static int
3014save_dict(PicklerObject *self, PyObject *obj)
3015{
3016 PyObject *items, *iter;
3017 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003018 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003019 int status = 0;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003020 assert(PyDict_Check(obj));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003021
3022 if (self->fast && !fast_save_enter(self, obj))
3023 goto error;
3024
3025 /* Create an empty dict. */
3026 if (self->bin) {
3027 header[0] = EMPTY_DICT;
3028 len = 1;
3029 }
3030 else {
3031 header[0] = MARK;
3032 header[1] = DICT;
3033 len = 2;
3034 }
3035
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003036 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003037 goto error;
3038
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003039 if (memo_put(self, obj) < 0)
3040 goto error;
3041
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003042 if (PyDict_GET_SIZE(obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003043 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00003044 if (PyDict_CheckExact(obj) && self->proto > 0) {
3045 /* We can take certain shortcuts if we know this is a dict and
3046 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003047 if (Py_EnterRecursiveCall(" while pickling an object"))
3048 goto error;
3049 status = batch_dict_exact(self, obj);
3050 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003051 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003052 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003053
Victor Stinnerad8c83a2016-09-05 17:53:15 -07003054 items = _PyObject_CallMethodId(obj, &PyId_items, NULL);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003055 if (items == NULL)
3056 goto error;
3057 iter = PyObject_GetIter(items);
3058 Py_DECREF(items);
3059 if (iter == NULL)
3060 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003061 if (Py_EnterRecursiveCall(" while pickling an object")) {
3062 Py_DECREF(iter);
3063 goto error;
3064 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00003065 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003066 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003067 Py_DECREF(iter);
3068 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003069 }
3070
3071 if (0) {
3072 error:
3073 status = -1;
3074 }
3075
3076 if (self->fast && !fast_save_leave(self, obj))
3077 status = -1;
3078
3079 return status;
3080}
3081
3082static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003083save_set(PicklerObject *self, PyObject *obj)
3084{
3085 PyObject *item;
3086 int i;
3087 Py_ssize_t set_size, ppos = 0;
3088 Py_hash_t hash;
3089
3090 const char empty_set_op = EMPTY_SET;
3091 const char mark_op = MARK;
3092 const char additems_op = ADDITEMS;
3093
3094 if (self->proto < 4) {
3095 PyObject *items;
3096 PyObject *reduce_value;
3097 int status;
3098
3099 items = PySequence_List(obj);
3100 if (items == NULL) {
3101 return -1;
3102 }
3103 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
3104 Py_DECREF(items);
3105 if (reduce_value == NULL) {
3106 return -1;
3107 }
3108 /* save_reduce() will memoize the object automatically. */
3109 status = save_reduce(self, reduce_value, obj);
3110 Py_DECREF(reduce_value);
3111 return status;
3112 }
3113
3114 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
3115 return -1;
3116
3117 if (memo_put(self, obj) < 0)
3118 return -1;
3119
3120 set_size = PySet_GET_SIZE(obj);
3121 if (set_size == 0)
3122 return 0; /* nothing to do */
3123
3124 /* Write in batches of BATCHSIZE. */
3125 do {
3126 i = 0;
3127 if (_Pickler_Write(self, &mark_op, 1) < 0)
3128 return -1;
3129 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
3130 if (save(self, item, 0) < 0)
3131 return -1;
3132 if (++i == BATCHSIZE)
3133 break;
3134 }
3135 if (_Pickler_Write(self, &additems_op, 1) < 0)
3136 return -1;
3137 if (PySet_GET_SIZE(obj) != set_size) {
3138 PyErr_Format(
3139 PyExc_RuntimeError,
3140 "set changed size during iteration");
3141 return -1;
3142 }
3143 } while (i == BATCHSIZE);
3144
3145 return 0;
3146}
3147
3148static int
3149save_frozenset(PicklerObject *self, PyObject *obj)
3150{
3151 PyObject *iter;
3152
3153 const char mark_op = MARK;
3154 const char frozenset_op = FROZENSET;
3155
3156 if (self->fast && !fast_save_enter(self, obj))
3157 return -1;
3158
3159 if (self->proto < 4) {
3160 PyObject *items;
3161 PyObject *reduce_value;
3162 int status;
3163
3164 items = PySequence_List(obj);
3165 if (items == NULL) {
3166 return -1;
3167 }
3168 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
3169 items);
3170 Py_DECREF(items);
3171 if (reduce_value == NULL) {
3172 return -1;
3173 }
3174 /* save_reduce() will memoize the object automatically. */
3175 status = save_reduce(self, reduce_value, obj);
3176 Py_DECREF(reduce_value);
3177 return status;
3178 }
3179
3180 if (_Pickler_Write(self, &mark_op, 1) < 0)
3181 return -1;
3182
3183 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003184 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01003185 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003186 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003187 for (;;) {
3188 PyObject *item;
3189
3190 item = PyIter_Next(iter);
3191 if (item == NULL) {
3192 if (PyErr_Occurred()) {
3193 Py_DECREF(iter);
3194 return -1;
3195 }
3196 break;
3197 }
3198 if (save(self, item, 0) < 0) {
3199 Py_DECREF(item);
3200 Py_DECREF(iter);
3201 return -1;
3202 }
3203 Py_DECREF(item);
3204 }
3205 Py_DECREF(iter);
3206
3207 /* If the object is already in the memo, this means it is
3208 recursive. In this case, throw away everything we put on the
3209 stack, and fetch the object back from the memo. */
3210 if (PyMemoTable_Get(self->memo, obj)) {
3211 const char pop_mark_op = POP_MARK;
3212
3213 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3214 return -1;
3215 if (memo_get(self, obj) < 0)
3216 return -1;
3217 return 0;
3218 }
3219
3220 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3221 return -1;
3222 if (memo_put(self, obj) < 0)
3223 return -1;
3224
3225 return 0;
3226}
3227
3228static int
3229fix_imports(PyObject **module_name, PyObject **global_name)
3230{
3231 PyObject *key;
3232 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003233 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003234
3235 key = PyTuple_Pack(2, *module_name, *global_name);
3236 if (key == NULL)
3237 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003238 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003239 Py_DECREF(key);
3240 if (item) {
3241 PyObject *fixed_module_name;
3242 PyObject *fixed_global_name;
3243
3244 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3245 PyErr_Format(PyExc_RuntimeError,
3246 "_compat_pickle.REVERSE_NAME_MAPPING values "
3247 "should be 2-tuples, not %.200s",
3248 Py_TYPE(item)->tp_name);
3249 return -1;
3250 }
3251 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3252 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3253 if (!PyUnicode_Check(fixed_module_name) ||
3254 !PyUnicode_Check(fixed_global_name)) {
3255 PyErr_Format(PyExc_RuntimeError,
3256 "_compat_pickle.REVERSE_NAME_MAPPING values "
3257 "should be pairs of str, not (%.200s, %.200s)",
3258 Py_TYPE(fixed_module_name)->tp_name,
3259 Py_TYPE(fixed_global_name)->tp_name);
3260 return -1;
3261 }
3262
3263 Py_CLEAR(*module_name);
3264 Py_CLEAR(*global_name);
3265 Py_INCREF(fixed_module_name);
3266 Py_INCREF(fixed_global_name);
3267 *module_name = fixed_module_name;
3268 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003269 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003270 }
3271 else if (PyErr_Occurred()) {
3272 return -1;
3273 }
3274
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003275 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003276 if (item) {
3277 if (!PyUnicode_Check(item)) {
3278 PyErr_Format(PyExc_RuntimeError,
3279 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3280 "should be strings, not %.200s",
3281 Py_TYPE(item)->tp_name);
3282 return -1;
3283 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003284 Py_INCREF(item);
Serhiy Storchaka48842712016-04-06 09:45:48 +03003285 Py_XSETREF(*module_name, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003286 }
3287 else if (PyErr_Occurred()) {
3288 return -1;
3289 }
3290
3291 return 0;
3292}
3293
3294static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003295save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3296{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003297 PyObject *global_name = NULL;
3298 PyObject *module_name = NULL;
3299 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003300 PyObject *parent = NULL;
3301 PyObject *dotted_path = NULL;
3302 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003303 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003304 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003305 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003306 _Py_IDENTIFIER(__name__);
3307 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003308
3309 const char global_op = GLOBAL;
3310
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003311 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003312 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003313 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003314 }
3315 else {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003316 if (_PyObject_LookupAttrId(obj, &PyId___qualname__, &global_name) < 0)
3317 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003318 if (global_name == NULL) {
3319 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3320 if (global_name == NULL)
3321 goto error;
3322 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003323 }
3324
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003325 dotted_path = get_dotted_path(module, global_name);
3326 if (dotted_path == NULL)
3327 goto error;
3328 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003329 if (module_name == NULL)
3330 goto error;
3331
3332 /* XXX: Change to use the import C API directly with level=0 to disallow
3333 relative imports.
3334
3335 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3336 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3337 custom import functions (IMHO, this would be a nice security
3338 feature). The import C API would need to be extended to support the
3339 extra parameters of __import__ to fix that. */
3340 module = PyImport_Import(module_name);
3341 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003342 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003343 "Can't pickle %R: import of module %R failed",
3344 obj, module_name);
3345 goto error;
3346 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003347 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3348 Py_INCREF(lastname);
3349 cls = get_deep_attribute(module, dotted_path, &parent);
3350 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003351 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003352 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003353 "Can't pickle %R: attribute lookup %S on %S failed",
3354 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003355 goto error;
3356 }
3357 if (cls != obj) {
3358 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003359 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003360 "Can't pickle %R: it's not the same object as %S.%S",
3361 obj, module_name, global_name);
3362 goto error;
3363 }
3364 Py_DECREF(cls);
3365
3366 if (self->proto >= 2) {
3367 /* See whether this is in the extension registry, and if
3368 * so generate an EXT opcode.
3369 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003370 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003371 PyObject *code_obj; /* extension code as Python object */
3372 long code; /* extension code as C value */
3373 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003374 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003375
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003376 extension_key = PyTuple_Pack(2, module_name, global_name);
3377 if (extension_key == NULL) {
3378 goto error;
3379 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003380 code_obj = PyDict_GetItemWithError(st->extension_registry,
3381 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003382 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003383 /* The object is not registered in the extension registry.
3384 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003385 if (code_obj == NULL) {
3386 if (PyErr_Occurred()) {
3387 goto error;
3388 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003389 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003390 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003391
3392 /* XXX: pickle.py doesn't check neither the type, nor the range
3393 of the value returned by the extension_registry. It should for
3394 consistency. */
3395
3396 /* Verify code_obj has the right type and value. */
3397 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003398 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003399 "Can't pickle %R: extension code %R isn't an integer",
3400 obj, code_obj);
3401 goto error;
3402 }
3403 code = PyLong_AS_LONG(code_obj);
3404 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003405 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003406 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3407 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003408 goto error;
3409 }
3410
3411 /* Generate an EXT opcode. */
3412 if (code <= 0xff) {
3413 pdata[0] = EXT1;
3414 pdata[1] = (unsigned char)code;
3415 n = 2;
3416 }
3417 else if (code <= 0xffff) {
3418 pdata[0] = EXT2;
3419 pdata[1] = (unsigned char)(code & 0xff);
3420 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3421 n = 3;
3422 }
3423 else {
3424 pdata[0] = EXT4;
3425 pdata[1] = (unsigned char)(code & 0xff);
3426 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3427 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3428 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3429 n = 5;
3430 }
3431
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003432 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003433 goto error;
3434 }
3435 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003436 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003437 if (parent == module) {
3438 Py_INCREF(lastname);
3439 Py_DECREF(global_name);
3440 global_name = lastname;
3441 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003442 if (self->proto >= 4) {
3443 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003444
Christian Heimese8b1ba12013-11-23 21:13:39 +01003445 if (save(self, module_name, 0) < 0)
3446 goto error;
3447 if (save(self, global_name, 0) < 0)
3448 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003449
3450 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3451 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003452 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003453 else if (parent != module) {
3454 PickleState *st = _Pickle_GetGlobalState();
3455 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3456 st->getattr, parent, lastname);
3457 status = save_reduce(self, reduce_value, NULL);
3458 Py_DECREF(reduce_value);
3459 if (status < 0)
3460 goto error;
3461 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003462 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003463 /* Generate a normal global opcode if we are using a pickle
3464 protocol < 4, or if the object is not registered in the
3465 extension registry. */
3466 PyObject *encoded;
3467 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003468
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003469 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003470 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003471
3472 /* For protocol < 3 and if the user didn't request against doing
3473 so, we convert module names to the old 2.x module names. */
3474 if (self->proto < 3 && self->fix_imports) {
3475 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003476 goto error;
3477 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003478 }
3479
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003480 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3481 both the module name and the global name using UTF-8. We do so
3482 only when we are using the pickle protocol newer than version
3483 3. This is to ensure compatibility with older Unpickler running
3484 on Python 2.x. */
3485 if (self->proto == 3) {
3486 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003487 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003488 else {
3489 unicode_encoder = PyUnicode_AsASCIIString;
3490 }
3491 encoded = unicode_encoder(module_name);
3492 if (encoded == NULL) {
3493 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003494 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003495 "can't pickle module identifier '%S' using "
3496 "pickle protocol %i",
3497 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003498 goto error;
3499 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003500 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3501 PyBytes_GET_SIZE(encoded)) < 0) {
3502 Py_DECREF(encoded);
3503 goto error;
3504 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003505 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003506 if(_Pickler_Write(self, "\n", 1) < 0)
3507 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003508
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003509 /* Save the name of the module. */
3510 encoded = unicode_encoder(global_name);
3511 if (encoded == NULL) {
3512 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003513 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003514 "can't pickle global identifier '%S' using "
3515 "pickle protocol %i",
3516 global_name, self->proto);
3517 goto error;
3518 }
3519 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3520 PyBytes_GET_SIZE(encoded)) < 0) {
3521 Py_DECREF(encoded);
3522 goto error;
3523 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003524 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003525 if (_Pickler_Write(self, "\n", 1) < 0)
3526 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003527 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003528 /* Memoize the object. */
3529 if (memo_put(self, obj) < 0)
3530 goto error;
3531 }
3532
3533 if (0) {
3534 error:
3535 status = -1;
3536 }
3537 Py_XDECREF(module_name);
3538 Py_XDECREF(global_name);
3539 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003540 Py_XDECREF(parent);
3541 Py_XDECREF(dotted_path);
3542 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003543
3544 return status;
3545}
3546
3547static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003548save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3549{
3550 PyObject *reduce_value;
3551 int status;
3552
3553 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3554 if (reduce_value == NULL) {
3555 return -1;
3556 }
3557 status = save_reduce(self, reduce_value, obj);
3558 Py_DECREF(reduce_value);
3559 return status;
3560}
3561
3562static int
3563save_type(PicklerObject *self, PyObject *obj)
3564{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003565 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003566 return save_singleton_type(self, obj, Py_None);
3567 }
3568 else if (obj == (PyObject *)&PyEllipsis_Type) {
3569 return save_singleton_type(self, obj, Py_Ellipsis);
3570 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003571 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003572 return save_singleton_type(self, obj, Py_NotImplemented);
3573 }
3574 return save_global(self, obj, NULL);
3575}
3576
3577static int
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003578save_pers(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003579{
3580 PyObject *pid = NULL;
3581 int status = 0;
3582
3583 const char persid_op = PERSID;
3584 const char binpersid_op = BINPERSID;
3585
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003586 pid = call_method(self->pers_func, self->pers_func_self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003587 if (pid == NULL)
3588 return -1;
3589
3590 if (pid != Py_None) {
3591 if (self->bin) {
3592 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003593 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003594 goto error;
3595 }
3596 else {
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003597 PyObject *pid_str;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003598
3599 pid_str = PyObject_Str(pid);
3600 if (pid_str == NULL)
3601 goto error;
3602
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003603 /* XXX: Should it check whether the pid contains embedded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003604 newlines? */
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003605 if (!PyUnicode_IS_ASCII(pid_str)) {
3606 PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
3607 "persistent IDs in protocol 0 must be "
3608 "ASCII strings");
3609 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003610 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003611 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003612
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003613 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003614 _Pickler_Write(self, PyUnicode_DATA(pid_str),
3615 PyUnicode_GET_LENGTH(pid_str)) < 0 ||
3616 _Pickler_Write(self, "\n", 1) < 0) {
3617 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003618 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003619 }
3620 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003621 }
3622 status = 1;
3623 }
3624
3625 if (0) {
3626 error:
3627 status = -1;
3628 }
3629 Py_XDECREF(pid);
3630
3631 return status;
3632}
3633
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003634static PyObject *
3635get_class(PyObject *obj)
3636{
3637 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003638 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003639
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003640 if (_PyObject_LookupAttrId(obj, &PyId___class__, &cls) == 0) {
3641 cls = (PyObject *) Py_TYPE(obj);
3642 Py_INCREF(cls);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003643 }
3644 return cls;
3645}
3646
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003647/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3648 * appropriate __reduce__ method for obj.
3649 */
3650static int
3651save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3652{
3653 PyObject *callable;
3654 PyObject *argtup;
3655 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003656 PyObject *listitems = Py_None;
3657 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003658 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003659 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003660 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003661
3662 const char reduce_op = REDUCE;
3663 const char build_op = BUILD;
3664 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003665 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003666
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003667 size = PyTuple_Size(args);
3668 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003669 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003670 "__reduce__ must contain 2 through 5 elements");
3671 return -1;
3672 }
3673
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003674 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3675 &callable, &argtup, &state, &listitems, &dictitems))
3676 return -1;
3677
3678 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003679 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003680 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003681 return -1;
3682 }
3683 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003684 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003685 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003686 return -1;
3687 }
3688
3689 if (state == Py_None)
3690 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003691
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003692 if (listitems == Py_None)
3693 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003694 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003695 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003696 "returned by __reduce__ must be an iterator, not %s",
3697 Py_TYPE(listitems)->tp_name);
3698 return -1;
3699 }
3700
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003701 if (dictitems == Py_None)
3702 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003703 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003704 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003705 "returned by __reduce__ must be an iterator, not %s",
3706 Py_TYPE(dictitems)->tp_name);
3707 return -1;
3708 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003709
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003710 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003711 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003712 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003713
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003714 if (_PyObject_LookupAttrId(callable, &PyId___name__, &name) < 0) {
3715 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003716 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003717 if (name != NULL && PyUnicode_Check(name)) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003718 _Py_IDENTIFIER(__newobj_ex__);
Serhiy Storchakaf0f35a62017-01-09 10:09:43 +02003719 use_newobj_ex = _PyUnicode_EqualToASCIIId(
3720 name, &PyId___newobj_ex__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003721 if (!use_newobj_ex) {
3722 _Py_IDENTIFIER(__newobj__);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02003723 use_newobj = _PyUnicode_EqualToASCIIId(name, &PyId___newobj__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003724 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003725 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003726 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003727 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003728
3729 if (use_newobj_ex) {
3730 PyObject *cls;
3731 PyObject *args;
3732 PyObject *kwargs;
3733
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003734 if (PyTuple_GET_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003735 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003736 "length of the NEWOBJ_EX argument tuple must be "
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003737 "exactly 3, not %zd", PyTuple_GET_SIZE(argtup));
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003738 return -1;
3739 }
3740
3741 cls = PyTuple_GET_ITEM(argtup, 0);
3742 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003743 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003744 "first item from NEWOBJ_EX argument tuple must "
3745 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3746 return -1;
3747 }
3748 args = PyTuple_GET_ITEM(argtup, 1);
3749 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003750 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003751 "second item from NEWOBJ_EX argument tuple must "
3752 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3753 return -1;
3754 }
3755 kwargs = PyTuple_GET_ITEM(argtup, 2);
3756 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003757 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003758 "third item from NEWOBJ_EX argument tuple must "
3759 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3760 return -1;
3761 }
3762
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003763 if (self->proto >= 4) {
3764 if (save(self, cls, 0) < 0 ||
3765 save(self, args, 0) < 0 ||
3766 save(self, kwargs, 0) < 0 ||
3767 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3768 return -1;
3769 }
3770 }
3771 else {
3772 PyObject *newargs;
3773 PyObject *cls_new;
3774 Py_ssize_t i;
3775 _Py_IDENTIFIER(__new__);
3776
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003777 newargs = PyTuple_New(PyTuple_GET_SIZE(args) + 2);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003778 if (newargs == NULL)
3779 return -1;
3780
3781 cls_new = _PyObject_GetAttrId(cls, &PyId___new__);
3782 if (cls_new == NULL) {
3783 Py_DECREF(newargs);
3784 return -1;
3785 }
3786 PyTuple_SET_ITEM(newargs, 0, cls_new);
3787 Py_INCREF(cls);
3788 PyTuple_SET_ITEM(newargs, 1, cls);
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003789 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003790 PyObject *item = PyTuple_GET_ITEM(args, i);
3791 Py_INCREF(item);
3792 PyTuple_SET_ITEM(newargs, i + 2, item);
3793 }
3794
3795 callable = PyObject_Call(st->partial, newargs, kwargs);
3796 Py_DECREF(newargs);
3797 if (callable == NULL)
3798 return -1;
3799
3800 newargs = PyTuple_New(0);
3801 if (newargs == NULL) {
3802 Py_DECREF(callable);
3803 return -1;
3804 }
3805
3806 if (save(self, callable, 0) < 0 ||
3807 save(self, newargs, 0) < 0 ||
3808 _Pickler_Write(self, &reduce_op, 1) < 0) {
3809 Py_DECREF(newargs);
3810 Py_DECREF(callable);
3811 return -1;
3812 }
3813 Py_DECREF(newargs);
3814 Py_DECREF(callable);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003815 }
3816 }
3817 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003818 PyObject *cls;
3819 PyObject *newargtup;
3820 PyObject *obj_class;
3821 int p;
3822
3823 /* Sanity checks. */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003824 if (PyTuple_GET_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003825 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003826 return -1;
3827 }
3828
3829 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003830 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003831 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003832 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003833 return -1;
3834 }
3835
3836 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003837 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003838 p = obj_class != cls; /* true iff a problem */
3839 Py_DECREF(obj_class);
3840 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003841 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003842 "__newobj__ args has the wrong class");
3843 return -1;
3844 }
3845 }
3846 /* XXX: These calls save() are prone to infinite recursion. Imagine
3847 what happen if the value returned by the __reduce__() method of
3848 some extension type contains another object of the same type. Ouch!
3849
3850 Here is a quick example, that I ran into, to illustrate what I
3851 mean:
3852
3853 >>> import pickle, copyreg
3854 >>> copyreg.dispatch_table.pop(complex)
3855 >>> pickle.dumps(1+2j)
3856 Traceback (most recent call last):
3857 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04003858 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003859
3860 Removing the complex class from copyreg.dispatch_table made the
3861 __reduce_ex__() method emit another complex object:
3862
3863 >>> (1+1j).__reduce_ex__(2)
3864 (<function __newobj__ at 0xb7b71c3c>,
3865 (<class 'complex'>, (1+1j)), None, None, None)
3866
3867 Thus when save() was called on newargstup (the 2nd item) recursion
3868 ensued. Of course, the bug was in the complex class which had a
3869 broken __getnewargs__() that emitted another complex object. But,
3870 the point, here, is it is quite easy to end up with a broken reduce
3871 function. */
3872
3873 /* Save the class and its __new__ arguments. */
3874 if (save(self, cls, 0) < 0)
3875 return -1;
3876
Serhiy Storchakafff9a312017-03-21 08:53:25 +02003877 newargtup = PyTuple_GetSlice(argtup, 1, PyTuple_GET_SIZE(argtup));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003878 if (newargtup == NULL)
3879 return -1;
3880
3881 p = save(self, newargtup, 0);
3882 Py_DECREF(newargtup);
3883 if (p < 0)
3884 return -1;
3885
3886 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003887 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003888 return -1;
3889 }
3890 else { /* Not using NEWOBJ. */
3891 if (save(self, callable, 0) < 0 ||
3892 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003893 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003894 return -1;
3895 }
3896
3897 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3898 the caller do not want to memoize the object. Not particularly useful,
3899 but that is to mimic the behavior save_reduce() in pickle.py when
3900 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003901 if (obj != NULL) {
3902 /* If the object is already in the memo, this means it is
3903 recursive. In this case, throw away everything we put on the
3904 stack, and fetch the object back from the memo. */
3905 if (PyMemoTable_Get(self->memo, obj)) {
3906 const char pop_op = POP;
3907
3908 if (_Pickler_Write(self, &pop_op, 1) < 0)
3909 return -1;
3910 if (memo_get(self, obj) < 0)
3911 return -1;
3912
3913 return 0;
3914 }
3915 else if (memo_put(self, obj) < 0)
3916 return -1;
3917 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003918
3919 if (listitems && batch_list(self, listitems) < 0)
3920 return -1;
3921
3922 if (dictitems && batch_dict(self, dictitems) < 0)
3923 return -1;
3924
3925 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003926 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003927 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003928 return -1;
3929 }
3930
3931 return 0;
3932}
3933
3934static int
3935save(PicklerObject *self, PyObject *obj, int pers_save)
3936{
3937 PyTypeObject *type;
3938 PyObject *reduce_func = NULL;
3939 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003940 int status = 0;
3941
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003942 if (_Pickler_OpcodeBoundary(self) < 0)
3943 return -1;
3944
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003945 /* The extra pers_save argument is necessary to avoid calling save_pers()
3946 on its returned object. */
3947 if (!pers_save && self->pers_func) {
3948 /* save_pers() returns:
3949 -1 to signal an error;
3950 0 if it did nothing successfully;
3951 1 if a persistent id was saved.
3952 */
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003953 if ((status = save_pers(self, obj)) != 0)
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003954 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003955 }
3956
3957 type = Py_TYPE(obj);
3958
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003959 /* The old cPickle had an optimization that used switch-case statement
3960 dispatching on the first letter of the type name. This has was removed
3961 since benchmarks shown that this optimization was actually slowing
3962 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003963
3964 /* Atom types; these aren't memoized, so don't check the memo. */
3965
3966 if (obj == Py_None) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003967 return save_none(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003968 }
3969 else if (obj == Py_False || obj == Py_True) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003970 return save_bool(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003971 }
3972 else if (type == &PyLong_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003973 return save_long(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003974 }
3975 else if (type == &PyFloat_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003976 return save_float(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003977 }
3978
3979 /* Check the memo to see if it has the object. If so, generate
3980 a GET (or BINGET) opcode, instead of pickling the object
3981 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003982 if (PyMemoTable_Get(self->memo, obj)) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003983 return memo_get(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003984 }
3985
3986 if (type == &PyBytes_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003987 return save_bytes(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003988 }
3989 else if (type == &PyUnicode_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003990 return save_unicode(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003991 }
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03003992
3993 /* We're only calling Py_EnterRecursiveCall here so that atomic
3994 types above are pickled faster. */
3995 if (Py_EnterRecursiveCall(" while pickling an object")) {
3996 return -1;
3997 }
3998
3999 if (type == &PyDict_Type) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004000 status = save_dict(self, obj);
4001 goto done;
4002 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004003 else if (type == &PySet_Type) {
4004 status = save_set(self, obj);
4005 goto done;
4006 }
4007 else if (type == &PyFrozenSet_Type) {
4008 status = save_frozenset(self, obj);
4009 goto done;
4010 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004011 else if (type == &PyList_Type) {
4012 status = save_list(self, obj);
4013 goto done;
4014 }
4015 else if (type == &PyTuple_Type) {
4016 status = save_tuple(self, obj);
4017 goto done;
4018 }
4019 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08004020 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004021 goto done;
4022 }
4023 else if (type == &PyFunction_Type) {
4024 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08004025 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004026 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004027
4028 /* XXX: This part needs some unit tests. */
4029
4030 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004031 * self.dispatch_table, copyreg.dispatch_table, the object's
4032 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004033 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004034 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004035 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004036 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
4037 (PyObject *)type);
4038 if (reduce_func == NULL) {
4039 if (PyErr_Occurred()) {
4040 goto error;
4041 }
4042 } else {
4043 /* PyDict_GetItemWithError() returns a borrowed reference.
4044 Increase the reference count to be consistent with
4045 PyObject_GetItem and _PyObject_GetAttrId used below. */
4046 Py_INCREF(reduce_func);
4047 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004048 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004049 reduce_func = PyObject_GetItem(self->dispatch_table,
4050 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004051 if (reduce_func == NULL) {
4052 if (PyErr_ExceptionMatches(PyExc_KeyError))
4053 PyErr_Clear();
4054 else
4055 goto error;
4056 }
4057 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004058 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004059 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004060 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004061 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02004062 else if (PyType_IsSubtype(type, &PyType_Type)) {
4063 status = save_global(self, obj, NULL);
4064 goto done;
4065 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004066 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004067 _Py_IDENTIFIER(__reduce__);
4068 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004069
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004070
4071 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
4072 automatically defined as __reduce__. While this is convenient, this
4073 make it impossible to know which method was actually called. Of
4074 course, this is not a big deal. But still, it would be nice to let
4075 the user know which method was called when something go
4076 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
4077 don't actually have to check for a __reduce__ method. */
4078
4079 /* Check for a __reduce_ex__ method. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004080 if (_PyObject_LookupAttrId(obj, &PyId___reduce_ex__, &reduce_func) < 0) {
4081 goto error;
4082 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004083 if (reduce_func != NULL) {
4084 PyObject *proto;
4085 proto = PyLong_FromLong(self->proto);
4086 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004087 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004088 }
4089 }
4090 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004091 PickleState *st = _Pickle_GetGlobalState();
4092
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004093 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004094 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004095 if (reduce_func != NULL) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02004096 reduce_value = _PyObject_CallNoArg(reduce_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004097 }
4098 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004099 PyErr_Format(st->PicklingError,
4100 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004101 type->tp_name, obj);
4102 goto error;
4103 }
4104 }
4105 }
4106
4107 if (reduce_value == NULL)
4108 goto error;
4109
4110 if (PyUnicode_Check(reduce_value)) {
4111 status = save_global(self, obj, reduce_value);
4112 goto done;
4113 }
4114
4115 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004116 PickleState *st = _Pickle_GetGlobalState();
4117 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004118 "__reduce__ must return a string or tuple");
4119 goto error;
4120 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004121
4122 status = save_reduce(self, reduce_value, obj);
4123
4124 if (0) {
4125 error:
4126 status = -1;
4127 }
4128 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004129
Alexandre Vassalottidff18342008-07-13 18:48:30 +00004130 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004131 Py_XDECREF(reduce_func);
4132 Py_XDECREF(reduce_value);
4133
4134 return status;
4135}
4136
4137static int
4138dump(PicklerObject *self, PyObject *obj)
4139{
4140 const char stop_op = STOP;
4141
4142 if (self->proto >= 2) {
4143 char header[2];
4144
4145 header[0] = PROTO;
4146 assert(self->proto >= 0 && self->proto < 256);
4147 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004148 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004149 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004150 if (self->proto >= 4)
4151 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004152 }
4153
4154 if (save(self, obj, 0) < 0 ||
Serhiy Storchakac8695292018-04-04 00:11:27 +03004155 _Pickler_Write(self, &stop_op, 1) < 0 ||
4156 _Pickler_CommitFrame(self) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004157 return -1;
Serhiy Storchakac8695292018-04-04 00:11:27 +03004158 self->framing = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004159 return 0;
4160}
4161
Larry Hastings61272b72014-01-07 12:41:53 -08004162/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004163
4164_pickle.Pickler.clear_memo
4165
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004166Clears the pickler's "memo".
4167
4168The memo is the data structure that remembers which objects the
4169pickler has already seen, so that shared or recursive objects are
4170pickled by reference and not by value. This method is useful when
4171re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08004172[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004173
Larry Hastings3cceb382014-01-04 11:09:09 -08004174static PyObject *
4175_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004176/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004177{
4178 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004179 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004180
4181 Py_RETURN_NONE;
4182}
4183
Larry Hastings61272b72014-01-07 12:41:53 -08004184/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004185
4186_pickle.Pickler.dump
4187
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004188 obj: object
4189 /
4190
4191Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08004192[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004193
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004194static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004195_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08004196/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004197{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004198 /* Check whether the Pickler was initialized correctly (issue3664).
4199 Developers often forget to call __init__() in their subclasses, which
4200 would trigger a segfault without this check. */
4201 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004202 PickleState *st = _Pickle_GetGlobalState();
4203 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004204 "Pickler.__init__() was not called by %s.__init__()",
4205 Py_TYPE(self)->tp_name);
4206 return NULL;
4207 }
4208
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004209 if (_Pickler_ClearBuffer(self) < 0)
4210 return NULL;
4211
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004212 if (dump(self, obj) < 0)
4213 return NULL;
4214
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004215 if (_Pickler_FlushToFile(self) < 0)
4216 return NULL;
4217
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004218 Py_RETURN_NONE;
4219}
4220
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004221/*[clinic input]
4222
4223_pickle.Pickler.__sizeof__ -> Py_ssize_t
4224
4225Returns size in memory, in bytes.
4226[clinic start generated code]*/
4227
4228static Py_ssize_t
4229_pickle_Pickler___sizeof___impl(PicklerObject *self)
4230/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4231{
4232 Py_ssize_t res, s;
4233
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004234 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004235 if (self->memo != NULL) {
4236 res += sizeof(PyMemoTable);
4237 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4238 }
4239 if (self->output_buffer != NULL) {
4240 s = _PySys_GetSizeOf(self->output_buffer);
4241 if (s == -1)
4242 return -1;
4243 res += s;
4244 }
4245 return res;
4246}
4247
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004248static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004249 _PICKLE_PICKLER_DUMP_METHODDEF
4250 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004251 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004252 {NULL, NULL} /* sentinel */
4253};
4254
4255static void
4256Pickler_dealloc(PicklerObject *self)
4257{
4258 PyObject_GC_UnTrack(self);
4259
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004260 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004261 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004262 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004263 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004264 Py_XDECREF(self->fast_memo);
4265
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004266 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004267
4268 Py_TYPE(self)->tp_free((PyObject *)self);
4269}
4270
4271static int
4272Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4273{
4274 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004275 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004276 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004277 Py_VISIT(self->fast_memo);
4278 return 0;
4279}
4280
4281static int
4282Pickler_clear(PicklerObject *self)
4283{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004284 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004285 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004286 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004287 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004288 Py_CLEAR(self->fast_memo);
4289
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004290 if (self->memo != NULL) {
4291 PyMemoTable *memo = self->memo;
4292 self->memo = NULL;
4293 PyMemoTable_Del(memo);
4294 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004295 return 0;
4296}
4297
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004298
Larry Hastings61272b72014-01-07 12:41:53 -08004299/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004300
4301_pickle.Pickler.__init__
4302
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004303 file: object
4304 protocol: object = NULL
4305 fix_imports: bool = True
4306
4307This takes a binary file for writing a pickle data stream.
4308
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004309The optional *protocol* argument tells the pickler to use the given
4310protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4311protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004312
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004313Specifying a negative protocol version selects the highest protocol
4314version supported. The higher the protocol used, the more recent the
4315version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004316
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004317The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004318bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004319writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004320this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004321
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004322If *fix_imports* is True and protocol is less than 3, pickle will try
4323to map the new Python 3 names to the old module names used in Python
43242, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004325[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004326
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004327static int
Larry Hastings89964c42015-04-14 18:07:59 -04004328_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4329 PyObject *protocol, int fix_imports)
Martin Panter2eb819f2015-11-02 04:04:57 +00004330/*[clinic end generated code: output=b5f31078dab17fb0 input=4faabdbc763c2389]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004331{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004332 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004333 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004334
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004335 /* In case of multiple __init__() calls, clear previous content. */
4336 if (self->write != NULL)
4337 (void)Pickler_clear(self);
4338
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004339 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004340 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004341
4342 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004343 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004344
4345 /* memo and output_buffer may have already been created in _Pickler_New */
4346 if (self->memo == NULL) {
4347 self->memo = PyMemoTable_New();
4348 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004349 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004350 }
4351 self->output_len = 0;
4352 if (self->output_buffer == NULL) {
4353 self->max_output_len = WRITE_BUF_SIZE;
4354 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4355 self->max_output_len);
4356 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004357 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004358 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004359
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004360 self->fast = 0;
4361 self->fast_nesting = 0;
4362 self->fast_memo = NULL;
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004363
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004364 if (init_method_ref((PyObject *)self, &PyId_persistent_id,
4365 &self->pers_func, &self->pers_func_self) < 0)
4366 {
4367 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004368 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004369
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004370 if (_PyObject_LookupAttrId((PyObject *)self,
4371 &PyId_dispatch_table, &self->dispatch_table) < 0) {
4372 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004373 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004374
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004375 return 0;
4376}
4377
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004378
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004379/* Define a proxy object for the Pickler's internal memo object. This is to
4380 * avoid breaking code like:
4381 * pickler.memo.clear()
4382 * and
4383 * pickler.memo = saved_memo
4384 * Is this a good idea? Not really, but we don't want to break code that uses
4385 * it. Note that we don't implement the entire mapping API here. This is
4386 * intentional, as these should be treated as black-box implementation details.
4387 */
4388
Larry Hastings61272b72014-01-07 12:41:53 -08004389/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004390_pickle.PicklerMemoProxy.clear
4391
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004392Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004393[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004394
Larry Hastings3cceb382014-01-04 11:09:09 -08004395static PyObject *
4396_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004397/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004398{
4399 if (self->pickler->memo)
4400 PyMemoTable_Clear(self->pickler->memo);
4401 Py_RETURN_NONE;
4402}
4403
Larry Hastings61272b72014-01-07 12:41:53 -08004404/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004405_pickle.PicklerMemoProxy.copy
4406
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004407Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004408[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004409
Larry Hastings3cceb382014-01-04 11:09:09 -08004410static PyObject *
4411_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004412/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004413{
4414 Py_ssize_t i;
4415 PyMemoTable *memo;
4416 PyObject *new_memo = PyDict_New();
4417 if (new_memo == NULL)
4418 return NULL;
4419
4420 memo = self->pickler->memo;
4421 for (i = 0; i < memo->mt_allocated; ++i) {
4422 PyMemoEntry entry = memo->mt_table[i];
4423 if (entry.me_key != NULL) {
4424 int status;
4425 PyObject *key, *value;
4426
4427 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004428 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004429
4430 if (key == NULL || value == NULL) {
4431 Py_XDECREF(key);
4432 Py_XDECREF(value);
4433 goto error;
4434 }
4435 status = PyDict_SetItem(new_memo, key, value);
4436 Py_DECREF(key);
4437 Py_DECREF(value);
4438 if (status < 0)
4439 goto error;
4440 }
4441 }
4442 return new_memo;
4443
4444 error:
4445 Py_XDECREF(new_memo);
4446 return NULL;
4447}
4448
Larry Hastings61272b72014-01-07 12:41:53 -08004449/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004450_pickle.PicklerMemoProxy.__reduce__
4451
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004452Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004453[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004454
Larry Hastings3cceb382014-01-04 11:09:09 -08004455static PyObject *
4456_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004457/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004458{
4459 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004460 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004461 if (contents == NULL)
4462 return NULL;
4463
4464 reduce_value = PyTuple_New(2);
4465 if (reduce_value == NULL) {
4466 Py_DECREF(contents);
4467 return NULL;
4468 }
4469 dict_args = PyTuple_New(1);
4470 if (dict_args == NULL) {
4471 Py_DECREF(contents);
4472 Py_DECREF(reduce_value);
4473 return NULL;
4474 }
4475 PyTuple_SET_ITEM(dict_args, 0, contents);
4476 Py_INCREF((PyObject *)&PyDict_Type);
4477 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4478 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4479 return reduce_value;
4480}
4481
4482static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004483 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4484 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4485 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004486 {NULL, NULL} /* sentinel */
4487};
4488
4489static void
4490PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4491{
4492 PyObject_GC_UnTrack(self);
4493 Py_XDECREF(self->pickler);
4494 PyObject_GC_Del((PyObject *)self);
4495}
4496
4497static int
4498PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4499 visitproc visit, void *arg)
4500{
4501 Py_VISIT(self->pickler);
4502 return 0;
4503}
4504
4505static int
4506PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4507{
4508 Py_CLEAR(self->pickler);
4509 return 0;
4510}
4511
4512static PyTypeObject PicklerMemoProxyType = {
4513 PyVarObject_HEAD_INIT(NULL, 0)
4514 "_pickle.PicklerMemoProxy", /*tp_name*/
4515 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4516 0,
4517 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4518 0, /* tp_print */
4519 0, /* tp_getattr */
4520 0, /* tp_setattr */
4521 0, /* tp_compare */
4522 0, /* tp_repr */
4523 0, /* tp_as_number */
4524 0, /* tp_as_sequence */
4525 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004526 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004527 0, /* tp_call */
4528 0, /* tp_str */
4529 PyObject_GenericGetAttr, /* tp_getattro */
4530 PyObject_GenericSetAttr, /* tp_setattro */
4531 0, /* tp_as_buffer */
4532 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4533 0, /* tp_doc */
4534 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4535 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4536 0, /* tp_richcompare */
4537 0, /* tp_weaklistoffset */
4538 0, /* tp_iter */
4539 0, /* tp_iternext */
4540 picklerproxy_methods, /* tp_methods */
4541};
4542
4543static PyObject *
4544PicklerMemoProxy_New(PicklerObject *pickler)
4545{
4546 PicklerMemoProxyObject *self;
4547
4548 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4549 if (self == NULL)
4550 return NULL;
4551 Py_INCREF(pickler);
4552 self->pickler = pickler;
4553 PyObject_GC_Track(self);
4554 return (PyObject *)self;
4555}
4556
4557/*****************************************************************************/
4558
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004559static PyObject *
4560Pickler_get_memo(PicklerObject *self)
4561{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004562 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004563}
4564
4565static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004566Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004567{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004568 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004569
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004570 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004571 PyErr_SetString(PyExc_TypeError,
4572 "attribute deletion is not supported");
4573 return -1;
4574 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004575
4576 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4577 PicklerObject *pickler =
4578 ((PicklerMemoProxyObject *)obj)->pickler;
4579
4580 new_memo = PyMemoTable_Copy(pickler->memo);
4581 if (new_memo == NULL)
4582 return -1;
4583 }
4584 else if (PyDict_Check(obj)) {
4585 Py_ssize_t i = 0;
4586 PyObject *key, *value;
4587
4588 new_memo = PyMemoTable_New();
4589 if (new_memo == NULL)
4590 return -1;
4591
4592 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004593 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004594 PyObject *memo_obj;
4595
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004596 if (!PyTuple_Check(value) || PyTuple_GET_SIZE(value) != 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004597 PyErr_SetString(PyExc_TypeError,
4598 "'memo' values must be 2-item tuples");
4599 goto error;
4600 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004601 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004602 if (memo_id == -1 && PyErr_Occurred())
4603 goto error;
4604 memo_obj = PyTuple_GET_ITEM(value, 1);
4605 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4606 goto error;
4607 }
4608 }
4609 else {
4610 PyErr_Format(PyExc_TypeError,
Serhiy Storchakab6a9c972016-04-17 09:39:28 +03004611 "'memo' attribute must be a PicklerMemoProxy object"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004612 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004613 return -1;
4614 }
4615
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004616 PyMemoTable_Del(self->memo);
4617 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004618
4619 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004620
4621 error:
4622 if (new_memo)
4623 PyMemoTable_Del(new_memo);
4624 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004625}
4626
4627static PyObject *
4628Pickler_get_persid(PicklerObject *self)
4629{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004630 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004631 PyErr_SetString(PyExc_AttributeError, "persistent_id");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004632 return NULL;
4633 }
4634 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004635}
4636
4637static int
4638Pickler_set_persid(PicklerObject *self, PyObject *value)
4639{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004640 if (value == NULL) {
4641 PyErr_SetString(PyExc_TypeError,
4642 "attribute deletion is not supported");
4643 return -1;
4644 }
4645 if (!PyCallable_Check(value)) {
4646 PyErr_SetString(PyExc_TypeError,
4647 "persistent_id must be a callable taking one argument");
4648 return -1;
4649 }
4650
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004651 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004652 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03004653 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004654
4655 return 0;
4656}
4657
4658static PyMemberDef Pickler_members[] = {
4659 {"bin", T_INT, offsetof(PicklerObject, bin)},
4660 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004661 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004662 {NULL}
4663};
4664
4665static PyGetSetDef Pickler_getsets[] = {
4666 {"memo", (getter)Pickler_get_memo,
4667 (setter)Pickler_set_memo},
4668 {"persistent_id", (getter)Pickler_get_persid,
4669 (setter)Pickler_set_persid},
4670 {NULL}
4671};
4672
4673static PyTypeObject Pickler_Type = {
4674 PyVarObject_HEAD_INIT(NULL, 0)
4675 "_pickle.Pickler" , /*tp_name*/
4676 sizeof(PicklerObject), /*tp_basicsize*/
4677 0, /*tp_itemsize*/
4678 (destructor)Pickler_dealloc, /*tp_dealloc*/
4679 0, /*tp_print*/
4680 0, /*tp_getattr*/
4681 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004682 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004683 0, /*tp_repr*/
4684 0, /*tp_as_number*/
4685 0, /*tp_as_sequence*/
4686 0, /*tp_as_mapping*/
4687 0, /*tp_hash*/
4688 0, /*tp_call*/
4689 0, /*tp_str*/
4690 0, /*tp_getattro*/
4691 0, /*tp_setattro*/
4692 0, /*tp_as_buffer*/
4693 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004694 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004695 (traverseproc)Pickler_traverse, /*tp_traverse*/
4696 (inquiry)Pickler_clear, /*tp_clear*/
4697 0, /*tp_richcompare*/
4698 0, /*tp_weaklistoffset*/
4699 0, /*tp_iter*/
4700 0, /*tp_iternext*/
4701 Pickler_methods, /*tp_methods*/
4702 Pickler_members, /*tp_members*/
4703 Pickler_getsets, /*tp_getset*/
4704 0, /*tp_base*/
4705 0, /*tp_dict*/
4706 0, /*tp_descr_get*/
4707 0, /*tp_descr_set*/
4708 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004709 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004710 PyType_GenericAlloc, /*tp_alloc*/
4711 PyType_GenericNew, /*tp_new*/
4712 PyObject_GC_Del, /*tp_free*/
4713 0, /*tp_is_gc*/
4714};
4715
Victor Stinner121aab42011-09-29 23:40:53 +02004716/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004717
4718 XXX: It would be nice to able to avoid Python function call overhead, by
4719 using directly the C version of find_class(), when find_class() is not
4720 overridden by a subclass. Although, this could become rather hackish. A
4721 simpler optimization would be to call the C function when self is not a
4722 subclass instance. */
4723static PyObject *
4724find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4725{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004726 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004727
Victor Stinner55ba38a2016-12-09 16:09:30 +01004728 return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_find_class,
4729 module_name, global_name, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004730}
4731
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004732static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004733marker(UnpicklerObject *self)
4734{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02004735 Py_ssize_t mark;
4736
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004737 if (self->num_marks < 1) {
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02004738 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004739 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004740 return -1;
4741 }
4742
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02004743 mark = self->marks[--self->num_marks];
4744 self->stack->mark_set = self->num_marks != 0;
4745 self->stack->fence = self->num_marks ?
4746 self->marks[self->num_marks - 1] : 0;
4747 return mark;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004748}
4749
4750static int
4751load_none(UnpicklerObject *self)
4752{
4753 PDATA_APPEND(self->stack, Py_None, -1);
4754 return 0;
4755}
4756
4757static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004758load_int(UnpicklerObject *self)
4759{
4760 PyObject *value;
4761 char *endptr, *s;
4762 Py_ssize_t len;
4763 long x;
4764
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004765 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004766 return -1;
4767 if (len < 2)
4768 return bad_readline();
4769
4770 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004771 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004772 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004773 x = strtol(s, &endptr, 0);
4774
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004775 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004776 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004777 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004778 errno = 0;
4779 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004780 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004781 if (value == NULL) {
4782 PyErr_SetString(PyExc_ValueError,
4783 "could not convert string to int");
4784 return -1;
4785 }
4786 }
4787 else {
4788 if (len == 3 && (x == 0 || x == 1)) {
4789 if ((value = PyBool_FromLong(x)) == NULL)
4790 return -1;
4791 }
4792 else {
4793 if ((value = PyLong_FromLong(x)) == NULL)
4794 return -1;
4795 }
4796 }
4797
4798 PDATA_PUSH(self->stack, value, -1);
4799 return 0;
4800}
4801
4802static int
4803load_bool(UnpicklerObject *self, PyObject *boolean)
4804{
4805 assert(boolean == Py_True || boolean == Py_False);
4806 PDATA_APPEND(self->stack, boolean, -1);
4807 return 0;
4808}
4809
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004810/* s contains x bytes of an unsigned little-endian integer. Return its value
4811 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4812 */
4813static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004814calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004815{
4816 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004817 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004818 size_t x = 0;
4819
Serhiy Storchakae0606192015-09-29 22:10:07 +03004820 if (nbytes > (int)sizeof(size_t)) {
4821 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
4822 * have 64-bit size that can't be represented on 32-bit platform.
4823 */
4824 for (i = (int)sizeof(size_t); i < nbytes; i++) {
4825 if (s[i])
4826 return -1;
4827 }
4828 nbytes = (int)sizeof(size_t);
4829 }
4830 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004831 x |= (size_t) s[i] << (8 * i);
4832 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004833
4834 if (x > PY_SSIZE_T_MAX)
4835 return -1;
4836 else
4837 return (Py_ssize_t) x;
4838}
4839
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004840/* s contains x bytes of a little-endian integer. Return its value as a
4841 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03004842 * int, but when x is 4 it's a signed one. This is a historical source
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004843 * of x-platform bugs.
4844 */
4845static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004846calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004847{
4848 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004849 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004850 long x = 0;
4851
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004852 for (i = 0; i < nbytes; i++) {
4853 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004854 }
4855
4856 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4857 * is signed, so on a box with longs bigger than 4 bytes we need
4858 * to extend a BININT's sign bit to the full width.
4859 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004860 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004861 x |= -(x & (1L << 31));
4862 }
4863
4864 return x;
4865}
4866
4867static int
4868load_binintx(UnpicklerObject *self, char *s, int size)
4869{
4870 PyObject *value;
4871 long x;
4872
4873 x = calc_binint(s, size);
4874
4875 if ((value = PyLong_FromLong(x)) == NULL)
4876 return -1;
4877
4878 PDATA_PUSH(self->stack, value, -1);
4879 return 0;
4880}
4881
4882static int
4883load_binint(UnpicklerObject *self)
4884{
4885 char *s;
4886
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004887 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004888 return -1;
4889
4890 return load_binintx(self, s, 4);
4891}
4892
4893static int
4894load_binint1(UnpicklerObject *self)
4895{
4896 char *s;
4897
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004898 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004899 return -1;
4900
4901 return load_binintx(self, s, 1);
4902}
4903
4904static int
4905load_binint2(UnpicklerObject *self)
4906{
4907 char *s;
4908
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004909 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004910 return -1;
4911
4912 return load_binintx(self, s, 2);
4913}
4914
4915static int
4916load_long(UnpicklerObject *self)
4917{
4918 PyObject *value;
Victor Stinnerb110dad2016-12-09 17:06:43 +01004919 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004920 Py_ssize_t len;
4921
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004922 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004923 return -1;
4924 if (len < 2)
4925 return bad_readline();
4926
Mark Dickinson8dd05142009-01-20 20:43:58 +00004927 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4928 the 'L' before calling PyLong_FromString. In order to maintain
4929 compatibility with Python 3.0.0, we don't actually *require*
4930 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004931 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004932 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004933 /* XXX: Should the base argument explicitly set to 10? */
4934 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004935 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004936 return -1;
4937
4938 PDATA_PUSH(self->stack, value, -1);
4939 return 0;
4940}
4941
4942/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4943 * data following.
4944 */
4945static int
4946load_counted_long(UnpicklerObject *self, int size)
4947{
4948 PyObject *value;
4949 char *nbytes;
4950 char *pdata;
4951
4952 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004953 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004954 return -1;
4955
4956 size = calc_binint(nbytes, size);
4957 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004958 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004959 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004960 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004961 "LONG pickle has negative byte count");
4962 return -1;
4963 }
4964
4965 if (size == 0)
4966 value = PyLong_FromLong(0L);
4967 else {
4968 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004969 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004970 return -1;
4971 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4972 1 /* little endian */ , 1 /* signed */ );
4973 }
4974 if (value == NULL)
4975 return -1;
4976 PDATA_PUSH(self->stack, value, -1);
4977 return 0;
4978}
4979
4980static int
4981load_float(UnpicklerObject *self)
4982{
4983 PyObject *value;
4984 char *endptr, *s;
4985 Py_ssize_t len;
4986 double d;
4987
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004988 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004989 return -1;
4990 if (len < 2)
4991 return bad_readline();
4992
4993 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004994 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4995 if (d == -1.0 && PyErr_Occurred())
4996 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004997 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004998 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4999 return -1;
5000 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00005001 value = PyFloat_FromDouble(d);
5002 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005003 return -1;
5004
5005 PDATA_PUSH(self->stack, value, -1);
5006 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005007}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005008
5009static int
5010load_binfloat(UnpicklerObject *self)
5011{
5012 PyObject *value;
5013 double x;
5014 char *s;
5015
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005016 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005017 return -1;
5018
5019 x = _PyFloat_Unpack8((unsigned char *)s, 0);
5020 if (x == -1.0 && PyErr_Occurred())
5021 return -1;
5022
5023 if ((value = PyFloat_FromDouble(x)) == NULL)
5024 return -1;
5025
5026 PDATA_PUSH(self->stack, value, -1);
5027 return 0;
5028}
5029
5030static int
5031load_string(UnpicklerObject *self)
5032{
5033 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005034 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005035 Py_ssize_t len;
5036 char *s, *p;
5037
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005038 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005039 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005040 /* Strip the newline */
5041 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005042 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005043 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005044 p = s + 1;
5045 len -= 2;
5046 }
5047 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005048 PickleState *st = _Pickle_GetGlobalState();
5049 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005050 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005051 return -1;
5052 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005053 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005054
5055 /* Use the PyBytes API to decode the string, since that is what is used
5056 to encode, and then coerce the result to Unicode. */
5057 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005058 if (bytes == NULL)
5059 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005060
5061 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
5062 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5063 if (strcmp(self->encoding, "bytes") == 0) {
5064 obj = bytes;
5065 }
5066 else {
5067 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
5068 Py_DECREF(bytes);
5069 if (obj == NULL) {
5070 return -1;
5071 }
5072 }
5073
5074 PDATA_PUSH(self->stack, obj, -1);
5075 return 0;
5076}
5077
5078static int
5079load_counted_binstring(UnpicklerObject *self, int nbytes)
5080{
5081 PyObject *obj;
5082 Py_ssize_t size;
5083 char *s;
5084
5085 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005086 return -1;
5087
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005088 size = calc_binsize(s, nbytes);
5089 if (size < 0) {
5090 PickleState *st = _Pickle_GetGlobalState();
5091 PyErr_Format(st->UnpicklingError,
5092 "BINSTRING exceeds system's maximum size of %zd bytes",
5093 PY_SSIZE_T_MAX);
5094 return -1;
5095 }
5096
5097 if (_Unpickler_Read(self, &s, size) < 0)
5098 return -1;
5099
5100 /* Convert Python 2.x strings to bytes if the *encoding* given to the
5101 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5102 if (strcmp(self->encoding, "bytes") == 0) {
5103 obj = PyBytes_FromStringAndSize(s, size);
5104 }
5105 else {
5106 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
5107 }
5108 if (obj == NULL) {
5109 return -1;
5110 }
5111
5112 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005113 return 0;
5114}
5115
5116static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005117load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005118{
5119 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005120 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005121 char *s;
5122
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005123 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005124 return -1;
5125
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005126 size = calc_binsize(s, nbytes);
5127 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005128 PyErr_Format(PyExc_OverflowError,
5129 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005130 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005131 return -1;
5132 }
5133
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005134 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005135 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005136
5137 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005138 if (bytes == NULL)
5139 return -1;
5140
5141 PDATA_PUSH(self->stack, bytes, -1);
5142 return 0;
5143}
5144
5145static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005146load_unicode(UnpicklerObject *self)
5147{
5148 PyObject *str;
5149 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005150 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005151
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005152 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005153 return -1;
5154 if (len < 1)
5155 return bad_readline();
5156
5157 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
5158 if (str == NULL)
5159 return -1;
5160
5161 PDATA_PUSH(self->stack, str, -1);
5162 return 0;
5163}
5164
5165static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005166load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005167{
5168 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005169 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005170 char *s;
5171
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005172 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005173 return -1;
5174
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005175 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005176 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005177 PyErr_Format(PyExc_OverflowError,
5178 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005179 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005180 return -1;
5181 }
5182
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005183 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005184 return -1;
5185
Victor Stinner485fb562010-04-13 11:07:24 +00005186 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005187 if (str == NULL)
5188 return -1;
5189
5190 PDATA_PUSH(self->stack, str, -1);
5191 return 0;
5192}
5193
5194static int
Victor Stinner21b47112016-03-14 18:09:39 +01005195load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005196{
5197 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005198
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005199 if (Py_SIZE(self->stack) < len)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005200 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005201
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005202 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005203 if (tuple == NULL)
5204 return -1;
5205 PDATA_PUSH(self->stack, tuple, -1);
5206 return 0;
5207}
5208
5209static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005210load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005211{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005212 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005213
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005214 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005215 return -1;
5216
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005217 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005218}
5219
5220static int
5221load_empty_list(UnpicklerObject *self)
5222{
5223 PyObject *list;
5224
5225 if ((list = PyList_New(0)) == NULL)
5226 return -1;
5227 PDATA_PUSH(self->stack, list, -1);
5228 return 0;
5229}
5230
5231static int
5232load_empty_dict(UnpicklerObject *self)
5233{
5234 PyObject *dict;
5235
5236 if ((dict = PyDict_New()) == NULL)
5237 return -1;
5238 PDATA_PUSH(self->stack, dict, -1);
5239 return 0;
5240}
5241
5242static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005243load_empty_set(UnpicklerObject *self)
5244{
5245 PyObject *set;
5246
5247 if ((set = PySet_New(NULL)) == NULL)
5248 return -1;
5249 PDATA_PUSH(self->stack, set, -1);
5250 return 0;
5251}
5252
5253static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005254load_list(UnpicklerObject *self)
5255{
5256 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005257 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005258
5259 if ((i = marker(self)) < 0)
5260 return -1;
5261
5262 list = Pdata_poplist(self->stack, i);
5263 if (list == NULL)
5264 return -1;
5265 PDATA_PUSH(self->stack, list, -1);
5266 return 0;
5267}
5268
5269static int
5270load_dict(UnpicklerObject *self)
5271{
5272 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005273 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005274
5275 if ((i = marker(self)) < 0)
5276 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005277 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005278
5279 if ((dict = PyDict_New()) == NULL)
5280 return -1;
5281
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005282 if ((j - i) % 2 != 0) {
5283 PickleState *st = _Pickle_GetGlobalState();
5284 PyErr_SetString(st->UnpicklingError, "odd number of items for DICT");
Serhiy Storchaka3ac53802015-12-07 11:32:00 +02005285 Py_DECREF(dict);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005286 return -1;
5287 }
5288
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005289 for (k = i + 1; k < j; k += 2) {
5290 key = self->stack->data[k - 1];
5291 value = self->stack->data[k];
5292 if (PyDict_SetItem(dict, key, value) < 0) {
5293 Py_DECREF(dict);
5294 return -1;
5295 }
5296 }
5297 Pdata_clear(self->stack, i);
5298 PDATA_PUSH(self->stack, dict, -1);
5299 return 0;
5300}
5301
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005302static int
5303load_frozenset(UnpicklerObject *self)
5304{
5305 PyObject *items;
5306 PyObject *frozenset;
5307 Py_ssize_t i;
5308
5309 if ((i = marker(self)) < 0)
5310 return -1;
5311
5312 items = Pdata_poptuple(self->stack, i);
5313 if (items == NULL)
5314 return -1;
5315
5316 frozenset = PyFrozenSet_New(items);
5317 Py_DECREF(items);
5318 if (frozenset == NULL)
5319 return -1;
5320
5321 PDATA_PUSH(self->stack, frozenset, -1);
5322 return 0;
5323}
5324
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005325static PyObject *
5326instantiate(PyObject *cls, PyObject *args)
5327{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005328 /* Caller must assure args are a tuple. Normally, args come from
5329 Pdata_poptuple which packs objects from the top of the stack
5330 into a newly created tuple. */
5331 assert(PyTuple_Check(args));
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005332 if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
5333 _Py_IDENTIFIER(__getinitargs__);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005334 _Py_IDENTIFIER(__new__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005335 PyObject *func;
5336 if (_PyObject_LookupAttrId(cls, &PyId___getinitargs__, &func) < 0) {
5337 return NULL;
5338 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005339 if (func == NULL) {
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005340 return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
5341 }
5342 Py_DECREF(func);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005343 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005344 return PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005345}
5346
5347static int
5348load_obj(UnpicklerObject *self)
5349{
5350 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005351 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005352
5353 if ((i = marker(self)) < 0)
5354 return -1;
5355
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005356 if (Py_SIZE(self->stack) - i < 1)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005357 return Pdata_stack_underflow(self->stack);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005358
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005359 args = Pdata_poptuple(self->stack, i + 1);
5360 if (args == NULL)
5361 return -1;
5362
5363 PDATA_POP(self->stack, cls);
5364 if (cls) {
5365 obj = instantiate(cls, args);
5366 Py_DECREF(cls);
5367 }
5368 Py_DECREF(args);
5369 if (obj == NULL)
5370 return -1;
5371
5372 PDATA_PUSH(self->stack, obj, -1);
5373 return 0;
5374}
5375
5376static int
5377load_inst(UnpicklerObject *self)
5378{
5379 PyObject *cls = NULL;
5380 PyObject *args = NULL;
5381 PyObject *obj = NULL;
5382 PyObject *module_name;
5383 PyObject *class_name;
5384 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005385 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005386 char *s;
5387
5388 if ((i = marker(self)) < 0)
5389 return -1;
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;
5392 if (len < 2)
5393 return bad_readline();
5394
5395 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5396 identifiers are permitted in Python 3.0, since the INST opcode is only
5397 supported by older protocols on Python 2.x. */
5398 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5399 if (module_name == NULL)
5400 return -1;
5401
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005402 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005403 if (len < 2) {
5404 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005405 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005406 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005407 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005408 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005409 cls = find_class(self, module_name, class_name);
5410 Py_DECREF(class_name);
5411 }
5412 }
5413 Py_DECREF(module_name);
5414
5415 if (cls == NULL)
5416 return -1;
5417
5418 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5419 obj = instantiate(cls, args);
5420 Py_DECREF(args);
5421 }
5422 Py_DECREF(cls);
5423
5424 if (obj == NULL)
5425 return -1;
5426
5427 PDATA_PUSH(self->stack, obj, -1);
5428 return 0;
5429}
5430
5431static int
5432load_newobj(UnpicklerObject *self)
5433{
5434 PyObject *args = NULL;
5435 PyObject *clsraw = NULL;
5436 PyTypeObject *cls; /* clsraw cast to its true type */
5437 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005438 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005439
5440 /* Stack is ... cls argtuple, and we want to call
5441 * cls.__new__(cls, *argtuple).
5442 */
5443 PDATA_POP(self->stack, args);
5444 if (args == NULL)
5445 goto error;
5446 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005447 PyErr_SetString(st->UnpicklingError,
5448 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005449 goto error;
5450 }
5451
5452 PDATA_POP(self->stack, clsraw);
5453 cls = (PyTypeObject *)clsraw;
5454 if (cls == NULL)
5455 goto error;
5456 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005457 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005458 "isn't a type object");
5459 goto error;
5460 }
5461 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005462 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005463 "has NULL tp_new");
5464 goto error;
5465 }
5466
5467 /* Call __new__. */
5468 obj = cls->tp_new(cls, args, NULL);
5469 if (obj == NULL)
5470 goto error;
5471
5472 Py_DECREF(args);
5473 Py_DECREF(clsraw);
5474 PDATA_PUSH(self->stack, obj, -1);
5475 return 0;
5476
5477 error:
5478 Py_XDECREF(args);
5479 Py_XDECREF(clsraw);
5480 return -1;
5481}
5482
5483static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005484load_newobj_ex(UnpicklerObject *self)
5485{
5486 PyObject *cls, *args, *kwargs;
5487 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005488 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005489
5490 PDATA_POP(self->stack, kwargs);
5491 if (kwargs == NULL) {
5492 return -1;
5493 }
5494 PDATA_POP(self->stack, args);
5495 if (args == NULL) {
5496 Py_DECREF(kwargs);
5497 return -1;
5498 }
5499 PDATA_POP(self->stack, cls);
5500 if (cls == NULL) {
5501 Py_DECREF(kwargs);
5502 Py_DECREF(args);
5503 return -1;
5504 }
Larry Hastings61272b72014-01-07 12:41:53 -08005505
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005506 if (!PyType_Check(cls)) {
5507 Py_DECREF(kwargs);
5508 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005509 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005510 "NEWOBJ_EX class argument must be a type, not %.200s",
5511 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005512 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005513 return -1;
5514 }
5515
5516 if (((PyTypeObject *)cls)->tp_new == NULL) {
5517 Py_DECREF(kwargs);
5518 Py_DECREF(args);
5519 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005520 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005521 "NEWOBJ_EX class argument doesn't have __new__");
5522 return -1;
5523 }
5524 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5525 Py_DECREF(kwargs);
5526 Py_DECREF(args);
5527 Py_DECREF(cls);
5528 if (obj == NULL) {
5529 return -1;
5530 }
5531 PDATA_PUSH(self->stack, obj, -1);
5532 return 0;
5533}
5534
5535static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005536load_global(UnpicklerObject *self)
5537{
5538 PyObject *global = NULL;
5539 PyObject *module_name;
5540 PyObject *global_name;
5541 Py_ssize_t len;
5542 char *s;
5543
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005544 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005545 return -1;
5546 if (len < 2)
5547 return bad_readline();
5548 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5549 if (!module_name)
5550 return -1;
5551
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005552 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005553 if (len < 2) {
5554 Py_DECREF(module_name);
5555 return bad_readline();
5556 }
5557 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5558 if (global_name) {
5559 global = find_class(self, module_name, global_name);
5560 Py_DECREF(global_name);
5561 }
5562 }
5563 Py_DECREF(module_name);
5564
5565 if (global == NULL)
5566 return -1;
5567 PDATA_PUSH(self->stack, global, -1);
5568 return 0;
5569}
5570
5571static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005572load_stack_global(UnpicklerObject *self)
5573{
5574 PyObject *global;
5575 PyObject *module_name;
5576 PyObject *global_name;
5577
5578 PDATA_POP(self->stack, global_name);
5579 PDATA_POP(self->stack, module_name);
5580 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5581 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005582 PickleState *st = _Pickle_GetGlobalState();
5583 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005584 Py_XDECREF(global_name);
5585 Py_XDECREF(module_name);
5586 return -1;
5587 }
5588 global = find_class(self, module_name, global_name);
5589 Py_DECREF(global_name);
5590 Py_DECREF(module_name);
5591 if (global == NULL)
5592 return -1;
5593 PDATA_PUSH(self->stack, global, -1);
5594 return 0;
5595}
5596
5597static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005598load_persid(UnpicklerObject *self)
5599{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005600 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005601 Py_ssize_t len;
5602 char *s;
5603
5604 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005605 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005606 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005607 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005608 return bad_readline();
5609
Serhiy Storchakadec25af2016-07-17 11:24:17 +03005610 pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
5611 if (pid == NULL) {
5612 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
5613 PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
5614 "persistent IDs in protocol 0 must be "
5615 "ASCII strings");
5616 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005617 return -1;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03005618 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005619
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005620 obj = call_method(self->pers_func, self->pers_func_self, pid);
5621 Py_DECREF(pid);
5622 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005623 return -1;
5624
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005625 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005626 return 0;
5627 }
5628 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005629 PickleState *st = _Pickle_GetGlobalState();
5630 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005631 "A load persistent id instruction was encountered,\n"
5632 "but no persistent_load function was specified.");
5633 return -1;
5634 }
5635}
5636
5637static int
5638load_binpersid(UnpicklerObject *self)
5639{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005640 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005641
5642 if (self->pers_func) {
5643 PDATA_POP(self->stack, pid);
5644 if (pid == NULL)
5645 return -1;
5646
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005647 obj = call_method(self->pers_func, self->pers_func_self, pid);
5648 Py_DECREF(pid);
5649 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005650 return -1;
5651
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005652 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005653 return 0;
5654 }
5655 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005656 PickleState *st = _Pickle_GetGlobalState();
5657 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005658 "A load persistent id instruction was encountered,\n"
5659 "but no persistent_load function was specified.");
5660 return -1;
5661 }
5662}
5663
5664static int
5665load_pop(UnpicklerObject *self)
5666{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005667 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005668
5669 /* Note that we split the (pickle.py) stack into two stacks,
5670 * an object stack and a mark stack. We have to be clever and
5671 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005672 * mark stack first, and only signalling a stack underflow if
5673 * the object stack is empty and the mark stack doesn't match
5674 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005675 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005676 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005677 self->num_marks--;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005678 self->stack->mark_set = self->num_marks != 0;
5679 self->stack->fence = self->num_marks ?
5680 self->marks[self->num_marks - 1] : 0;
5681 } else if (len <= self->stack->fence)
5682 return Pdata_stack_underflow(self->stack);
5683 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005684 len--;
5685 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005686 Py_SIZE(self->stack) = len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005687 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005688 return 0;
5689}
5690
5691static int
5692load_pop_mark(UnpicklerObject *self)
5693{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005694 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005695
5696 if ((i = marker(self)) < 0)
5697 return -1;
5698
5699 Pdata_clear(self->stack, i);
5700
5701 return 0;
5702}
5703
5704static int
5705load_dup(UnpicklerObject *self)
5706{
5707 PyObject *last;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005708 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005709
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005710 if (len <= self->stack->fence)
5711 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005712 last = self->stack->data[len - 1];
5713 PDATA_APPEND(self->stack, last, -1);
5714 return 0;
5715}
5716
5717static int
5718load_get(UnpicklerObject *self)
5719{
5720 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005721 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005722 Py_ssize_t len;
5723 char *s;
5724
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005725 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005726 return -1;
5727 if (len < 2)
5728 return bad_readline();
5729
5730 key = PyLong_FromString(s, NULL, 10);
5731 if (key == NULL)
5732 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005733 idx = PyLong_AsSsize_t(key);
5734 if (idx == -1 && PyErr_Occurred()) {
5735 Py_DECREF(key);
5736 return -1;
5737 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005738
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005739 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005740 if (value == NULL) {
5741 if (!PyErr_Occurred())
5742 PyErr_SetObject(PyExc_KeyError, key);
5743 Py_DECREF(key);
5744 return -1;
5745 }
5746 Py_DECREF(key);
5747
5748 PDATA_APPEND(self->stack, value, -1);
5749 return 0;
5750}
5751
5752static int
5753load_binget(UnpicklerObject *self)
5754{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005755 PyObject *value;
5756 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005757 char *s;
5758
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005759 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005760 return -1;
5761
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005762 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005763
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005764 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005765 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005766 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005767 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005768 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005769 Py_DECREF(key);
5770 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005771 return -1;
5772 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005773
5774 PDATA_APPEND(self->stack, value, -1);
5775 return 0;
5776}
5777
5778static int
5779load_long_binget(UnpicklerObject *self)
5780{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005781 PyObject *value;
5782 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005783 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005784
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005785 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005786 return -1;
5787
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005788 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005789
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005790 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005791 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005792 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005793 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005794 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005795 Py_DECREF(key);
5796 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005797 return -1;
5798 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005799
5800 PDATA_APPEND(self->stack, value, -1);
5801 return 0;
5802}
5803
5804/* Push an object from the extension registry (EXT[124]). nbytes is
5805 * the number of bytes following the opcode, holding the index (code) value.
5806 */
5807static int
5808load_extension(UnpicklerObject *self, int nbytes)
5809{
5810 char *codebytes; /* the nbytes bytes after the opcode */
5811 long code; /* calc_binint returns long */
5812 PyObject *py_code; /* code as a Python int */
5813 PyObject *obj; /* the object to push */
5814 PyObject *pair; /* (module_name, class_name) */
5815 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005816 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005817
5818 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005819 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005820 return -1;
5821 code = calc_binint(codebytes, nbytes);
5822 if (code <= 0) { /* note that 0 is forbidden */
5823 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005824 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005825 return -1;
5826 }
5827
5828 /* Look for the code in the cache. */
5829 py_code = PyLong_FromLong(code);
5830 if (py_code == NULL)
5831 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005832 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005833 if (obj != NULL) {
5834 /* Bingo. */
5835 Py_DECREF(py_code);
5836 PDATA_APPEND(self->stack, obj, -1);
5837 return 0;
5838 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005839 if (PyErr_Occurred()) {
5840 Py_DECREF(py_code);
5841 return -1;
5842 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005843
5844 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005845 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005846 if (pair == NULL) {
5847 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005848 if (!PyErr_Occurred()) {
5849 PyErr_Format(PyExc_ValueError, "unregistered extension "
5850 "code %ld", code);
5851 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005852 return -1;
5853 }
5854 /* Since the extension registry is manipulable via Python code,
5855 * confirm that pair is really a 2-tuple of strings.
5856 */
5857 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5858 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5859 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5860 Py_DECREF(py_code);
5861 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5862 "isn't a 2-tuple of strings", code);
5863 return -1;
5864 }
5865 /* Load the object. */
5866 obj = find_class(self, module_name, class_name);
5867 if (obj == NULL) {
5868 Py_DECREF(py_code);
5869 return -1;
5870 }
5871 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005872 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005873 Py_DECREF(py_code);
5874 if (code < 0) {
5875 Py_DECREF(obj);
5876 return -1;
5877 }
5878 PDATA_PUSH(self->stack, obj, -1);
5879 return 0;
5880}
5881
5882static int
5883load_put(UnpicklerObject *self)
5884{
5885 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005886 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005887 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005888 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005889
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005890 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005891 return -1;
5892 if (len < 2)
5893 return bad_readline();
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005894 if (Py_SIZE(self->stack) <= self->stack->fence)
5895 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005896 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005897
5898 key = PyLong_FromString(s, NULL, 10);
5899 if (key == NULL)
5900 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005901 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005902 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005903 if (idx < 0) {
5904 if (!PyErr_Occurred())
5905 PyErr_SetString(PyExc_ValueError,
5906 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005907 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005908 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005909
5910 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005911}
5912
5913static int
5914load_binput(UnpicklerObject *self)
5915{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005916 PyObject *value;
5917 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005918 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005919
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005920 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005921 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005922
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005923 if (Py_SIZE(self->stack) <= self->stack->fence)
5924 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005925 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005926
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005927 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005928
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005929 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005930}
5931
5932static int
5933load_long_binput(UnpicklerObject *self)
5934{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005935 PyObject *value;
5936 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005937 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005938
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005939 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005940 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005941
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005942 if (Py_SIZE(self->stack) <= self->stack->fence)
5943 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005944 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005945
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005946 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005947 if (idx < 0) {
5948 PyErr_SetString(PyExc_ValueError,
5949 "negative LONG_BINPUT argument");
5950 return -1;
5951 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005952
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005953 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005954}
5955
5956static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005957load_memoize(UnpicklerObject *self)
5958{
5959 PyObject *value;
5960
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005961 if (Py_SIZE(self->stack) <= self->stack->fence)
5962 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005963 value = self->stack->data[Py_SIZE(self->stack) - 1];
5964
5965 return _Unpickler_MemoPut(self, self->memo_len, value);
5966}
5967
5968static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005969do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005970{
5971 PyObject *value;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005972 PyObject *slice;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005973 PyObject *list;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005974 PyObject *result;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005975 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005976
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005977 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005978 if (x > len || x <= self->stack->fence)
5979 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005980 if (len == x) /* nothing to do */
5981 return 0;
5982
5983 list = self->stack->data[x - 1];
5984
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005985 if (PyList_CheckExact(list)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005986 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005987 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005988
5989 slice = Pdata_poplist(self->stack, x);
5990 if (!slice)
5991 return -1;
5992 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005993 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005994 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005995 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005996 }
5997 else {
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02005998 PyObject *extend_func;
5999 _Py_IDENTIFIER(extend);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006000
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006001 extend_func = _PyObject_GetAttrId(list, &PyId_extend);
6002 if (extend_func != NULL) {
6003 slice = Pdata_poplist(self->stack, x);
6004 if (!slice) {
6005 Py_DECREF(extend_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006006 return -1;
6007 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006008 result = _Pickle_FastCall(extend_func, slice);
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006009 Py_DECREF(extend_func);
6010 if (result == NULL)
6011 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006012 Py_DECREF(result);
6013 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006014 else {
6015 PyObject *append_func;
6016 _Py_IDENTIFIER(append);
6017
6018 /* Even if the PEP 307 requires extend() and append() methods,
6019 fall back on append() if the object has no extend() method
6020 for backward compatibility. */
6021 PyErr_Clear();
6022 append_func = _PyObject_GetAttrId(list, &PyId_append);
6023 if (append_func == NULL)
6024 return -1;
6025 for (i = x; i < len; i++) {
6026 value = self->stack->data[i];
6027 result = _Pickle_FastCall(append_func, value);
6028 if (result == NULL) {
6029 Pdata_clear(self->stack, i + 1);
6030 Py_SIZE(self->stack) = x;
6031 Py_DECREF(append_func);
6032 return -1;
6033 }
6034 Py_DECREF(result);
6035 }
6036 Py_SIZE(self->stack) = x;
6037 Py_DECREF(append_func);
6038 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006039 }
6040
6041 return 0;
6042}
6043
6044static int
6045load_append(UnpicklerObject *self)
6046{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006047 if (Py_SIZE(self->stack) - 1 <= self->stack->fence)
6048 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006049 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006050}
6051
6052static int
6053load_appends(UnpicklerObject *self)
6054{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006055 Py_ssize_t i = marker(self);
6056 if (i < 0)
6057 return -1;
6058 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006059}
6060
6061static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006062do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006063{
6064 PyObject *value, *key;
6065 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006066 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006067 int status = 0;
6068
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006069 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006070 if (x > len || x <= self->stack->fence)
6071 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006072 if (len == x) /* nothing to do */
6073 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02006074 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006075 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006076 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006077 PyErr_SetString(st->UnpicklingError,
6078 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006079 return -1;
6080 }
6081
6082 /* Here, dict does not actually need to be a PyDict; it could be anything
6083 that supports the __setitem__ attribute. */
6084 dict = self->stack->data[x - 1];
6085
6086 for (i = x + 1; i < len; i += 2) {
6087 key = self->stack->data[i - 1];
6088 value = self->stack->data[i];
6089 if (PyObject_SetItem(dict, key, value) < 0) {
6090 status = -1;
6091 break;
6092 }
6093 }
6094
6095 Pdata_clear(self->stack, x);
6096 return status;
6097}
6098
6099static int
6100load_setitem(UnpicklerObject *self)
6101{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006102 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006103}
6104
6105static int
6106load_setitems(UnpicklerObject *self)
6107{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006108 Py_ssize_t i = marker(self);
6109 if (i < 0)
6110 return -1;
6111 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006112}
6113
6114static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006115load_additems(UnpicklerObject *self)
6116{
6117 PyObject *set;
6118 Py_ssize_t mark, len, i;
6119
6120 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006121 if (mark < 0)
6122 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006123 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006124 if (mark > len || mark <= self->stack->fence)
6125 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006126 if (len == mark) /* nothing to do */
6127 return 0;
6128
6129 set = self->stack->data[mark - 1];
6130
6131 if (PySet_Check(set)) {
6132 PyObject *items;
6133 int status;
6134
6135 items = Pdata_poptuple(self->stack, mark);
6136 if (items == NULL)
6137 return -1;
6138
6139 status = _PySet_Update(set, items);
6140 Py_DECREF(items);
6141 return status;
6142 }
6143 else {
6144 PyObject *add_func;
6145 _Py_IDENTIFIER(add);
6146
6147 add_func = _PyObject_GetAttrId(set, &PyId_add);
6148 if (add_func == NULL)
6149 return -1;
6150 for (i = mark; i < len; i++) {
6151 PyObject *result;
6152 PyObject *item;
6153
6154 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006155 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006156 if (result == NULL) {
6157 Pdata_clear(self->stack, i + 1);
6158 Py_SIZE(self->stack) = mark;
6159 return -1;
6160 }
6161 Py_DECREF(result);
6162 }
6163 Py_SIZE(self->stack) = mark;
6164 }
6165
6166 return 0;
6167}
6168
6169static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006170load_build(UnpicklerObject *self)
6171{
6172 PyObject *state, *inst, *slotstate;
6173 PyObject *setstate;
6174 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006175 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006176
6177 /* Stack is ... instance, state. We want to leave instance at
6178 * the stack top, possibly mutated via instance.__setstate__(state).
6179 */
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006180 if (Py_SIZE(self->stack) - 2 < self->stack->fence)
6181 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006182
6183 PDATA_POP(self->stack, state);
6184 if (state == NULL)
6185 return -1;
6186
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006187 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006188
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006189 if (_PyObject_LookupAttrId(inst, &PyId___setstate__, &setstate) < 0) {
6190 Py_DECREF(state);
6191 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006192 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006193 if (setstate != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006194 PyObject *result;
6195
6196 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006197 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006198 Py_DECREF(setstate);
6199 if (result == NULL)
6200 return -1;
6201 Py_DECREF(result);
6202 return 0;
6203 }
6204
6205 /* A default __setstate__. First see whether state embeds a
6206 * slot state dict too (a proto 2 addition).
6207 */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02006208 if (PyTuple_Check(state) && PyTuple_GET_SIZE(state) == 2) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006209 PyObject *tmp = state;
6210
6211 state = PyTuple_GET_ITEM(tmp, 0);
6212 slotstate = PyTuple_GET_ITEM(tmp, 1);
6213 Py_INCREF(state);
6214 Py_INCREF(slotstate);
6215 Py_DECREF(tmp);
6216 }
6217 else
6218 slotstate = NULL;
6219
6220 /* Set inst.__dict__ from the state dict (if any). */
6221 if (state != Py_None) {
6222 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006223 PyObject *d_key, *d_value;
6224 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006225 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006226
6227 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006228 PickleState *st = _Pickle_GetGlobalState();
6229 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006230 goto error;
6231 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006232 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006233 if (dict == NULL)
6234 goto error;
6235
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006236 i = 0;
6237 while (PyDict_Next(state, &i, &d_key, &d_value)) {
6238 /* normally the keys for instance attributes are
6239 interned. we should try to do that here. */
6240 Py_INCREF(d_key);
6241 if (PyUnicode_CheckExact(d_key))
6242 PyUnicode_InternInPlace(&d_key);
6243 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6244 Py_DECREF(d_key);
6245 goto error;
6246 }
6247 Py_DECREF(d_key);
6248 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006249 Py_DECREF(dict);
6250 }
6251
6252 /* Also set instance attributes from the slotstate dict (if any). */
6253 if (slotstate != NULL) {
6254 PyObject *d_key, *d_value;
6255 Py_ssize_t i;
6256
6257 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006258 PickleState *st = _Pickle_GetGlobalState();
6259 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006260 "slot state is not a dictionary");
6261 goto error;
6262 }
6263 i = 0;
6264 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6265 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6266 goto error;
6267 }
6268 }
6269
6270 if (0) {
6271 error:
6272 status = -1;
6273 }
6274
6275 Py_DECREF(state);
6276 Py_XDECREF(slotstate);
6277 return status;
6278}
6279
6280static int
6281load_mark(UnpicklerObject *self)
6282{
6283
6284 /* Note that we split the (pickle.py) stack into two stacks, an
6285 * object stack and a mark stack. Here we push a mark onto the
6286 * mark stack.
6287 */
6288
6289 if ((self->num_marks + 1) >= self->marks_size) {
6290 size_t alloc;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006291
6292 /* Use the size_t type to check for overflow. */
6293 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006294 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006295 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006296 PyErr_NoMemory();
6297 return -1;
6298 }
6299
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05006300 Py_ssize_t *marks_old = self->marks;
6301 PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006302 if (self->marks == NULL) {
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05006303 PyMem_FREE(marks_old);
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006304 self->marks_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305 PyErr_NoMemory();
6306 return -1;
6307 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006308 self->marks_size = (Py_ssize_t)alloc;
6309 }
6310
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006311 self->stack->mark_set = 1;
6312 self->marks[self->num_marks++] = self->stack->fence = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006313
6314 return 0;
6315}
6316
6317static int
6318load_reduce(UnpicklerObject *self)
6319{
6320 PyObject *callable = NULL;
6321 PyObject *argtup = NULL;
6322 PyObject *obj = NULL;
6323
6324 PDATA_POP(self->stack, argtup);
6325 if (argtup == NULL)
6326 return -1;
6327 PDATA_POP(self->stack, callable);
6328 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006329 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006330 Py_DECREF(callable);
6331 }
6332 Py_DECREF(argtup);
6333
6334 if (obj == NULL)
6335 return -1;
6336
6337 PDATA_PUSH(self->stack, obj, -1);
6338 return 0;
6339}
6340
6341/* Just raises an error if we don't know the protocol specified. PROTO
6342 * is the first opcode for protocols >= 2.
6343 */
6344static int
6345load_proto(UnpicklerObject *self)
6346{
6347 char *s;
6348 int i;
6349
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006350 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006351 return -1;
6352
6353 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006354 if (i <= HIGHEST_PROTOCOL) {
6355 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006356 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006357 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006358
6359 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6360 return -1;
6361}
6362
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006363static int
6364load_frame(UnpicklerObject *self)
6365{
6366 char *s;
6367 Py_ssize_t frame_len;
6368
6369 if (_Unpickler_Read(self, &s, 8) < 0)
6370 return -1;
6371
6372 frame_len = calc_binsize(s, 8);
6373 if (frame_len < 0) {
6374 PyErr_Format(PyExc_OverflowError,
6375 "FRAME length exceeds system's maximum of %zd bytes",
6376 PY_SSIZE_T_MAX);
6377 return -1;
6378 }
6379
6380 if (_Unpickler_Read(self, &s, frame_len) < 0)
6381 return -1;
6382
6383 /* Rewind to start of frame */
6384 self->next_read_idx -= frame_len;
6385 return 0;
6386}
6387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006388static PyObject *
6389load(UnpicklerObject *self)
6390{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006391 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006392 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006393
6394 self->num_marks = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006395 self->stack->mark_set = 0;
6396 self->stack->fence = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006397 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006398 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006399 Pdata_clear(self->stack, 0);
6400
6401 /* Convenient macros for the dispatch while-switch loop just below. */
6402#define OP(opcode, load_func) \
6403 case opcode: if (load_func(self) < 0) break; continue;
6404
6405#define OP_ARG(opcode, load_func, arg) \
6406 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6407
6408 while (1) {
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006409 if (_Unpickler_Read(self, &s, 1) < 0) {
6410 PickleState *st = _Pickle_GetGlobalState();
6411 if (PyErr_ExceptionMatches(st->UnpicklingError)) {
6412 PyErr_Format(PyExc_EOFError, "Ran out of input");
6413 }
6414 return NULL;
6415 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006416
6417 switch ((enum opcode)s[0]) {
6418 OP(NONE, load_none)
6419 OP(BININT, load_binint)
6420 OP(BININT1, load_binint1)
6421 OP(BININT2, load_binint2)
6422 OP(INT, load_int)
6423 OP(LONG, load_long)
6424 OP_ARG(LONG1, load_counted_long, 1)
6425 OP_ARG(LONG4, load_counted_long, 4)
6426 OP(FLOAT, load_float)
6427 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006428 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6429 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6430 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6431 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6432 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006433 OP(STRING, load_string)
6434 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006435 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6436 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6437 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006438 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6439 OP_ARG(TUPLE1, load_counted_tuple, 1)
6440 OP_ARG(TUPLE2, load_counted_tuple, 2)
6441 OP_ARG(TUPLE3, load_counted_tuple, 3)
6442 OP(TUPLE, load_tuple)
6443 OP(EMPTY_LIST, load_empty_list)
6444 OP(LIST, load_list)
6445 OP(EMPTY_DICT, load_empty_dict)
6446 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006447 OP(EMPTY_SET, load_empty_set)
6448 OP(ADDITEMS, load_additems)
6449 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006450 OP(OBJ, load_obj)
6451 OP(INST, load_inst)
6452 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006453 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006454 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006455 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006456 OP(APPEND, load_append)
6457 OP(APPENDS, load_appends)
6458 OP(BUILD, load_build)
6459 OP(DUP, load_dup)
6460 OP(BINGET, load_binget)
6461 OP(LONG_BINGET, load_long_binget)
6462 OP(GET, load_get)
6463 OP(MARK, load_mark)
6464 OP(BINPUT, load_binput)
6465 OP(LONG_BINPUT, load_long_binput)
6466 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006467 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006468 OP(POP, load_pop)
6469 OP(POP_MARK, load_pop_mark)
6470 OP(SETITEM, load_setitem)
6471 OP(SETITEMS, load_setitems)
6472 OP(PERSID, load_persid)
6473 OP(BINPERSID, load_binpersid)
6474 OP(REDUCE, load_reduce)
6475 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006476 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006477 OP_ARG(EXT1, load_extension, 1)
6478 OP_ARG(EXT2, load_extension, 2)
6479 OP_ARG(EXT4, load_extension, 4)
6480 OP_ARG(NEWTRUE, load_bool, Py_True)
6481 OP_ARG(NEWFALSE, load_bool, Py_False)
6482
6483 case STOP:
6484 break;
6485
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006486 default:
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006487 {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006488 PickleState *st = _Pickle_GetGlobalState();
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006489 unsigned char c = (unsigned char) *s;
6490 if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') {
6491 PyErr_Format(st->UnpicklingError,
6492 "invalid load key, '%c'.", c);
6493 }
6494 else {
6495 PyErr_Format(st->UnpicklingError,
6496 "invalid load key, '\\x%02x'.", c);
6497 }
6498 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006499 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006500 }
6501
6502 break; /* and we are done! */
6503 }
6504
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006505 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006506 return NULL;
6507 }
6508
Victor Stinner2ae57e32013-10-31 13:39:23 +01006509 if (_Unpickler_SkipConsumed(self) < 0)
6510 return NULL;
6511
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006512 PDATA_POP(self->stack, value);
6513 return value;
6514}
6515
Larry Hastings61272b72014-01-07 12:41:53 -08006516/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006517
6518_pickle.Unpickler.load
6519
6520Load a pickle.
6521
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006522Read a pickled object representation from the open file object given
6523in the constructor, and return the reconstituted object hierarchy
6524specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006525[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006526
Larry Hastings3cceb382014-01-04 11:09:09 -08006527static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006528_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006529/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006530{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006531 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006532
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006533 /* Check whether the Unpickler was initialized correctly. This prevents
6534 segfaulting if a subclass overridden __init__ with a function that does
6535 not call Unpickler.__init__(). Here, we simply ensure that self->read
6536 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006537 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006538 PickleState *st = _Pickle_GetGlobalState();
6539 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006540 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006541 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006542 return NULL;
6543 }
6544
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006545 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006546}
6547
6548/* The name of find_class() is misleading. In newer pickle protocols, this
6549 function is used for loading any global (i.e., functions), not just
6550 classes. The name is kept only for backward compatibility. */
6551
Larry Hastings61272b72014-01-07 12:41:53 -08006552/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006553
6554_pickle.Unpickler.find_class
6555
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006556 module_name: object
6557 global_name: object
6558 /
6559
6560Return an object from a specified module.
6561
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006562If necessary, the module will be imported. Subclasses may override
6563this method (e.g. to restrict unpickling of arbitrary classes and
6564functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006565
6566This method is called whenever a class or a function object is
6567needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006568[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006569
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006570static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006571_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
6572 PyObject *module_name,
6573 PyObject *global_name)
6574/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006575{
6576 PyObject *global;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006577 PyObject *module;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006578
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006579 /* Try to map the old names used in Python 2.x to the new ones used in
6580 Python 3.x. We do this only with old pickle protocols and when the
6581 user has not disabled the feature. */
6582 if (self->proto < 3 && self->fix_imports) {
6583 PyObject *key;
6584 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006585 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006586
6587 /* Check if the global (i.e., a function or a class) was renamed
6588 or moved to another module. */
6589 key = PyTuple_Pack(2, module_name, global_name);
6590 if (key == NULL)
6591 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006592 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006593 Py_DECREF(key);
6594 if (item) {
6595 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6596 PyErr_Format(PyExc_RuntimeError,
6597 "_compat_pickle.NAME_MAPPING values should be "
6598 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6599 return NULL;
6600 }
6601 module_name = PyTuple_GET_ITEM(item, 0);
6602 global_name = PyTuple_GET_ITEM(item, 1);
6603 if (!PyUnicode_Check(module_name) ||
6604 !PyUnicode_Check(global_name)) {
6605 PyErr_Format(PyExc_RuntimeError,
6606 "_compat_pickle.NAME_MAPPING values should be "
6607 "pairs of str, not (%.200s, %.200s)",
6608 Py_TYPE(module_name)->tp_name,
6609 Py_TYPE(global_name)->tp_name);
6610 return NULL;
6611 }
6612 }
6613 else if (PyErr_Occurred()) {
6614 return NULL;
6615 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03006616 else {
6617 /* Check if the module was renamed. */
6618 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
6619 if (item) {
6620 if (!PyUnicode_Check(item)) {
6621 PyErr_Format(PyExc_RuntimeError,
6622 "_compat_pickle.IMPORT_MAPPING values should be "
6623 "strings, not %.200s", Py_TYPE(item)->tp_name);
6624 return NULL;
6625 }
6626 module_name = item;
6627 }
6628 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006629 return NULL;
6630 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006631 }
6632 }
6633
Eric Snow3f9eee62017-09-15 16:35:20 -06006634 module = PyImport_GetModule(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006635 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006636 if (PyErr_Occurred())
6637 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006638 module = PyImport_Import(module_name);
6639 if (module == NULL)
6640 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006641 }
Eric Snow3f9eee62017-09-15 16:35:20 -06006642 global = getattribute(module, global_name, self->proto >= 4);
6643 Py_DECREF(module);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006644 return global;
6645}
6646
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006647/*[clinic input]
6648
6649_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6650
6651Returns size in memory, in bytes.
6652[clinic start generated code]*/
6653
6654static Py_ssize_t
6655_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6656/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6657{
6658 Py_ssize_t res;
6659
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02006660 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006661 if (self->memo != NULL)
6662 res += self->memo_size * sizeof(PyObject *);
6663 if (self->marks != NULL)
6664 res += self->marks_size * sizeof(Py_ssize_t);
6665 if (self->input_line != NULL)
6666 res += strlen(self->input_line) + 1;
6667 if (self->encoding != NULL)
6668 res += strlen(self->encoding) + 1;
6669 if (self->errors != NULL)
6670 res += strlen(self->errors) + 1;
6671 return res;
6672}
6673
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006674static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006675 _PICKLE_UNPICKLER_LOAD_METHODDEF
6676 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006677 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006678 {NULL, NULL} /* sentinel */
6679};
6680
6681static void
6682Unpickler_dealloc(UnpicklerObject *self)
6683{
6684 PyObject_GC_UnTrack((PyObject *)self);
6685 Py_XDECREF(self->readline);
6686 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006687 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006688 Py_XDECREF(self->stack);
6689 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006690 if (self->buffer.buf != NULL) {
6691 PyBuffer_Release(&self->buffer);
6692 self->buffer.buf = NULL;
6693 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006694
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006695 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006696 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006697 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006698 PyMem_Free(self->encoding);
6699 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006700
6701 Py_TYPE(self)->tp_free((PyObject *)self);
6702}
6703
6704static int
6705Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6706{
6707 Py_VISIT(self->readline);
6708 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006709 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006710 Py_VISIT(self->stack);
6711 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006712 return 0;
6713}
6714
6715static int
6716Unpickler_clear(UnpicklerObject *self)
6717{
6718 Py_CLEAR(self->readline);
6719 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006720 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006721 Py_CLEAR(self->stack);
6722 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006723 if (self->buffer.buf != NULL) {
6724 PyBuffer_Release(&self->buffer);
6725 self->buffer.buf = NULL;
6726 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006727
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006728 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006729 PyMem_Free(self->marks);
6730 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006731 PyMem_Free(self->input_line);
6732 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006733 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006734 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006735 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006736 self->errors = NULL;
6737
6738 return 0;
6739}
6740
Larry Hastings61272b72014-01-07 12:41:53 -08006741/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006742
6743_pickle.Unpickler.__init__
6744
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006745 file: object
6746 *
6747 fix_imports: bool = True
6748 encoding: str = 'ASCII'
6749 errors: str = 'strict'
6750
6751This takes a binary file for reading a pickle data stream.
6752
6753The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006754protocol argument is needed. Bytes past the pickled object's
6755representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006756
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006757The argument *file* must have two methods, a read() method that takes
6758an integer argument, and a readline() method that requires no
6759arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00006760binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006761other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006762
6763Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00006764which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006765generated by Python 2. If *fix_imports* is True, pickle will try to
6766map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006767*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006768instances pickled by Python 2; these default to 'ASCII' and 'strict',
6769respectively. The *encoding* can be 'bytes' to read these 8-bit
6770string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006771[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006772
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006773static int
Larry Hastings89964c42015-04-14 18:07:59 -04006774_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6775 int fix_imports, const char *encoding,
6776 const char *errors)
Martin Panter46f50722016-05-26 05:35:26 +00006777/*[clinic end generated code: output=e2c8ce748edc57b0 input=f9b7da04f5f4f335]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006778{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006779 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006780
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006781 /* In case of multiple __init__() calls, clear previous content. */
6782 if (self->read != NULL)
6783 (void)Unpickler_clear(self);
6784
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006785 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006786 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006787
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006788 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006789 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006790
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006791 self->fix_imports = fix_imports;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006792
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006793 if (init_method_ref((PyObject *)self, &PyId_persistent_load,
6794 &self->pers_func, &self->pers_func_self) < 0)
6795 {
6796 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006797 }
6798
6799 self->stack = (Pdata *)Pdata_New();
6800 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006801 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006802
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006803 self->memo_size = 32;
6804 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006805 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006806 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006807
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006808 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006809
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006810 return 0;
6811}
6812
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006813
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006814/* Define a proxy object for the Unpickler's internal memo object. This is to
6815 * avoid breaking code like:
6816 * unpickler.memo.clear()
6817 * and
6818 * unpickler.memo = saved_memo
6819 * Is this a good idea? Not really, but we don't want to break code that uses
6820 * it. Note that we don't implement the entire mapping API here. This is
6821 * intentional, as these should be treated as black-box implementation details.
6822 *
6823 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006824 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006825 */
6826
Larry Hastings61272b72014-01-07 12:41:53 -08006827/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006828_pickle.UnpicklerMemoProxy.clear
6829
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006830Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006831[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006832
Larry Hastings3cceb382014-01-04 11:09:09 -08006833static PyObject *
6834_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006835/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006836{
6837 _Unpickler_MemoCleanup(self->unpickler);
6838 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6839 if (self->unpickler->memo == NULL)
6840 return NULL;
6841 Py_RETURN_NONE;
6842}
6843
Larry Hastings61272b72014-01-07 12:41:53 -08006844/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006845_pickle.UnpicklerMemoProxy.copy
6846
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006847Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006848[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006849
Larry Hastings3cceb382014-01-04 11:09:09 -08006850static PyObject *
6851_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006852/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006853{
6854 Py_ssize_t i;
6855 PyObject *new_memo = PyDict_New();
6856 if (new_memo == NULL)
6857 return NULL;
6858
6859 for (i = 0; i < self->unpickler->memo_size; i++) {
6860 int status;
6861 PyObject *key, *value;
6862
6863 value = self->unpickler->memo[i];
6864 if (value == NULL)
6865 continue;
6866
6867 key = PyLong_FromSsize_t(i);
6868 if (key == NULL)
6869 goto error;
6870 status = PyDict_SetItem(new_memo, key, value);
6871 Py_DECREF(key);
6872 if (status < 0)
6873 goto error;
6874 }
6875 return new_memo;
6876
6877error:
6878 Py_DECREF(new_memo);
6879 return NULL;
6880}
6881
Larry Hastings61272b72014-01-07 12:41:53 -08006882/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006883_pickle.UnpicklerMemoProxy.__reduce__
6884
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006885Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006886[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006887
Larry Hastings3cceb382014-01-04 11:09:09 -08006888static PyObject *
6889_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006890/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006891{
6892 PyObject *reduce_value;
6893 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006894 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006895 if (contents == NULL)
6896 return NULL;
6897
6898 reduce_value = PyTuple_New(2);
6899 if (reduce_value == NULL) {
6900 Py_DECREF(contents);
6901 return NULL;
6902 }
6903 constructor_args = PyTuple_New(1);
6904 if (constructor_args == NULL) {
6905 Py_DECREF(contents);
6906 Py_DECREF(reduce_value);
6907 return NULL;
6908 }
6909 PyTuple_SET_ITEM(constructor_args, 0, contents);
6910 Py_INCREF((PyObject *)&PyDict_Type);
6911 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6912 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6913 return reduce_value;
6914}
6915
6916static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006917 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6918 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6919 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006920 {NULL, NULL} /* sentinel */
6921};
6922
6923static void
6924UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6925{
6926 PyObject_GC_UnTrack(self);
6927 Py_XDECREF(self->unpickler);
6928 PyObject_GC_Del((PyObject *)self);
6929}
6930
6931static int
6932UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6933 visitproc visit, void *arg)
6934{
6935 Py_VISIT(self->unpickler);
6936 return 0;
6937}
6938
6939static int
6940UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6941{
6942 Py_CLEAR(self->unpickler);
6943 return 0;
6944}
6945
6946static PyTypeObject UnpicklerMemoProxyType = {
6947 PyVarObject_HEAD_INIT(NULL, 0)
6948 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6949 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6950 0,
6951 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6952 0, /* tp_print */
6953 0, /* tp_getattr */
6954 0, /* tp_setattr */
6955 0, /* tp_compare */
6956 0, /* tp_repr */
6957 0, /* tp_as_number */
6958 0, /* tp_as_sequence */
6959 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006960 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006961 0, /* tp_call */
6962 0, /* tp_str */
6963 PyObject_GenericGetAttr, /* tp_getattro */
6964 PyObject_GenericSetAttr, /* tp_setattro */
6965 0, /* tp_as_buffer */
6966 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6967 0, /* tp_doc */
6968 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6969 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6970 0, /* tp_richcompare */
6971 0, /* tp_weaklistoffset */
6972 0, /* tp_iter */
6973 0, /* tp_iternext */
6974 unpicklerproxy_methods, /* tp_methods */
6975};
6976
6977static PyObject *
6978UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6979{
6980 UnpicklerMemoProxyObject *self;
6981
6982 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6983 &UnpicklerMemoProxyType);
6984 if (self == NULL)
6985 return NULL;
6986 Py_INCREF(unpickler);
6987 self->unpickler = unpickler;
6988 PyObject_GC_Track(self);
6989 return (PyObject *)self;
6990}
6991
6992/*****************************************************************************/
6993
6994
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006995static PyObject *
6996Unpickler_get_memo(UnpicklerObject *self)
6997{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006998 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006999}
7000
7001static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007002Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007003{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007004 PyObject **new_memo;
7005 Py_ssize_t new_memo_size = 0;
7006 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007007
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007008 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007009 PyErr_SetString(PyExc_TypeError,
7010 "attribute deletion is not supported");
7011 return -1;
7012 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007013
7014 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
7015 UnpicklerObject *unpickler =
7016 ((UnpicklerMemoProxyObject *)obj)->unpickler;
7017
7018 new_memo_size = unpickler->memo_size;
7019 new_memo = _Unpickler_NewMemo(new_memo_size);
7020 if (new_memo == NULL)
7021 return -1;
7022
7023 for (i = 0; i < new_memo_size; i++) {
7024 Py_XINCREF(unpickler->memo[i]);
7025 new_memo[i] = unpickler->memo[i];
7026 }
7027 }
7028 else if (PyDict_Check(obj)) {
7029 Py_ssize_t i = 0;
7030 PyObject *key, *value;
7031
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02007032 new_memo_size = PyDict_GET_SIZE(obj);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007033 new_memo = _Unpickler_NewMemo(new_memo_size);
7034 if (new_memo == NULL)
7035 return -1;
7036
7037 while (PyDict_Next(obj, &i, &key, &value)) {
7038 Py_ssize_t idx;
7039 if (!PyLong_Check(key)) {
7040 PyErr_SetString(PyExc_TypeError,
7041 "memo key must be integers");
7042 goto error;
7043 }
7044 idx = PyLong_AsSsize_t(key);
7045 if (idx == -1 && PyErr_Occurred())
7046 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02007047 if (idx < 0) {
7048 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02007049 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02007050 goto error;
7051 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007052 if (_Unpickler_MemoPut(self, idx, value) < 0)
7053 goto error;
7054 }
7055 }
7056 else {
7057 PyErr_Format(PyExc_TypeError,
7058 "'memo' attribute must be an UnpicklerMemoProxy object"
7059 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007060 return -1;
7061 }
7062
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007063 _Unpickler_MemoCleanup(self);
7064 self->memo_size = new_memo_size;
7065 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007066
7067 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007068
7069 error:
7070 if (new_memo_size) {
7071 i = new_memo_size;
7072 while (--i >= 0) {
7073 Py_XDECREF(new_memo[i]);
7074 }
7075 PyMem_FREE(new_memo);
7076 }
7077 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007078}
7079
7080static PyObject *
7081Unpickler_get_persload(UnpicklerObject *self)
7082{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007083 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007084 PyErr_SetString(PyExc_AttributeError, "persistent_load");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007085 return NULL;
7086 }
7087 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007088}
7089
7090static int
7091Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
7092{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007093 if (value == NULL) {
7094 PyErr_SetString(PyExc_TypeError,
7095 "attribute deletion is not supported");
7096 return -1;
7097 }
7098 if (!PyCallable_Check(value)) {
7099 PyErr_SetString(PyExc_TypeError,
7100 "persistent_load must be a callable taking "
7101 "one argument");
7102 return -1;
7103 }
7104
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007105 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007106 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03007107 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007108
7109 return 0;
7110}
7111
7112static PyGetSetDef Unpickler_getsets[] = {
7113 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
7114 {"persistent_load", (getter)Unpickler_get_persload,
7115 (setter)Unpickler_set_persload},
7116 {NULL}
7117};
7118
7119static PyTypeObject Unpickler_Type = {
7120 PyVarObject_HEAD_INIT(NULL, 0)
7121 "_pickle.Unpickler", /*tp_name*/
7122 sizeof(UnpicklerObject), /*tp_basicsize*/
7123 0, /*tp_itemsize*/
7124 (destructor)Unpickler_dealloc, /*tp_dealloc*/
7125 0, /*tp_print*/
7126 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007127 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00007128 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007129 0, /*tp_repr*/
7130 0, /*tp_as_number*/
7131 0, /*tp_as_sequence*/
7132 0, /*tp_as_mapping*/
7133 0, /*tp_hash*/
7134 0, /*tp_call*/
7135 0, /*tp_str*/
7136 0, /*tp_getattro*/
7137 0, /*tp_setattro*/
7138 0, /*tp_as_buffer*/
7139 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007140 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007141 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7142 (inquiry)Unpickler_clear, /*tp_clear*/
7143 0, /*tp_richcompare*/
7144 0, /*tp_weaklistoffset*/
7145 0, /*tp_iter*/
7146 0, /*tp_iternext*/
7147 Unpickler_methods, /*tp_methods*/
7148 0, /*tp_members*/
7149 Unpickler_getsets, /*tp_getset*/
7150 0, /*tp_base*/
7151 0, /*tp_dict*/
7152 0, /*tp_descr_get*/
7153 0, /*tp_descr_set*/
7154 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007155 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007156 PyType_GenericAlloc, /*tp_alloc*/
7157 PyType_GenericNew, /*tp_new*/
7158 PyObject_GC_Del, /*tp_free*/
7159 0, /*tp_is_gc*/
7160};
7161
Larry Hastings61272b72014-01-07 12:41:53 -08007162/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007163
7164_pickle.dump
7165
7166 obj: object
7167 file: object
7168 protocol: object = NULL
7169 *
7170 fix_imports: bool = True
7171
7172Write a pickled representation of obj to the open file object file.
7173
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007174This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7175be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007176
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007177The optional *protocol* argument tells the pickler to use the given
Łukasz Langac51d8c92018-04-03 23:06:53 -07007178protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7179protocol is 4. It was introduced in Python 3.4, it is incompatible
7180with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007181
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007182Specifying a negative protocol version selects the highest protocol
7183version supported. The higher the protocol used, the more recent the
7184version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007185
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007186The *file* argument must have a write() method that accepts a single
7187bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00007188writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007189this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007190
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007191If *fix_imports* is True and protocol is less than 3, pickle will try
7192to map the new Python 3 names to the old module names used in Python
71932, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007194[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007195
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007196static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007197_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
Larry Hastings89964c42015-04-14 18:07:59 -04007198 PyObject *protocol, int fix_imports)
Łukasz Langac51d8c92018-04-03 23:06:53 -07007199/*[clinic end generated code: output=a4774d5fde7d34de input=93f1408489a87472]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007200{
7201 PicklerObject *pickler = _Pickler_New();
7202
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007203 if (pickler == NULL)
7204 return NULL;
7205
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007206 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007207 goto error;
7208
7209 if (_Pickler_SetOutputStream(pickler, file) < 0)
7210 goto error;
7211
7212 if (dump(pickler, obj) < 0)
7213 goto error;
7214
7215 if (_Pickler_FlushToFile(pickler) < 0)
7216 goto error;
7217
7218 Py_DECREF(pickler);
7219 Py_RETURN_NONE;
7220
7221 error:
7222 Py_XDECREF(pickler);
7223 return NULL;
7224}
7225
Larry Hastings61272b72014-01-07 12:41:53 -08007226/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007227
7228_pickle.dumps
7229
7230 obj: object
7231 protocol: object = NULL
7232 *
7233 fix_imports: bool = True
7234
7235Return the pickled representation of the object as a bytes object.
7236
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007237The optional *protocol* argument tells the pickler to use the given
7238protocol; supported protocols are 0, 1, 2, 3 and 4. The default
Łukasz Langac51d8c92018-04-03 23:06:53 -07007239protocol is 4. It was introduced in Python 3.4, it is incompatible
7240with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007241
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007242Specifying a negative protocol version selects the highest protocol
7243version supported. The higher the protocol used, the more recent the
7244version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007245
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007246If *fix_imports* is True and *protocol* is less than 3, pickle will
7247try to map the new Python 3 names to the old module names used in
7248Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007249[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007250
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007251static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007252_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
Larry Hastings89964c42015-04-14 18:07:59 -04007253 int fix_imports)
Łukasz Langac51d8c92018-04-03 23:06:53 -07007254/*[clinic end generated code: output=d75d5cda456fd261 input=b6efb45a7d19b5ab]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007255{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007256 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007257 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007258
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007259 if (pickler == NULL)
7260 return NULL;
7261
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007262 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007263 goto error;
7264
7265 if (dump(pickler, obj) < 0)
7266 goto error;
7267
7268 result = _Pickler_GetString(pickler);
7269 Py_DECREF(pickler);
7270 return result;
7271
7272 error:
7273 Py_XDECREF(pickler);
7274 return NULL;
7275}
7276
Larry Hastings61272b72014-01-07 12:41:53 -08007277/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007278
7279_pickle.load
7280
7281 file: object
7282 *
7283 fix_imports: bool = True
7284 encoding: str = 'ASCII'
7285 errors: str = 'strict'
7286
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007287Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007288
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007289This is equivalent to ``Unpickler(file).load()``, but may be more
7290efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007291
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007292The protocol version of the pickle is detected automatically, so no
7293protocol argument is needed. Bytes past the pickled object's
7294representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007295
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007296The argument *file* must have two methods, a read() method that takes
7297an integer argument, and a readline() method that requires no
7298arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007299binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007300other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007301
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007302Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007303which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007304generated by Python 2. If *fix_imports* is True, pickle will try to
7305map the old Python 2 names to the new names used in Python 3. The
7306*encoding* and *errors* tell pickle how to decode 8-bit string
7307instances pickled by Python 2; these default to 'ASCII' and 'strict',
7308respectively. The *encoding* can be 'bytes' to read these 8-bit
7309string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007310[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007311
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007312static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007313_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
Larry Hastings89964c42015-04-14 18:07:59 -04007314 const char *encoding, const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007315/*[clinic end generated code: output=69e298160285199e input=01b44dd3fc07afa7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007316{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007317 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007318 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007319
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007320 if (unpickler == NULL)
7321 return NULL;
7322
7323 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7324 goto error;
7325
7326 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7327 goto error;
7328
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007329 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007330
7331 result = load(unpickler);
7332 Py_DECREF(unpickler);
7333 return result;
7334
7335 error:
7336 Py_XDECREF(unpickler);
7337 return NULL;
7338}
7339
Larry Hastings61272b72014-01-07 12:41:53 -08007340/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007341
7342_pickle.loads
7343
7344 data: object
7345 *
7346 fix_imports: bool = True
7347 encoding: str = 'ASCII'
7348 errors: str = 'strict'
7349
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007350Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007351
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007352The protocol version of the pickle is detected automatically, so no
7353protocol argument is needed. Bytes past the pickled object's
7354representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007355
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007356Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007357which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007358generated by Python 2. If *fix_imports* is True, pickle will try to
7359map the old Python 2 names to the new names used in Python 3. The
7360*encoding* and *errors* tell pickle how to decode 8-bit string
7361instances pickled by Python 2; these default to 'ASCII' and 'strict',
7362respectively. The *encoding* can be 'bytes' to read these 8-bit
7363string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007364[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007365
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007366static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007367_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
Larry Hastings89964c42015-04-14 18:07:59 -04007368 const char *encoding, const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007369/*[clinic end generated code: output=1e7cb2343f2c440f input=70605948a719feb9]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007370{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007371 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007372 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007373
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007374 if (unpickler == NULL)
7375 return NULL;
7376
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007377 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007378 goto error;
7379
7380 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7381 goto error;
7382
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007383 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007384
7385 result = load(unpickler);
7386 Py_DECREF(unpickler);
7387 return result;
7388
7389 error:
7390 Py_XDECREF(unpickler);
7391 return NULL;
7392}
7393
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007394static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007395 _PICKLE_DUMP_METHODDEF
7396 _PICKLE_DUMPS_METHODDEF
7397 _PICKLE_LOAD_METHODDEF
7398 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007399 {NULL, NULL} /* sentinel */
7400};
7401
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007402static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007403pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007404{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007405 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007406 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007407}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007408
Stefan Krahf483b0f2013-12-14 13:43:10 +01007409static void
7410pickle_free(PyObject *m)
7411{
7412 _Pickle_ClearState(_Pickle_GetState(m));
7413}
7414
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007415static int
7416pickle_traverse(PyObject *m, visitproc visit, void *arg)
7417{
7418 PickleState *st = _Pickle_GetState(m);
7419 Py_VISIT(st->PickleError);
7420 Py_VISIT(st->PicklingError);
7421 Py_VISIT(st->UnpicklingError);
7422 Py_VISIT(st->dispatch_table);
7423 Py_VISIT(st->extension_registry);
7424 Py_VISIT(st->extension_cache);
7425 Py_VISIT(st->inverted_registry);
7426 Py_VISIT(st->name_mapping_2to3);
7427 Py_VISIT(st->import_mapping_2to3);
7428 Py_VISIT(st->name_mapping_3to2);
7429 Py_VISIT(st->import_mapping_3to2);
7430 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007431 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007432 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007433}
7434
7435static struct PyModuleDef _picklemodule = {
7436 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007437 "_pickle", /* m_name */
7438 pickle_module_doc, /* m_doc */
7439 sizeof(PickleState), /* m_size */
7440 pickle_methods, /* m_methods */
7441 NULL, /* m_reload */
7442 pickle_traverse, /* m_traverse */
7443 pickle_clear, /* m_clear */
7444 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007445};
7446
7447PyMODINIT_FUNC
7448PyInit__pickle(void)
7449{
7450 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007451 PickleState *st;
7452
7453 m = PyState_FindModule(&_picklemodule);
7454 if (m) {
7455 Py_INCREF(m);
7456 return m;
7457 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007458
7459 if (PyType_Ready(&Unpickler_Type) < 0)
7460 return NULL;
7461 if (PyType_Ready(&Pickler_Type) < 0)
7462 return NULL;
7463 if (PyType_Ready(&Pdata_Type) < 0)
7464 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007465 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7466 return NULL;
7467 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7468 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007469
7470 /* Create the module and add the functions. */
7471 m = PyModule_Create(&_picklemodule);
7472 if (m == NULL)
7473 return NULL;
7474
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007475 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007476 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7477 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007478 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007479 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7480 return NULL;
7481
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007482 st = _Pickle_GetState(m);
7483
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007484 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007485 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7486 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007487 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007488 st->PicklingError = \
7489 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7490 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007491 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007492 st->UnpicklingError = \
7493 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7494 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007495 return NULL;
7496
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007497 Py_INCREF(st->PickleError);
7498 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007499 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007500 Py_INCREF(st->PicklingError);
7501 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007502 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007503 Py_INCREF(st->UnpicklingError);
7504 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007505 return NULL;
7506
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007507 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007508 return NULL;
7509
7510 return m;
7511}