blob: 3c21b6aac415db845201182dd9f5903eae1433a9 [file] [log] [blame]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001#include "Python.h"
2#include "structmember.h"
3
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004PyDoc_STRVAR(pickle_module_doc,
5"Optimized C implementation for the Python pickle module.");
6
Larry Hastings61272b72014-01-07 12:41:53 -08007/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08008module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -08009class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
10class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
11class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
12class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080013[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030014/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080015
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000016/* Bump this when new opcodes are added to the pickle protocol. */
17enum {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010018 HIGHEST_PROTOCOL = 4,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000019 DEFAULT_PROTOCOL = 3
20};
21
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000022/* Pickle opcodes. These must be kept updated with pickle.py.
23 Extensive docs are in pickletools.py. */
24enum opcode {
25 MARK = '(',
26 STOP = '.',
27 POP = '0',
28 POP_MARK = '1',
29 DUP = '2',
30 FLOAT = 'F',
31 INT = 'I',
32 BININT = 'J',
33 BININT1 = 'K',
34 LONG = 'L',
35 BININT2 = 'M',
36 NONE = 'N',
37 PERSID = 'P',
38 BINPERSID = 'Q',
39 REDUCE = 'R',
40 STRING = 'S',
41 BINSTRING = 'T',
42 SHORT_BINSTRING = 'U',
43 UNICODE = 'V',
44 BINUNICODE = 'X',
45 APPEND = 'a',
46 BUILD = 'b',
47 GLOBAL = 'c',
48 DICT = 'd',
49 EMPTY_DICT = '}',
50 APPENDS = 'e',
51 GET = 'g',
52 BINGET = 'h',
53 INST = 'i',
54 LONG_BINGET = 'j',
55 LIST = 'l',
56 EMPTY_LIST = ']',
57 OBJ = 'o',
58 PUT = 'p',
59 BINPUT = 'q',
60 LONG_BINPUT = 'r',
61 SETITEM = 's',
62 TUPLE = 't',
63 EMPTY_TUPLE = ')',
64 SETITEMS = 'u',
65 BINFLOAT = 'G',
66
67 /* Protocol 2. */
68 PROTO = '\x80',
69 NEWOBJ = '\x81',
70 EXT1 = '\x82',
71 EXT2 = '\x83',
72 EXT4 = '\x84',
73 TUPLE1 = '\x85',
74 TUPLE2 = '\x86',
75 TUPLE3 = '\x87',
76 NEWTRUE = '\x88',
77 NEWFALSE = '\x89',
78 LONG1 = '\x8a',
79 LONG4 = '\x8b',
80
81 /* Protocol 3 (Python 3.x) */
82 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010083 SHORT_BINBYTES = 'C',
84
85 /* Protocol 4 */
86 SHORT_BINUNICODE = '\x8c',
87 BINUNICODE8 = '\x8d',
88 BINBYTES8 = '\x8e',
89 EMPTY_SET = '\x8f',
90 ADDITEMS = '\x90',
91 FROZENSET = '\x91',
92 NEWOBJ_EX = '\x92',
93 STACK_GLOBAL = '\x93',
94 MEMOIZE = '\x94',
95 FRAME = '\x95'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000096};
97
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000098enum {
99 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
100 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
101 break if this gets out of synch with pickle.py, but it's unclear that would
102 help anything either. */
103 BATCHSIZE = 1000,
104
105 /* Nesting limit until Pickler, when running in "fast mode", starts
106 checking for self-referential data-structures. */
107 FAST_NESTING_LIMIT = 50,
108
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000109 /* Initial size of the write buffer of Pickler. */
110 WRITE_BUF_SIZE = 4096,
111
Antoine Pitrou04248a82010-10-12 20:51:21 +0000112 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100113 PREFETCH = 8192 * 16,
114
115 FRAME_SIZE_TARGET = 64 * 1024,
116
117 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000118};
119
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800120/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000121
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800122/* State of the pickle module, per PEP 3121. */
123typedef struct {
124 /* Exception classes for pickle. */
125 PyObject *PickleError;
126 PyObject *PicklingError;
127 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800128
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800129 /* copyreg.dispatch_table, {type_object: pickling_function} */
130 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000131
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800132 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000133
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800134 /* copyreg._extension_registry, {(module_name, function_name): code} */
135 PyObject *extension_registry;
136 /* copyreg._extension_cache, {code: object} */
137 PyObject *extension_cache;
138 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
139 PyObject *inverted_registry;
140
141 /* Import mappings for compatibility with Python 2.x */
142
143 /* _compat_pickle.NAME_MAPPING,
144 {(oldmodule, oldname): (newmodule, newname)} */
145 PyObject *name_mapping_2to3;
146 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
147 PyObject *import_mapping_2to3;
148 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
149 PyObject *name_mapping_3to2;
150 PyObject *import_mapping_3to2;
151
152 /* codecs.encode, used for saving bytes in older protocols */
153 PyObject *codecs_encode;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300154 /* builtins.getattr, used for saving nested names with protocol < 4 */
155 PyObject *getattr;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800156} PickleState;
157
158/* Forward declaration of the _pickle module definition. */
159static struct PyModuleDef _picklemodule;
160
161/* Given a module object, get its per-module state. */
162static PickleState *
163_Pickle_GetState(PyObject *module)
164{
165 return (PickleState *)PyModule_GetState(module);
166}
167
168/* Find the module instance imported in the currently running sub-interpreter
169 and get its state. */
170static PickleState *
171_Pickle_GetGlobalState(void)
172{
173 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
174}
175
176/* Clear the given pickle module state. */
177static void
178_Pickle_ClearState(PickleState *st)
179{
180 Py_CLEAR(st->PickleError);
181 Py_CLEAR(st->PicklingError);
182 Py_CLEAR(st->UnpicklingError);
183 Py_CLEAR(st->dispatch_table);
184 Py_CLEAR(st->extension_registry);
185 Py_CLEAR(st->extension_cache);
186 Py_CLEAR(st->inverted_registry);
187 Py_CLEAR(st->name_mapping_2to3);
188 Py_CLEAR(st->import_mapping_2to3);
189 Py_CLEAR(st->name_mapping_3to2);
190 Py_CLEAR(st->import_mapping_3to2);
191 Py_CLEAR(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300192 Py_CLEAR(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800193}
194
195/* Initialize the given pickle module state. */
196static int
197_Pickle_InitState(PickleState *st)
198{
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300199 PyObject *builtins;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800200 PyObject *copyreg = NULL;
201 PyObject *compat_pickle = NULL;
202 PyObject *codecs = NULL;
203
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300204 builtins = PyEval_GetBuiltins();
205 if (builtins == NULL)
206 goto error;
207 st->getattr = PyDict_GetItemString(builtins, "getattr");
208 if (st->getattr == NULL)
209 goto error;
210 Py_INCREF(st->getattr);
211
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800212 copyreg = PyImport_ImportModule("copyreg");
213 if (!copyreg)
214 goto error;
215 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
216 if (!st->dispatch_table)
217 goto error;
218 if (!PyDict_CheckExact(st->dispatch_table)) {
219 PyErr_Format(PyExc_RuntimeError,
220 "copyreg.dispatch_table should be a dict, not %.200s",
221 Py_TYPE(st->dispatch_table)->tp_name);
222 goto error;
223 }
224 st->extension_registry = \
225 PyObject_GetAttrString(copyreg, "_extension_registry");
226 if (!st->extension_registry)
227 goto error;
228 if (!PyDict_CheckExact(st->extension_registry)) {
229 PyErr_Format(PyExc_RuntimeError,
230 "copyreg._extension_registry should be a dict, "
231 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
232 goto error;
233 }
234 st->inverted_registry = \
235 PyObject_GetAttrString(copyreg, "_inverted_registry");
236 if (!st->inverted_registry)
237 goto error;
238 if (!PyDict_CheckExact(st->inverted_registry)) {
239 PyErr_Format(PyExc_RuntimeError,
240 "copyreg._inverted_registry should be a dict, "
241 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
242 goto error;
243 }
244 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
245 if (!st->extension_cache)
246 goto error;
247 if (!PyDict_CheckExact(st->extension_cache)) {
248 PyErr_Format(PyExc_RuntimeError,
249 "copyreg._extension_cache should be a dict, "
250 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
251 goto error;
252 }
253 Py_CLEAR(copyreg);
254
255 /* Load the 2.x -> 3.x stdlib module mapping tables */
256 compat_pickle = PyImport_ImportModule("_compat_pickle");
257 if (!compat_pickle)
258 goto error;
259 st->name_mapping_2to3 = \
260 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
261 if (!st->name_mapping_2to3)
262 goto error;
263 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
264 PyErr_Format(PyExc_RuntimeError,
265 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
266 Py_TYPE(st->name_mapping_2to3)->tp_name);
267 goto error;
268 }
269 st->import_mapping_2to3 = \
270 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
271 if (!st->import_mapping_2to3)
272 goto error;
273 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
274 PyErr_Format(PyExc_RuntimeError,
275 "_compat_pickle.IMPORT_MAPPING should be a dict, "
276 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
277 goto error;
278 }
279 /* ... and the 3.x -> 2.x mapping tables */
280 st->name_mapping_3to2 = \
281 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
282 if (!st->name_mapping_3to2)
283 goto error;
284 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
285 PyErr_Format(PyExc_RuntimeError,
286 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
287 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
288 goto error;
289 }
290 st->import_mapping_3to2 = \
291 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
292 if (!st->import_mapping_3to2)
293 goto error;
294 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
295 PyErr_Format(PyExc_RuntimeError,
296 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
297 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
298 goto error;
299 }
300 Py_CLEAR(compat_pickle);
301
302 codecs = PyImport_ImportModule("codecs");
303 if (codecs == NULL)
304 goto error;
305 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
306 if (st->codecs_encode == NULL) {
307 goto error;
308 }
309 if (!PyCallable_Check(st->codecs_encode)) {
310 PyErr_Format(PyExc_RuntimeError,
311 "codecs.encode should be a callable, not %.200s",
312 Py_TYPE(st->codecs_encode)->tp_name);
313 goto error;
314 }
315 Py_CLEAR(codecs);
316
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800317 return 0;
318
319 error:
320 Py_CLEAR(copyreg);
321 Py_CLEAR(compat_pickle);
322 Py_CLEAR(codecs);
323 _Pickle_ClearState(st);
324 return -1;
325}
326
327/* Helper for calling a function with a single argument quickly.
328
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800329 This function steals the reference of the given argument. */
330static PyObject *
331_Pickle_FastCall(PyObject *func, PyObject *obj)
332{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800333 PyObject *result;
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800334 PyObject *arg_tuple = PyTuple_New(1);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800335
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800336 /* Note: this function used to reuse the argument tuple. This used to give
337 a slight performance boost with older pickle implementations where many
338 unbuffered reads occurred (thus needing many function calls).
339
340 However, this optimization was removed because it was too complicated
341 to get right. It abused the C API for tuples to mutate them which led
342 to subtle reference counting and concurrency bugs. Furthermore, the
343 introduction of protocol 4 and the prefetching optimization via peek()
344 significantly reduced the number of function calls we do. Thus, the
345 benefits became marginal at best. */
346
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800347 if (arg_tuple == NULL) {
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800348 Py_DECREF(obj);
349 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800350 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800351 PyTuple_SET_ITEM(arg_tuple, 0, obj);
352 result = PyObject_Call(func, arg_tuple, NULL);
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800353 Py_CLEAR(arg_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800354 return result;
355}
356
357/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000358
359static int
360stack_underflow(void)
361{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800362 PickleState *st = _Pickle_GetGlobalState();
363 PyErr_SetString(st->UnpicklingError, "unpickling stack underflow");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000364 return -1;
365}
366
367/* Internal data type used as the unpickling stack. */
368typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000369 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000370 PyObject **data;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000371 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000372} Pdata;
373
374static void
375Pdata_dealloc(Pdata *self)
376{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200377 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000378 while (--i >= 0) {
379 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000380 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000381 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000382 PyObject_Del(self);
383}
384
385static PyTypeObject Pdata_Type = {
386 PyVarObject_HEAD_INIT(NULL, 0)
387 "_pickle.Pdata", /*tp_name*/
388 sizeof(Pdata), /*tp_basicsize*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200389 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000390 (destructor)Pdata_dealloc, /*tp_dealloc*/
391};
392
393static PyObject *
394Pdata_New(void)
395{
396 Pdata *self;
397
398 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
399 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000400 Py_SIZE(self) = 0;
401 self->allocated = 8;
402 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000403 if (self->data)
404 return (PyObject *)self;
405 Py_DECREF(self);
406 return PyErr_NoMemory();
407}
408
409
410/* Retain only the initial clearto items. If clearto >= the current
411 * number of items, this is a (non-erroneous) NOP.
412 */
413static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200414Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000415{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200416 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000417
418 if (clearto < 0)
419 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000420 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000421 return 0;
422
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000423 while (--i >= clearto) {
424 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000425 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000426 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000427 return 0;
428}
429
430static int
431Pdata_grow(Pdata *self)
432{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000433 PyObject **data = self->data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200434 size_t allocated = (size_t)self->allocated;
435 size_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000436
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000437 new_allocated = (allocated >> 3) + 6;
438 /* check for integer overflow */
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200439 if (new_allocated > (size_t)PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000440 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000441 new_allocated += allocated;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500442 PyMem_RESIZE(data, PyObject *, new_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000443 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000444 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000445
446 self->data = data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200447 self->allocated = (Py_ssize_t)new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000448 return 0;
449
450 nomemory:
451 PyErr_NoMemory();
452 return -1;
453}
454
455/* D is a Pdata*. Pop the topmost element and store it into V, which
456 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
457 * is raised and V is set to NULL.
458 */
459static PyObject *
460Pdata_pop(Pdata *self)
461{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000462 if (Py_SIZE(self) == 0) {
Serhiy Storchakae9b30742015-11-23 15:17:43 +0200463 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800464 PyErr_SetString(st->UnpicklingError, "bad pickle data");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000465 return NULL;
466 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000467 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000468}
469#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
470
471static int
472Pdata_push(Pdata *self, PyObject *obj)
473{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000474 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000475 return -1;
476 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000477 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000478 return 0;
479}
480
481/* Push an object on stack, transferring its ownership to the stack. */
482#define PDATA_PUSH(D, O, ER) do { \
483 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
484
485/* Push an object on stack, adding a new reference to the object. */
486#define PDATA_APPEND(D, O, ER) do { \
487 Py_INCREF((O)); \
488 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
489
490static PyObject *
491Pdata_poptuple(Pdata *self, Py_ssize_t start)
492{
493 PyObject *tuple;
494 Py_ssize_t len, i, j;
495
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000496 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000497 tuple = PyTuple_New(len);
498 if (tuple == NULL)
499 return NULL;
500 for (i = start, j = 0; j < len; i++, j++)
501 PyTuple_SET_ITEM(tuple, j, self->data[i]);
502
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000503 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000504 return tuple;
505}
506
507static PyObject *
508Pdata_poplist(Pdata *self, Py_ssize_t start)
509{
510 PyObject *list;
511 Py_ssize_t len, i, j;
512
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000513 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000514 list = PyList_New(len);
515 if (list == NULL)
516 return NULL;
517 for (i = start, j = 0; j < len; i++, j++)
518 PyList_SET_ITEM(list, j, self->data[i]);
519
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000520 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000521 return list;
522}
523
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000524typedef struct {
525 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200526 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000527} PyMemoEntry;
528
529typedef struct {
530 Py_ssize_t mt_mask;
531 Py_ssize_t mt_used;
532 Py_ssize_t mt_allocated;
533 PyMemoEntry *mt_table;
534} PyMemoTable;
535
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000536typedef struct PicklerObject {
537 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000538 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000539 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000540 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000541 PyObject *pers_func; /* persistent_id() method, can be NULL */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100542 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000543
544 PyObject *write; /* write() method of the output stream. */
545 PyObject *output_buffer; /* Write into a local bytearray buffer before
546 flushing to the stream. */
547 Py_ssize_t output_len; /* Length of output_buffer. */
548 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000549 int proto; /* Pickle protocol number, >= 0 */
550 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100551 int framing; /* True when framing is enabled, proto >= 4 */
552 Py_ssize_t frame_start; /* Position in output_buffer where the
Martin Pantera90a4a92016-05-30 04:04:50 +0000553 current frame begins. -1 if there
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100554 is no frame currently open. */
555
556 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000557 int fast; /* Enable fast mode if set to a true value.
558 The fast mode disable the usage of memo,
559 therefore speeding the pickling process by
560 not generating superfluous PUT opcodes. It
561 should not be used if with self-referential
562 objects. */
563 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000564 int fix_imports; /* Indicate whether Pickler should fix
565 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000566 PyObject *fast_memo;
567} PicklerObject;
568
569typedef struct UnpicklerObject {
570 PyObject_HEAD
571 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000572
573 /* The unpickler memo is just an array of PyObject *s. Using a dict
574 is unnecessary, since the keys are contiguous ints. */
575 PyObject **memo;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100576 Py_ssize_t memo_size; /* Capacity of the memo array */
577 Py_ssize_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000578
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000579 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000580
581 Py_buffer buffer;
582 char *input_buffer;
583 char *input_line;
584 Py_ssize_t input_len;
585 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000586 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100587
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000588 PyObject *read; /* read() method of the input stream. */
589 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000590 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000591
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000592 char *encoding; /* Name of the encoding to be used for
593 decoding strings pickled using Python
594 2.x. The default value is "ASCII" */
595 char *errors; /* Name of errors handling scheme to used when
596 decoding strings. The default value is
597 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500598 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000599 objects. */
600 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
601 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000602 int proto; /* Protocol of the pickle loaded. */
603 int fix_imports; /* Indicate whether Unpickler should fix
604 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000605} UnpicklerObject;
606
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200607typedef struct {
608 PyObject_HEAD
609 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
610} PicklerMemoProxyObject;
611
612typedef struct {
613 PyObject_HEAD
614 UnpicklerObject *unpickler;
615} UnpicklerMemoProxyObject;
616
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000617/* Forward declarations */
618static int save(PicklerObject *, PyObject *, int);
619static int save_reduce(PicklerObject *, PyObject *, PyObject *);
620static PyTypeObject Pickler_Type;
621static PyTypeObject Unpickler_Type;
622
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200623#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000624
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000625/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300626 A custom hashtable mapping void* to Python ints. This is used by the pickler
627 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000628 a bunch of unnecessary object creation. This makes a huge performance
629 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000630
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000631#define MT_MINSIZE 8
632#define PERTURB_SHIFT 5
633
634
635static PyMemoTable *
636PyMemoTable_New(void)
637{
638 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
639 if (memo == NULL) {
640 PyErr_NoMemory();
641 return NULL;
642 }
643
644 memo->mt_used = 0;
645 memo->mt_allocated = MT_MINSIZE;
646 memo->mt_mask = MT_MINSIZE - 1;
647 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
648 if (memo->mt_table == NULL) {
649 PyMem_FREE(memo);
650 PyErr_NoMemory();
651 return NULL;
652 }
653 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
654
655 return memo;
656}
657
658static PyMemoTable *
659PyMemoTable_Copy(PyMemoTable *self)
660{
661 Py_ssize_t i;
662 PyMemoTable *new = PyMemoTable_New();
663 if (new == NULL)
664 return NULL;
665
666 new->mt_used = self->mt_used;
667 new->mt_allocated = self->mt_allocated;
668 new->mt_mask = self->mt_mask;
669 /* The table we get from _New() is probably smaller than we wanted.
670 Free it and allocate one that's the right size. */
671 PyMem_FREE(new->mt_table);
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500672 new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000673 if (new->mt_table == NULL) {
674 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200675 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000676 return NULL;
677 }
678 for (i = 0; i < self->mt_allocated; i++) {
679 Py_XINCREF(self->mt_table[i].me_key);
680 }
681 memcpy(new->mt_table, self->mt_table,
682 sizeof(PyMemoEntry) * self->mt_allocated);
683
684 return new;
685}
686
687static Py_ssize_t
688PyMemoTable_Size(PyMemoTable *self)
689{
690 return self->mt_used;
691}
692
693static int
694PyMemoTable_Clear(PyMemoTable *self)
695{
696 Py_ssize_t i = self->mt_allocated;
697
698 while (--i >= 0) {
699 Py_XDECREF(self->mt_table[i].me_key);
700 }
701 self->mt_used = 0;
702 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
703 return 0;
704}
705
706static void
707PyMemoTable_Del(PyMemoTable *self)
708{
709 if (self == NULL)
710 return;
711 PyMemoTable_Clear(self);
712
713 PyMem_FREE(self->mt_table);
714 PyMem_FREE(self);
715}
716
717/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
718 can be considerably simpler than dictobject.c's lookdict(). */
719static PyMemoEntry *
720_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
721{
722 size_t i;
723 size_t perturb;
724 size_t mask = (size_t)self->mt_mask;
725 PyMemoEntry *table = self->mt_table;
726 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000727 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000728
729 i = hash & mask;
730 entry = &table[i];
731 if (entry->me_key == NULL || entry->me_key == key)
732 return entry;
733
734 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
735 i = (i << 2) + i + perturb + 1;
736 entry = &table[i & mask];
737 if (entry->me_key == NULL || entry->me_key == key)
738 return entry;
739 }
740 assert(0); /* Never reached */
741 return NULL;
742}
743
744/* Returns -1 on failure, 0 on success. */
745static int
746_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
747{
748 PyMemoEntry *oldtable = NULL;
749 PyMemoEntry *oldentry, *newentry;
750 Py_ssize_t new_size = MT_MINSIZE;
751 Py_ssize_t to_process;
752
753 assert(min_size > 0);
754
755 /* Find the smallest valid table size >= min_size. */
756 while (new_size < min_size && new_size > 0)
757 new_size <<= 1;
758 if (new_size <= 0) {
759 PyErr_NoMemory();
760 return -1;
761 }
762 /* new_size needs to be a power of two. */
763 assert((new_size & (new_size - 1)) == 0);
764
765 /* Allocate new table. */
766 oldtable = self->mt_table;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500767 self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000768 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200769 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000770 PyErr_NoMemory();
771 return -1;
772 }
773 self->mt_allocated = new_size;
774 self->mt_mask = new_size - 1;
775 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
776
777 /* Copy entries from the old table. */
778 to_process = self->mt_used;
779 for (oldentry = oldtable; to_process > 0; oldentry++) {
780 if (oldentry->me_key != NULL) {
781 to_process--;
782 /* newentry is a pointer to a chunk of the new
783 mt_table, so we're setting the key:value pair
784 in-place. */
785 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
786 newentry->me_key = oldentry->me_key;
787 newentry->me_value = oldentry->me_value;
788 }
789 }
790
791 /* Deallocate the old table. */
792 PyMem_FREE(oldtable);
793 return 0;
794}
795
796/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200797static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000798PyMemoTable_Get(PyMemoTable *self, PyObject *key)
799{
800 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
801 if (entry->me_key == NULL)
802 return NULL;
803 return &entry->me_value;
804}
805
806/* Returns -1 on failure, 0 on success. */
807static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200808PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000809{
810 PyMemoEntry *entry;
811
812 assert(key != NULL);
813
814 entry = _PyMemoTable_Lookup(self, key);
815 if (entry->me_key != NULL) {
816 entry->me_value = value;
817 return 0;
818 }
819 Py_INCREF(key);
820 entry->me_key = key;
821 entry->me_value = value;
822 self->mt_used++;
823
824 /* If we added a key, we can safely resize. Otherwise just return!
825 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
826 *
827 * Quadrupling the size improves average table sparseness
828 * (reducing collisions) at the cost of some memory. It also halves
829 * the number of expensive resize operations in a growing memo table.
830 *
831 * Very large memo tables (over 50K items) use doubling instead.
832 * This may help applications with severe memory constraints.
833 */
834 if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
835 return 0;
836 return _PyMemoTable_ResizeTable(self,
837 (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
838}
839
840#undef MT_MINSIZE
841#undef PERTURB_SHIFT
842
843/*************************************************************************/
844
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000845
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000846static int
847_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000848{
Serhiy Storchaka48842712016-04-06 09:45:48 +0300849 Py_XSETREF(self->output_buffer,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +0200850 PyBytes_FromStringAndSize(NULL, self->max_output_len));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000851 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000852 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000853 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100854 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000855 return 0;
856}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000857
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100858static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100859_write_size64(char *out, size_t value)
860{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200861 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800862
863 assert(sizeof(size_t) <= 8);
864
865 for (i = 0; i < sizeof(size_t); i++) {
866 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
867 }
868 for (i = sizeof(size_t); i < 8; i++) {
869 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800870 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100871}
872
873static void
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100874_Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
875{
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100876 qdata[0] = FRAME;
877 _write_size64(qdata + 1, frame_len);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100878}
879
880static int
881_Pickler_CommitFrame(PicklerObject *self)
882{
883 size_t frame_len;
884 char *qdata;
885
886 if (!self->framing || self->frame_start == -1)
887 return 0;
888 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
889 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
890 _Pickler_WriteFrameHeader(self, qdata, frame_len);
891 self->frame_start = -1;
892 return 0;
893}
894
895static int
896_Pickler_OpcodeBoundary(PicklerObject *self)
897{
898 Py_ssize_t frame_len;
899
900 if (!self->framing || self->frame_start == -1)
901 return 0;
902 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
903 if (frame_len >= FRAME_SIZE_TARGET)
904 return _Pickler_CommitFrame(self);
905 else
906 return 0;
907}
908
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000909static PyObject *
910_Pickler_GetString(PicklerObject *self)
911{
912 PyObject *output_buffer = self->output_buffer;
913
914 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100915
916 if (_Pickler_CommitFrame(self))
917 return NULL;
918
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000919 self->output_buffer = NULL;
920 /* Resize down to exact size */
921 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
922 return NULL;
923 return output_buffer;
924}
925
926static int
927_Pickler_FlushToFile(PicklerObject *self)
928{
929 PyObject *output, *result;
930
931 assert(self->write != NULL);
932
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100933 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000934 output = _Pickler_GetString(self);
935 if (output == NULL)
936 return -1;
937
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -0800938 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000939 Py_XDECREF(result);
940 return (result == NULL) ? -1 : 0;
941}
942
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200943static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100944_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000945{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100946 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000947 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100948 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000949
950 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100951 need_new_frame = (self->framing && self->frame_start == -1);
952
953 if (need_new_frame)
954 n = data_len + FRAME_HEADER_SIZE;
955 else
956 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000957
958 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100959 if (required > self->max_output_len) {
960 /* Make place in buffer for the pickle chunk */
961 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
962 PyErr_NoMemory();
963 return -1;
964 }
965 self->max_output_len = (self->output_len + n) / 2 * 3;
966 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
967 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000968 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000969 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100970 if (need_new_frame) {
971 /* Setup new frame */
972 Py_ssize_t frame_start = self->output_len;
973 self->frame_start = frame_start;
974 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
975 /* Write an invalid value, for debugging */
976 buffer[frame_start + i] = 0xFE;
977 }
978 self->output_len += FRAME_HEADER_SIZE;
979 }
980 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000981 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100982 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000983 buffer[self->output_len + i] = s[i];
984 }
985 }
986 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100987 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000988 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100989 self->output_len += data_len;
990 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000991}
992
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000993static PicklerObject *
994_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000995{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000996 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000997
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000998 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
999 if (self == NULL)
1000 return NULL;
1001
1002 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01001003 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001004 self->write = NULL;
1005 self->proto = 0;
1006 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001007 self->framing = 0;
1008 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001009 self->fast = 0;
1010 self->fast_nesting = 0;
1011 self->fix_imports = 0;
1012 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001013 self->max_output_len = WRITE_BUF_SIZE;
1014 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001015
1016 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001017 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1018 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001019
1020 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001021 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001022 return NULL;
1023 }
1024 return self;
1025}
1026
1027static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001028_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001029{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001030 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001031
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001032 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001033 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001034 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001035 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001036 proto = PyLong_AsLong(protocol);
1037 if (proto < 0) {
1038 if (proto == -1 && PyErr_Occurred())
1039 return -1;
1040 proto = HIGHEST_PROTOCOL;
1041 }
1042 else if (proto > HIGHEST_PROTOCOL) {
1043 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1044 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001045 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001046 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001047 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001048 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001049 self->bin = proto > 0;
1050 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001051 return 0;
1052}
1053
1054/* Returns -1 (with an exception set) on failure, 0 on success. This may
1055 be called once on a freshly created Pickler. */
1056static int
1057_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1058{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001059 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001060 assert(file != NULL);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001061 self->write = _PyObject_GetAttrId(file, &PyId_write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001062 if (self->write == NULL) {
1063 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1064 PyErr_SetString(PyExc_TypeError,
1065 "file must have a 'write' attribute");
1066 return -1;
1067 }
1068
1069 return 0;
1070}
1071
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001072/* Returns the size of the input on success, -1 on failure. This takes its
1073 own reference to `input`. */
1074static Py_ssize_t
1075_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1076{
1077 if (self->buffer.buf != NULL)
1078 PyBuffer_Release(&self->buffer);
1079 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1080 return -1;
1081 self->input_buffer = self->buffer.buf;
1082 self->input_len = self->buffer.len;
1083 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001084 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001085 return self->input_len;
1086}
1087
Antoine Pitrou04248a82010-10-12 20:51:21 +00001088static int
1089_Unpickler_SkipConsumed(UnpicklerObject *self)
1090{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001091 Py_ssize_t consumed;
1092 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001093
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001094 consumed = self->next_read_idx - self->prefetched_idx;
1095 if (consumed <= 0)
1096 return 0;
1097
1098 assert(self->peek); /* otherwise we did something wrong */
Martin Panter6245cb32016-04-15 02:14:19 +00001099 /* This makes a useless copy... */
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001100 r = PyObject_CallFunction(self->read, "n", consumed);
1101 if (r == NULL)
1102 return -1;
1103 Py_DECREF(r);
1104
1105 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001106 return 0;
1107}
1108
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001109static const Py_ssize_t READ_WHOLE_LINE = -1;
1110
1111/* If reading from a file, we need to only pull the bytes we need, since there
1112 may be multiple pickle objects arranged contiguously in the same input
1113 buffer.
1114
1115 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1116 bytes from the input stream/buffer.
1117
1118 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1119 failure; on success, returns the number of bytes read from the file.
1120
1121 On success, self->input_len will be 0; this is intentional so that when
1122 unpickling from a file, the "we've run out of data" code paths will trigger,
1123 causing the Unpickler to go back to the file for more data. Use the returned
1124 size to tell you how much data you can process. */
1125static Py_ssize_t
1126_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1127{
1128 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001129 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001130
1131 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001132
Antoine Pitrou04248a82010-10-12 20:51:21 +00001133 if (_Unpickler_SkipConsumed(self) < 0)
1134 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001135
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001136 if (n == READ_WHOLE_LINE) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08001137 PyObject *empty_tuple = PyTuple_New(0);
1138 data = PyObject_Call(self->readline, empty_tuple, NULL);
1139 Py_DECREF(empty_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001140 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001141 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001142 PyObject *len;
1143 /* Prefetch some data without advancing the file pointer, if possible */
1144 if (self->peek && n < PREFETCH) {
1145 len = PyLong_FromSsize_t(PREFETCH);
1146 if (len == NULL)
1147 return -1;
1148 data = _Pickle_FastCall(self->peek, len);
1149 if (data == NULL) {
1150 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1151 return -1;
1152 /* peek() is probably not supported by the given file object */
1153 PyErr_Clear();
1154 Py_CLEAR(self->peek);
1155 }
1156 else {
1157 read_size = _Unpickler_SetStringInput(self, data);
1158 Py_DECREF(data);
1159 self->prefetched_idx = 0;
1160 if (n <= read_size)
1161 return n;
1162 }
1163 }
1164 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001165 if (len == NULL)
1166 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001167 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001168 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001169 if (data == NULL)
1170 return -1;
1171
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001172 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001173 Py_DECREF(data);
1174 return read_size;
1175}
1176
1177/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1178
1179 This should be used for all data reads, rather than accessing the unpickler's
1180 input buffer directly. This method deals correctly with reading from input
1181 streams, which the input buffer doesn't deal with.
1182
1183 Note that when reading from a file-like object, self->next_read_idx won't
1184 be updated (it should remain at 0 for the entire unpickling process). You
1185 should use this function's return value to know how many bytes you can
1186 consume.
1187
1188 Returns -1 (with an exception set) on failure. On success, return the
1189 number of chars read. */
1190static Py_ssize_t
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001191_Unpickler_Read(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001192{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001193 Py_ssize_t num_read;
1194
Benjamin Peterson6aa15642015-09-27 01:16:03 -07001195 *s = NULL;
Benjamin Petersone48cf7e2015-09-26 00:08:34 -07001196 if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1197 PickleState *st = _Pickle_GetGlobalState();
1198 PyErr_SetString(st->UnpicklingError,
1199 "read would overflow (invalid bytecode)");
1200 return -1;
1201 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001202 if (self->next_read_idx + n <= self->input_len) {
1203 *s = self->input_buffer + self->next_read_idx;
1204 self->next_read_idx += n;
1205 return n;
1206 }
1207 if (!self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001208 PyErr_Format(PyExc_EOFError, "Ran out of input");
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001209 return -1;
1210 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001211 num_read = _Unpickler_ReadFromFile(self, n);
1212 if (num_read < 0)
1213 return -1;
1214 if (num_read < n) {
1215 PyErr_Format(PyExc_EOFError, "Ran out of input");
1216 return -1;
1217 }
1218 *s = self->input_buffer;
1219 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001220 return n;
1221}
1222
1223static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001224_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1225 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001226{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001227 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001228 if (input_line == NULL) {
1229 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001230 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001231 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001232
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001233 memcpy(input_line, line, len);
1234 input_line[len] = '\0';
1235 self->input_line = input_line;
1236 *result = self->input_line;
1237 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001238}
1239
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001240/* Read a line from the input stream/buffer. If we run off the end of the input
1241 before hitting \n, return the data we found.
1242
1243 Returns the number of chars read, or -1 on failure. */
1244static Py_ssize_t
1245_Unpickler_Readline(UnpicklerObject *self, char **result)
1246{
1247 Py_ssize_t i, num_read;
1248
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001249 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001250 if (self->input_buffer[i] == '\n') {
1251 char *line_start = self->input_buffer + self->next_read_idx;
1252 num_read = i - self->next_read_idx + 1;
1253 self->next_read_idx = i + 1;
1254 return _Unpickler_CopyLine(self, line_start, num_read, result);
1255 }
1256 }
1257 if (self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001258 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1259 if (num_read < 0)
1260 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001261 self->next_read_idx = num_read;
Antoine Pitrouf6c7a852011-08-11 21:04:02 +02001262 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001263 }
Victor Stinner121aab42011-09-29 23:40:53 +02001264
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001265 /* If we get here, we've run off the end of the input string. Return the
1266 remaining string and let the caller figure it out. */
1267 *result = self->input_buffer + self->next_read_idx;
1268 num_read = i - self->next_read_idx;
1269 self->next_read_idx = i;
1270 return num_read;
1271}
1272
1273/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1274 will be modified in place. */
1275static int
1276_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1277{
1278 Py_ssize_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001279
1280 assert(new_size > self->memo_size);
1281
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001282 PyMem_RESIZE(self->memo, PyObject *, new_size);
1283 if (self->memo == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001284 PyErr_NoMemory();
1285 return -1;
1286 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001287 for (i = self->memo_size; i < new_size; i++)
1288 self->memo[i] = NULL;
1289 self->memo_size = new_size;
1290 return 0;
1291}
1292
1293/* Returns NULL if idx is out of bounds. */
1294static PyObject *
1295_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1296{
1297 if (idx < 0 || idx >= self->memo_size)
1298 return NULL;
1299
1300 return self->memo[idx];
1301}
1302
1303/* Returns -1 (with an exception set) on failure, 0 on success.
1304 This takes its own reference to `value`. */
1305static int
1306_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1307{
1308 PyObject *old_item;
1309
1310 if (idx >= self->memo_size) {
1311 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1312 return -1;
1313 assert(idx < self->memo_size);
1314 }
1315 Py_INCREF(value);
1316 old_item = self->memo[idx];
1317 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001318 if (old_item != NULL) {
1319 Py_DECREF(old_item);
1320 }
1321 else {
1322 self->memo_len++;
1323 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001324 return 0;
1325}
1326
1327static PyObject **
1328_Unpickler_NewMemo(Py_ssize_t new_size)
1329{
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001330 PyObject **memo = PyMem_NEW(PyObject *, new_size);
Victor Stinner42024562013-07-12 00:53:57 +02001331 if (memo == NULL) {
1332 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001333 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001334 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001335 memset(memo, 0, new_size * sizeof(PyObject *));
1336 return memo;
1337}
1338
1339/* Free the unpickler's memo, taking care to decref any items left in it. */
1340static void
1341_Unpickler_MemoCleanup(UnpicklerObject *self)
1342{
1343 Py_ssize_t i;
1344 PyObject **memo = self->memo;
1345
1346 if (self->memo == NULL)
1347 return;
1348 self->memo = NULL;
1349 i = self->memo_size;
1350 while (--i >= 0) {
1351 Py_XDECREF(memo[i]);
1352 }
1353 PyMem_FREE(memo);
1354}
1355
1356static UnpicklerObject *
1357_Unpickler_New(void)
1358{
1359 UnpicklerObject *self;
1360
1361 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1362 if (self == NULL)
1363 return NULL;
1364
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001365 self->pers_func = NULL;
1366 self->input_buffer = NULL;
1367 self->input_line = NULL;
1368 self->input_len = 0;
1369 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001370 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001371 self->read = NULL;
1372 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001373 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001374 self->encoding = NULL;
1375 self->errors = NULL;
1376 self->marks = NULL;
1377 self->num_marks = 0;
1378 self->marks_size = 0;
1379 self->proto = 0;
1380 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001381 memset(&self->buffer, 0, sizeof(Py_buffer));
1382 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001383 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001384 self->memo = _Unpickler_NewMemo(self->memo_size);
1385 self->stack = (Pdata *)Pdata_New();
1386
1387 if (self->memo == NULL || self->stack == NULL) {
1388 Py_DECREF(self);
1389 return NULL;
1390 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001391
1392 return self;
1393}
1394
1395/* Returns -1 (with an exception set) on failure, 0 on success. This may
1396 be called once on a freshly created Pickler. */
1397static int
1398_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1399{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001400 _Py_IDENTIFIER(peek);
1401 _Py_IDENTIFIER(read);
1402 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001403
1404 self->peek = _PyObject_GetAttrId(file, &PyId_peek);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001405 if (self->peek == NULL) {
1406 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1407 PyErr_Clear();
1408 else
1409 return -1;
1410 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001411 self->read = _PyObject_GetAttrId(file, &PyId_read);
1412 self->readline = _PyObject_GetAttrId(file, &PyId_readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001413 if (self->readline == NULL || self->read == NULL) {
1414 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1415 PyErr_SetString(PyExc_TypeError,
1416 "file must have 'read' and 'readline' attributes");
1417 Py_CLEAR(self->read);
1418 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001419 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001420 return -1;
1421 }
1422 return 0;
1423}
1424
1425/* Returns -1 (with an exception set) on failure, 0 on success. This may
1426 be called once on a freshly created Pickler. */
1427static int
1428_Unpickler_SetInputEncoding(UnpicklerObject *self,
1429 const char *encoding,
1430 const char *errors)
1431{
1432 if (encoding == NULL)
1433 encoding = "ASCII";
1434 if (errors == NULL)
1435 errors = "strict";
1436
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001437 self->encoding = _PyMem_Strdup(encoding);
1438 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001439 if (self->encoding == NULL || self->errors == NULL) {
1440 PyErr_NoMemory();
1441 return -1;
1442 }
1443 return 0;
1444}
1445
1446/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001447static int
1448memo_get(PicklerObject *self, PyObject *key)
1449{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001450 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001451 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001452 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001453
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001454 value = PyMemoTable_Get(self->memo, key);
1455 if (value == NULL) {
1456 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001457 return -1;
1458 }
1459
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001460 if (!self->bin) {
1461 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001462 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1463 "%" PY_FORMAT_SIZE_T "d\n", *value);
1464 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001465 }
1466 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001467 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001468 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001469 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001470 len = 2;
1471 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001472 else if ((size_t)*value <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001473 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001474 pdata[1] = (unsigned char)(*value & 0xff);
1475 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1476 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1477 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001478 len = 5;
1479 }
1480 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001481 PickleState *st = _Pickle_GetGlobalState();
1482 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001483 "memo id too large for LONG_BINGET");
1484 return -1;
1485 }
1486 }
1487
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001488 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001489 return -1;
1490
1491 return 0;
1492}
1493
1494/* Store an object in the memo, assign it a new unique ID based on the number
1495 of objects currently stored in the memo and generate a PUT opcode. */
1496static int
1497memo_put(PicklerObject *self, PyObject *obj)
1498{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001499 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001500 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001501 Py_ssize_t idx;
1502
1503 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001504
1505 if (self->fast)
1506 return 0;
1507
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001508 idx = PyMemoTable_Size(self->memo);
1509 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1510 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001511
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001512 if (self->proto >= 4) {
1513 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1514 return -1;
1515 return 0;
1516 }
1517 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001518 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001519 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001520 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001521 len = strlen(pdata);
1522 }
1523 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001524 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001525 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001526 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001527 len = 2;
1528 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001529 else if ((size_t)idx <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001530 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001531 pdata[1] = (unsigned char)(idx & 0xff);
1532 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1533 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1534 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001535 len = 5;
1536 }
1537 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001538 PickleState *st = _Pickle_GetGlobalState();
1539 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001540 "memo id too large for LONG_BINPUT");
1541 return -1;
1542 }
1543 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001544 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001545 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001546
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001547 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001548}
1549
1550static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001551get_dotted_path(PyObject *obj, PyObject *name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001552 _Py_static_string(PyId_dot, ".");
1553 _Py_static_string(PyId_locals, "<locals>");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001554 PyObject *dotted_path;
1555 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001556
1557 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001558 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001559 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001560 n = PyList_GET_SIZE(dotted_path);
1561 assert(n >= 1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001562 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001563 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001564 PyObject *result = PyUnicode_RichCompare(
1565 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1566 int is_equal = (result == Py_True);
1567 assert(PyBool_Check(result));
1568 Py_DECREF(result);
1569 if (is_equal) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001570 if (obj == NULL)
1571 PyErr_Format(PyExc_AttributeError,
1572 "Can't pickle local object %R", name);
1573 else
1574 PyErr_Format(PyExc_AttributeError,
1575 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001576 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001577 return NULL;
1578 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001579 }
1580 return dotted_path;
1581}
1582
1583static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001584get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001585{
1586 Py_ssize_t i, n;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001587 PyObject *parent = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001588
1589 assert(PyList_CheckExact(names));
1590 Py_INCREF(obj);
1591 n = PyList_GET_SIZE(names);
1592 for (i = 0; i < n; i++) {
1593 PyObject *name = PyList_GET_ITEM(names, i);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001594 Py_XDECREF(parent);
1595 parent = obj;
1596 obj = PyObject_GetAttr(parent, name);
1597 if (obj == NULL) {
1598 Py_DECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001599 return NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001600 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001601 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001602 if (pparent != NULL)
1603 *pparent = parent;
1604 else
1605 Py_XDECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001606 return obj;
1607}
1608
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001609static void
1610reformat_attribute_error(PyObject *obj, PyObject *name)
1611{
1612 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1613 PyErr_Clear();
1614 PyErr_Format(PyExc_AttributeError,
1615 "Can't get attribute %R on %R", name, obj);
1616 }
1617}
1618
1619
1620static PyObject *
1621getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1622{
1623 PyObject *dotted_path, *attr;
1624
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001625 if (allow_qualname) {
1626 dotted_path = get_dotted_path(obj, name);
1627 if (dotted_path == NULL)
1628 return NULL;
1629 attr = get_deep_attribute(obj, dotted_path, NULL);
1630 Py_DECREF(dotted_path);
1631 }
1632 else
1633 attr = PyObject_GetAttr(obj, name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001634 if (attr == NULL)
1635 reformat_attribute_error(obj, name);
1636 return attr;
1637}
1638
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001639static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001640whichmodule(PyObject *global, PyObject *dotted_path)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001641{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001642 PyObject *module_name;
1643 PyObject *modules_dict;
1644 PyObject *module;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001645 Py_ssize_t i;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001646 _Py_IDENTIFIER(__module__);
1647 _Py_IDENTIFIER(modules);
1648 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001649
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001650 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1651
1652 if (module_name == NULL) {
1653 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001654 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001655 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001656 }
1657 else {
1658 /* In some rare cases (e.g., bound methods of extension types),
1659 __module__ can be None. If it is so, then search sys.modules for
1660 the module of global. */
1661 if (module_name != Py_None)
1662 return module_name;
1663 Py_CLEAR(module_name);
1664 }
1665 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001666
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001667 /* Fallback on walking sys.modules */
Victor Stinnerbb520202013-11-06 22:40:41 +01001668 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001669 if (modules_dict == NULL) {
1670 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001671 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001672 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001673
1674 i = 0;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001675 while (PyDict_Next(modules_dict, &i, &module_name, &module)) {
1676 PyObject *candidate;
1677 if (PyUnicode_Check(module_name) &&
1678 !PyUnicode_CompareWithASCIIString(module_name, "__main__"))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001679 continue;
1680 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001681 continue;
1682
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001683 candidate = get_deep_attribute(module, dotted_path, NULL);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001684 if (candidate == NULL) {
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001685 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001686 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001687 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001688 continue;
1689 }
1690
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001691 if (candidate == global) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001692 Py_INCREF(module_name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001693 Py_DECREF(candidate);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001694 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001695 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001696 Py_DECREF(candidate);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001697 }
1698
1699 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001700 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001701 Py_INCREF(module_name);
1702 return module_name;
1703}
1704
1705/* fast_save_enter() and fast_save_leave() are guards against recursive
1706 objects when Pickler is used with the "fast mode" (i.e., with object
1707 memoization disabled). If the nesting of a list or dict object exceed
1708 FAST_NESTING_LIMIT, these guards will start keeping an internal
1709 reference to the seen list or dict objects and check whether these objects
1710 are recursive. These are not strictly necessary, since save() has a
1711 hard-coded recursion limit, but they give a nicer error message than the
1712 typical RuntimeError. */
1713static int
1714fast_save_enter(PicklerObject *self, PyObject *obj)
1715{
1716 /* if fast_nesting < 0, we're doing an error exit. */
1717 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1718 PyObject *key = NULL;
1719 if (self->fast_memo == NULL) {
1720 self->fast_memo = PyDict_New();
1721 if (self->fast_memo == NULL) {
1722 self->fast_nesting = -1;
1723 return 0;
1724 }
1725 }
1726 key = PyLong_FromVoidPtr(obj);
1727 if (key == NULL)
1728 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001729 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001730 Py_DECREF(key);
1731 PyErr_Format(PyExc_ValueError,
1732 "fast mode: can't pickle cyclic objects "
1733 "including object type %.200s at %p",
1734 obj->ob_type->tp_name, obj);
1735 self->fast_nesting = -1;
1736 return 0;
1737 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001738 if (PyErr_Occurred()) {
1739 return 0;
1740 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001741 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1742 Py_DECREF(key);
1743 self->fast_nesting = -1;
1744 return 0;
1745 }
1746 Py_DECREF(key);
1747 }
1748 return 1;
1749}
1750
1751static int
1752fast_save_leave(PicklerObject *self, PyObject *obj)
1753{
1754 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1755 PyObject *key = PyLong_FromVoidPtr(obj);
1756 if (key == NULL)
1757 return 0;
1758 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1759 Py_DECREF(key);
1760 return 0;
1761 }
1762 Py_DECREF(key);
1763 }
1764 return 1;
1765}
1766
1767static int
1768save_none(PicklerObject *self, PyObject *obj)
1769{
1770 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001771 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001772 return -1;
1773
1774 return 0;
1775}
1776
1777static int
1778save_bool(PicklerObject *self, PyObject *obj)
1779{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001780 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001781 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001782 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001783 return -1;
1784 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001785 else {
1786 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1787 * so that unpicklers written before bools were introduced unpickle them
1788 * as ints, but unpicklers after can recognize that bools were intended.
1789 * Note that protocol 2 added direct ways to pickle bools.
1790 */
1791 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1792 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1793 return -1;
1794 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001795 return 0;
1796}
1797
1798static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001799save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001800{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001801 PyObject *repr = NULL;
1802 Py_ssize_t size;
1803 long val;
1804 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001805
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001806 const char long_op = LONG;
1807
1808 val= PyLong_AsLong(obj);
1809 if (val == -1 && PyErr_Occurred()) {
1810 /* out of range for int pickling */
1811 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001812 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001813 else if (self->bin &&
1814 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001815 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
Larry Hastings61272b72014-01-07 12:41:53 -08001816 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001817
1818 Note: we can't use -0x80000000L in the above condition because some
1819 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1820 before applying the unary minus when sizeof(long) <= 4. The
1821 resulting value stays unsigned which is commonly not what we want,
1822 so MSVC happily warns us about it. However, that result would have
1823 been fine because we guard for sizeof(long) <= 4 which turns the
1824 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001825 char pdata[32];
1826 Py_ssize_t len = 0;
1827
1828 pdata[1] = (unsigned char)(val & 0xff);
1829 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1830 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1831 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001832
1833 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1834 if (pdata[2] == 0) {
1835 pdata[0] = BININT1;
1836 len = 2;
1837 }
1838 else {
1839 pdata[0] = BININT2;
1840 len = 3;
1841 }
1842 }
1843 else {
1844 pdata[0] = BININT;
1845 len = 5;
1846 }
1847
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001848 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001849 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001850
1851 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001852 }
1853
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001854 if (self->proto >= 2) {
1855 /* Linear-time pickling. */
1856 size_t nbits;
1857 size_t nbytes;
1858 unsigned char *pdata;
1859 char header[5];
1860 int i;
1861 int sign = _PyLong_Sign(obj);
1862
1863 if (sign == 0) {
1864 header[0] = LONG1;
1865 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001866 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001867 goto error;
1868 return 0;
1869 }
1870 nbits = _PyLong_NumBits(obj);
1871 if (nbits == (size_t)-1 && PyErr_Occurred())
1872 goto error;
1873 /* How many bytes do we need? There are nbits >> 3 full
1874 * bytes of data, and nbits & 7 leftover bits. If there
1875 * are any leftover bits, then we clearly need another
1876 * byte. Wnat's not so obvious is that we *probably*
1877 * need another byte even if there aren't any leftovers:
1878 * the most-significant bit of the most-significant byte
1879 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001880 * opposite of the one we need. The exception is ints
1881 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001882 * its own 256's-complement, so has the right sign bit
1883 * even without the extra byte. That's a pain to check
1884 * for in advance, though, so we always grab an extra
1885 * byte at the start, and cut it back later if possible.
1886 */
1887 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001888 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001889 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001890 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001891 goto error;
1892 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001893 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001894 if (repr == NULL)
1895 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001896 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001897 i = _PyLong_AsByteArray((PyLongObject *)obj,
1898 pdata, nbytes,
1899 1 /* little endian */ , 1 /* signed */ );
1900 if (i < 0)
1901 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001902 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001903 * needed. This is so iff the MSB is all redundant sign
1904 * bits.
1905 */
1906 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001907 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001908 pdata[nbytes - 1] == 0xff &&
1909 (pdata[nbytes - 2] & 0x80) != 0) {
1910 nbytes--;
1911 }
1912
1913 if (nbytes < 256) {
1914 header[0] = LONG1;
1915 header[1] = (unsigned char)nbytes;
1916 size = 2;
1917 }
1918 else {
1919 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001920 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001921 for (i = 1; i < 5; i++) {
1922 header[i] = (unsigned char)(size & 0xff);
1923 size >>= 8;
1924 }
1925 size = 5;
1926 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001927 if (_Pickler_Write(self, header, size) < 0 ||
1928 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001929 goto error;
1930 }
1931 else {
1932 char *string;
1933
Mark Dickinson8dd05142009-01-20 20:43:58 +00001934 /* proto < 2: write the repr and newline. This is quadratic-time (in
1935 the number of digits), in both directions. We add a trailing 'L'
1936 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001937
1938 repr = PyObject_Repr(obj);
1939 if (repr == NULL)
1940 goto error;
1941
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001942 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001943 if (string == NULL)
1944 goto error;
1945
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001946 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1947 _Pickler_Write(self, string, size) < 0 ||
1948 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001949 goto error;
1950 }
1951
1952 if (0) {
1953 error:
1954 status = -1;
1955 }
1956 Py_XDECREF(repr);
1957
1958 return status;
1959}
1960
1961static int
1962save_float(PicklerObject *self, PyObject *obj)
1963{
1964 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1965
1966 if (self->bin) {
1967 char pdata[9];
1968 pdata[0] = BINFLOAT;
1969 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1970 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001971 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001973 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001974 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001975 int result = -1;
1976 char *buf = NULL;
1977 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001978
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001979 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001980 goto done;
1981
Serhiy Storchakac86ca262015-02-15 14:18:32 +02001982 buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001983 if (!buf) {
1984 PyErr_NoMemory();
1985 goto done;
1986 }
1987
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001988 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001989 goto done;
1990
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001991 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001992 goto done;
1993
1994 result = 0;
1995done:
1996 PyMem_Free(buf);
1997 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001998 }
1999
2000 return 0;
2001}
2002
2003static int
2004save_bytes(PicklerObject *self, PyObject *obj)
2005{
2006 if (self->proto < 3) {
2007 /* Older pickle protocols do not have an opcode for pickling bytes
2008 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002009 the __reduce__ method) to permit bytes object unpickling.
2010
2011 Here we use a hack to be compatible with Python 2. Since in Python
2012 2 'bytes' is just an alias for 'str' (which has different
2013 parameters than the actual bytes object), we use codecs.encode
2014 to create the appropriate 'str' object when unpickled using
2015 Python 2 *and* the appropriate 'bytes' object when unpickled
2016 using Python 3. Again this is a hack and we don't need to do this
2017 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002018 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002019 int status;
2020
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002021 if (PyBytes_GET_SIZE(obj) == 0) {
2022 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2023 }
2024 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002025 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002026 PyObject *unicode_str =
2027 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2028 PyBytes_GET_SIZE(obj),
2029 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002030 _Py_IDENTIFIER(latin1);
2031
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002032 if (unicode_str == NULL)
2033 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002034 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002035 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002036 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002037 Py_DECREF(unicode_str);
2038 }
2039
2040 if (reduce_value == NULL)
2041 return -1;
2042
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002043 /* save_reduce() will memoize the object automatically. */
2044 status = save_reduce(self, reduce_value, obj);
2045 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002046 return status;
2047 }
2048 else {
2049 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002050 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002051 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002052
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002053 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002054 if (size < 0)
2055 return -1;
2056
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002057 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002058 header[0] = SHORT_BINBYTES;
2059 header[1] = (unsigned char)size;
2060 len = 2;
2061 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03002062 else if ((size_t)size <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002063 header[0] = BINBYTES;
2064 header[1] = (unsigned char)(size & 0xff);
2065 header[2] = (unsigned char)((size >> 8) & 0xff);
2066 header[3] = (unsigned char)((size >> 16) & 0xff);
2067 header[4] = (unsigned char)((size >> 24) & 0xff);
2068 len = 5;
2069 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002070 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002071 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002072 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002073 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002074 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002075 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002076 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002077 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002078 return -1; /* string too large */
2079 }
2080
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002081 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002082 return -1;
2083
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002084 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002085 return -1;
2086
2087 if (memo_put(self, obj) < 0)
2088 return -1;
2089
2090 return 0;
2091 }
2092}
2093
2094/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2095 backslash and newline characters to \uXXXX escapes. */
2096static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002097raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002098{
Victor Stinner7270b7f2014-08-17 21:14:46 +02002099 PyObject *repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002100 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002101 Py_ssize_t i, size;
2102 size_t expandsize;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002103 void *data;
2104 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002105
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002106 if (PyUnicode_READY(obj))
2107 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002108
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002109 size = PyUnicode_GET_LENGTH(obj);
2110 data = PyUnicode_DATA(obj);
2111 kind = PyUnicode_KIND(obj);
2112 if (kind == PyUnicode_4BYTE_KIND)
2113 expandsize = 10;
2114 else
2115 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002116
Victor Stinner049e5092014-08-17 22:20:00 +02002117 if ((size_t)size > (size_t)PY_SSIZE_T_MAX / expandsize)
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002118 return PyErr_NoMemory();
Victor Stinner7270b7f2014-08-17 21:14:46 +02002119 repr = PyBytes_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002120 if (repr == NULL)
2121 return NULL;
2122 if (size == 0)
Victor Stinner7270b7f2014-08-17 21:14:46 +02002123 return repr;
2124 assert(Py_REFCNT(repr) == 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002125
Victor Stinner7270b7f2014-08-17 21:14:46 +02002126 p = PyBytes_AS_STRING(repr);
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002127 for (i=0; i < size; i++) {
2128 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002129 /* Map 32-bit characters to '\Uxxxxxxxx' */
2130 if (ch >= 0x10000) {
2131 *p++ = '\\';
2132 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002133 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2134 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2135 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2136 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2137 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2138 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2139 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2140 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002141 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002142 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002143 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002144 *p++ = '\\';
2145 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002146 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2147 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2148 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2149 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002150 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002151 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002152 else
2153 *p++ = (char) ch;
2154 }
Victor Stinner7270b7f2014-08-17 21:14:46 +02002155 size = p - PyBytes_AS_STRING(repr);
2156 if (_PyBytes_Resize(&repr, size) < 0)
2157 return NULL;
2158 return repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002159}
2160
2161static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002162write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2163{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002164 char header[9];
2165 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002166
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002167 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002168 if (size <= 0xff && self->proto >= 4) {
2169 header[0] = SHORT_BINUNICODE;
2170 header[1] = (unsigned char)(size & 0xff);
2171 len = 2;
2172 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002173 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002174 header[0] = BINUNICODE;
2175 header[1] = (unsigned char)(size & 0xff);
2176 header[2] = (unsigned char)((size >> 8) & 0xff);
2177 header[3] = (unsigned char)((size >> 16) & 0xff);
2178 header[4] = (unsigned char)((size >> 24) & 0xff);
2179 len = 5;
2180 }
2181 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002182 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002183 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002184 len = 9;
2185 }
2186 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002187 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002188 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002189 return -1;
2190 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002191
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002192 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002193 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002194 if (_Pickler_Write(self, data, size) < 0)
2195 return -1;
2196
2197 return 0;
2198}
2199
2200static int
2201write_unicode_binary(PicklerObject *self, PyObject *obj)
2202{
2203 PyObject *encoded = NULL;
2204 Py_ssize_t size;
2205 char *data;
2206 int r;
2207
2208 if (PyUnicode_READY(obj))
2209 return -1;
2210
2211 data = PyUnicode_AsUTF8AndSize(obj, &size);
2212 if (data != NULL)
2213 return write_utf8(self, data, size);
2214
2215 /* Issue #8383: for strings with lone surrogates, fallback on the
2216 "surrogatepass" error handler. */
2217 PyErr_Clear();
2218 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2219 if (encoded == NULL)
2220 return -1;
2221
2222 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2223 PyBytes_GET_SIZE(encoded));
2224 Py_DECREF(encoded);
2225 return r;
2226}
2227
2228static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002229save_unicode(PicklerObject *self, PyObject *obj)
2230{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002231 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002232 if (write_unicode_binary(self, obj) < 0)
2233 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002234 }
2235 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002236 PyObject *encoded;
2237 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002238 const char unicode_op = UNICODE;
2239
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002240 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002241 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002242 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002243
Antoine Pitrou299978d2013-04-07 17:38:11 +02002244 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2245 Py_DECREF(encoded);
2246 return -1;
2247 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002248
2249 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002250 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2251 Py_DECREF(encoded);
2252 return -1;
2253 }
2254 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002255
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002256 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002257 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002258 }
2259 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002260 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002261
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002262 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002263}
2264
2265/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2266static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002267store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002268{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002269 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002270
2271 assert(PyTuple_Size(t) == len);
2272
2273 for (i = 0; i < len; i++) {
2274 PyObject *element = PyTuple_GET_ITEM(t, i);
2275
2276 if (element == NULL)
2277 return -1;
2278 if (save(self, element, 0) < 0)
2279 return -1;
2280 }
2281
2282 return 0;
2283}
2284
2285/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2286 * used across protocols to minimize the space needed to pickle them.
2287 * Tuples are also the only builtin immutable type that can be recursive
2288 * (a tuple can be reached from itself), and that requires some subtle
2289 * magic so that it works in all cases. IOW, this is a long routine.
2290 */
2291static int
2292save_tuple(PicklerObject *self, PyObject *obj)
2293{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002294 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002295
2296 const char mark_op = MARK;
2297 const char tuple_op = TUPLE;
2298 const char pop_op = POP;
2299 const char pop_mark_op = POP_MARK;
2300 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2301
2302 if ((len = PyTuple_Size(obj)) < 0)
2303 return -1;
2304
2305 if (len == 0) {
2306 char pdata[2];
2307
2308 if (self->proto) {
2309 pdata[0] = EMPTY_TUPLE;
2310 len = 1;
2311 }
2312 else {
2313 pdata[0] = MARK;
2314 pdata[1] = TUPLE;
2315 len = 2;
2316 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002317 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002318 return -1;
2319 return 0;
2320 }
2321
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002322 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002323 * saving the tuple elements, the tuple must be recursive, in
2324 * which case we'll pop everything we put on the stack, and fetch
2325 * its value from the memo.
2326 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002327 if (len <= 3 && self->proto >= 2) {
2328 /* Use TUPLE{1,2,3} opcodes. */
2329 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002330 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002331
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002332 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002333 /* pop the len elements */
2334 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002335 if (_Pickler_Write(self, &pop_op, 1) < 0)
2336 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002337 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002338 if (memo_get(self, obj) < 0)
2339 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002340
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002341 return 0;
2342 }
2343 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002344 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2345 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002346 }
2347 goto memoize;
2348 }
2349
2350 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2351 * Generate MARK e1 e2 ... TUPLE
2352 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002353 if (_Pickler_Write(self, &mark_op, 1) < 0)
2354 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002355
2356 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002357 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002358
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002359 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002360 /* pop the stack stuff we pushed */
2361 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002362 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2363 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002364 }
2365 else {
2366 /* Note that we pop one more than len, to remove
2367 * the MARK too.
2368 */
2369 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002370 if (_Pickler_Write(self, &pop_op, 1) < 0)
2371 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002372 }
2373 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002374 if (memo_get(self, obj) < 0)
2375 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002376
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002377 return 0;
2378 }
2379 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002380 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2381 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002382 }
2383
2384 memoize:
2385 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002386 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002387
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002388 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002389}
2390
2391/* iter is an iterator giving items, and we batch up chunks of
2392 * MARK item item ... item APPENDS
2393 * opcode sequences. Calling code should have arranged to first create an
2394 * empty list, or list-like object, for the APPENDS to operate on.
2395 * Returns 0 on success, <0 on error.
2396 */
2397static int
2398batch_list(PicklerObject *self, PyObject *iter)
2399{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002400 PyObject *obj = NULL;
2401 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002402 int i, n;
2403
2404 const char mark_op = MARK;
2405 const char append_op = APPEND;
2406 const char appends_op = APPENDS;
2407
2408 assert(iter != NULL);
2409
2410 /* XXX: I think this function could be made faster by avoiding the
2411 iterator interface and fetching objects directly from list using
2412 PyList_GET_ITEM.
2413 */
2414
2415 if (self->proto == 0) {
2416 /* APPENDS isn't available; do one at a time. */
2417 for (;;) {
2418 obj = PyIter_Next(iter);
2419 if (obj == NULL) {
2420 if (PyErr_Occurred())
2421 return -1;
2422 break;
2423 }
2424 i = save(self, obj, 0);
2425 Py_DECREF(obj);
2426 if (i < 0)
2427 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002428 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002429 return -1;
2430 }
2431 return 0;
2432 }
2433
2434 /* proto > 0: write in batches of BATCHSIZE. */
2435 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002436 /* Get first item */
2437 firstitem = PyIter_Next(iter);
2438 if (firstitem == NULL) {
2439 if (PyErr_Occurred())
2440 goto error;
2441
2442 /* nothing more to add */
2443 break;
2444 }
2445
2446 /* Try to get a second item */
2447 obj = PyIter_Next(iter);
2448 if (obj == NULL) {
2449 if (PyErr_Occurred())
2450 goto error;
2451
2452 /* Only one item to write */
2453 if (save(self, firstitem, 0) < 0)
2454 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002455 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002456 goto error;
2457 Py_CLEAR(firstitem);
2458 break;
2459 }
2460
2461 /* More than one item to write */
2462
2463 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002464 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002465 goto error;
2466
2467 if (save(self, firstitem, 0) < 0)
2468 goto error;
2469 Py_CLEAR(firstitem);
2470 n = 1;
2471
2472 /* Fetch and save up to BATCHSIZE items */
2473 while (obj) {
2474 if (save(self, obj, 0) < 0)
2475 goto error;
2476 Py_CLEAR(obj);
2477 n += 1;
2478
2479 if (n == BATCHSIZE)
2480 break;
2481
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002482 obj = PyIter_Next(iter);
2483 if (obj == NULL) {
2484 if (PyErr_Occurred())
2485 goto error;
2486 break;
2487 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002488 }
2489
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002490 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002491 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002492
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002493 } while (n == BATCHSIZE);
2494 return 0;
2495
2496 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002497 Py_XDECREF(firstitem);
2498 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002499 return -1;
2500}
2501
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002502/* This is a variant of batch_list() above, specialized for lists (with no
2503 * support for list subclasses). Like batch_list(), we batch up chunks of
2504 * MARK item item ... item APPENDS
2505 * opcode sequences. Calling code should have arranged to first create an
2506 * empty list, or list-like object, for the APPENDS to operate on.
2507 * Returns 0 on success, -1 on error.
2508 *
2509 * This version is considerably faster than batch_list(), if less general.
2510 *
2511 * Note that this only works for protocols > 0.
2512 */
2513static int
2514batch_list_exact(PicklerObject *self, PyObject *obj)
2515{
2516 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002517 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002518
2519 const char append_op = APPEND;
2520 const char appends_op = APPENDS;
2521 const char mark_op = MARK;
2522
2523 assert(obj != NULL);
2524 assert(self->proto > 0);
2525 assert(PyList_CheckExact(obj));
2526
2527 if (PyList_GET_SIZE(obj) == 1) {
2528 item = PyList_GET_ITEM(obj, 0);
2529 if (save(self, item, 0) < 0)
2530 return -1;
2531 if (_Pickler_Write(self, &append_op, 1) < 0)
2532 return -1;
2533 return 0;
2534 }
2535
2536 /* Write in batches of BATCHSIZE. */
2537 total = 0;
2538 do {
2539 this_batch = 0;
2540 if (_Pickler_Write(self, &mark_op, 1) < 0)
2541 return -1;
2542 while (total < PyList_GET_SIZE(obj)) {
2543 item = PyList_GET_ITEM(obj, total);
2544 if (save(self, item, 0) < 0)
2545 return -1;
2546 total++;
2547 if (++this_batch == BATCHSIZE)
2548 break;
2549 }
2550 if (_Pickler_Write(self, &appends_op, 1) < 0)
2551 return -1;
2552
2553 } while (total < PyList_GET_SIZE(obj));
2554
2555 return 0;
2556}
2557
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002558static int
2559save_list(PicklerObject *self, PyObject *obj)
2560{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002561 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002562 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002563 int status = 0;
2564
2565 if (self->fast && !fast_save_enter(self, obj))
2566 goto error;
2567
2568 /* Create an empty list. */
2569 if (self->bin) {
2570 header[0] = EMPTY_LIST;
2571 len = 1;
2572 }
2573 else {
2574 header[0] = MARK;
2575 header[1] = LIST;
2576 len = 2;
2577 }
2578
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002579 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002580 goto error;
2581
2582 /* Get list length, and bow out early if empty. */
2583 if ((len = PyList_Size(obj)) < 0)
2584 goto error;
2585
2586 if (memo_put(self, obj) < 0)
2587 goto error;
2588
2589 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002590 /* Materialize the list elements. */
2591 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002592 if (Py_EnterRecursiveCall(" while pickling an object"))
2593 goto error;
2594 status = batch_list_exact(self, obj);
2595 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002596 } else {
2597 PyObject *iter = PyObject_GetIter(obj);
2598 if (iter == NULL)
2599 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002600
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002601 if (Py_EnterRecursiveCall(" while pickling an object")) {
2602 Py_DECREF(iter);
2603 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002604 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002605 status = batch_list(self, iter);
2606 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002607 Py_DECREF(iter);
2608 }
2609 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002610 if (0) {
2611 error:
2612 status = -1;
2613 }
2614
2615 if (self->fast && !fast_save_leave(self, obj))
2616 status = -1;
2617
2618 return status;
2619}
2620
2621/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2622 * MARK key value ... key value SETITEMS
2623 * opcode sequences. Calling code should have arranged to first create an
2624 * empty dict, or dict-like object, for the SETITEMS to operate on.
2625 * Returns 0 on success, <0 on error.
2626 *
2627 * This is very much like batch_list(). The difference between saving
2628 * elements directly, and picking apart two-tuples, is so long-winded at
2629 * the C level, though, that attempts to combine these routines were too
2630 * ugly to bear.
2631 */
2632static int
2633batch_dict(PicklerObject *self, PyObject *iter)
2634{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002635 PyObject *obj = NULL;
2636 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002637 int i, n;
2638
2639 const char mark_op = MARK;
2640 const char setitem_op = SETITEM;
2641 const char setitems_op = SETITEMS;
2642
2643 assert(iter != NULL);
2644
2645 if (self->proto == 0) {
2646 /* SETITEMS isn't available; do one at a time. */
2647 for (;;) {
2648 obj = PyIter_Next(iter);
2649 if (obj == NULL) {
2650 if (PyErr_Occurred())
2651 return -1;
2652 break;
2653 }
2654 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2655 PyErr_SetString(PyExc_TypeError, "dict items "
2656 "iterator must return 2-tuples");
2657 return -1;
2658 }
2659 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2660 if (i >= 0)
2661 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2662 Py_DECREF(obj);
2663 if (i < 0)
2664 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002665 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002666 return -1;
2667 }
2668 return 0;
2669 }
2670
2671 /* proto > 0: write in batches of BATCHSIZE. */
2672 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002673 /* Get first item */
2674 firstitem = PyIter_Next(iter);
2675 if (firstitem == NULL) {
2676 if (PyErr_Occurred())
2677 goto error;
2678
2679 /* nothing more to add */
2680 break;
2681 }
2682 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2683 PyErr_SetString(PyExc_TypeError, "dict items "
2684 "iterator must return 2-tuples");
2685 goto error;
2686 }
2687
2688 /* Try to get a second item */
2689 obj = PyIter_Next(iter);
2690 if (obj == NULL) {
2691 if (PyErr_Occurred())
2692 goto error;
2693
2694 /* Only one item to write */
2695 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2696 goto error;
2697 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2698 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002699 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002700 goto error;
2701 Py_CLEAR(firstitem);
2702 break;
2703 }
2704
2705 /* More than one item to write */
2706
2707 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002708 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002709 goto error;
2710
2711 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2712 goto error;
2713 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2714 goto error;
2715 Py_CLEAR(firstitem);
2716 n = 1;
2717
2718 /* Fetch and save up to BATCHSIZE items */
2719 while (obj) {
2720 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2721 PyErr_SetString(PyExc_TypeError, "dict items "
2722 "iterator must return 2-tuples");
2723 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002724 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002725 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2726 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2727 goto error;
2728 Py_CLEAR(obj);
2729 n += 1;
2730
2731 if (n == BATCHSIZE)
2732 break;
2733
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002734 obj = PyIter_Next(iter);
2735 if (obj == NULL) {
2736 if (PyErr_Occurred())
2737 goto error;
2738 break;
2739 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002740 }
2741
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002742 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002743 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002744
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002745 } while (n == BATCHSIZE);
2746 return 0;
2747
2748 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002749 Py_XDECREF(firstitem);
2750 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002751 return -1;
2752}
2753
Collin Winter5c9b02d2009-05-25 05:43:30 +00002754/* This is a variant of batch_dict() above that specializes for dicts, with no
2755 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2756 * MARK key value ... key value SETITEMS
2757 * opcode sequences. Calling code should have arranged to first create an
2758 * empty dict, or dict-like object, for the SETITEMS to operate on.
2759 * Returns 0 on success, -1 on error.
2760 *
2761 * Note that this currently doesn't work for protocol 0.
2762 */
2763static int
2764batch_dict_exact(PicklerObject *self, PyObject *obj)
2765{
2766 PyObject *key = NULL, *value = NULL;
2767 int i;
2768 Py_ssize_t dict_size, ppos = 0;
2769
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002770 const char mark_op = MARK;
2771 const char setitem_op = SETITEM;
2772 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002773
2774 assert(obj != NULL);
2775 assert(self->proto > 0);
2776
2777 dict_size = PyDict_Size(obj);
2778
2779 /* Special-case len(d) == 1 to save space. */
2780 if (dict_size == 1) {
2781 PyDict_Next(obj, &ppos, &key, &value);
2782 if (save(self, key, 0) < 0)
2783 return -1;
2784 if (save(self, value, 0) < 0)
2785 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002786 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002787 return -1;
2788 return 0;
2789 }
2790
2791 /* Write in batches of BATCHSIZE. */
2792 do {
2793 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002794 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002795 return -1;
2796 while (PyDict_Next(obj, &ppos, &key, &value)) {
2797 if (save(self, key, 0) < 0)
2798 return -1;
2799 if (save(self, value, 0) < 0)
2800 return -1;
2801 if (++i == BATCHSIZE)
2802 break;
2803 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002804 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002805 return -1;
2806 if (PyDict_Size(obj) != dict_size) {
2807 PyErr_Format(
2808 PyExc_RuntimeError,
2809 "dictionary changed size during iteration");
2810 return -1;
2811 }
2812
2813 } while (i == BATCHSIZE);
2814 return 0;
2815}
2816
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002817static int
2818save_dict(PicklerObject *self, PyObject *obj)
2819{
2820 PyObject *items, *iter;
2821 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002822 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002823 int status = 0;
2824
2825 if (self->fast && !fast_save_enter(self, obj))
2826 goto error;
2827
2828 /* Create an empty dict. */
2829 if (self->bin) {
2830 header[0] = EMPTY_DICT;
2831 len = 1;
2832 }
2833 else {
2834 header[0] = MARK;
2835 header[1] = DICT;
2836 len = 2;
2837 }
2838
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002839 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002840 goto error;
2841
2842 /* Get dict size, and bow out early if empty. */
2843 if ((len = PyDict_Size(obj)) < 0)
2844 goto error;
2845
2846 if (memo_put(self, obj) < 0)
2847 goto error;
2848
2849 if (len != 0) {
2850 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002851 if (PyDict_CheckExact(obj) && self->proto > 0) {
2852 /* We can take certain shortcuts if we know this is a dict and
2853 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002854 if (Py_EnterRecursiveCall(" while pickling an object"))
2855 goto error;
2856 status = batch_dict_exact(self, obj);
2857 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002858 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002859 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002860
2861 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002862 if (items == NULL)
2863 goto error;
2864 iter = PyObject_GetIter(items);
2865 Py_DECREF(items);
2866 if (iter == NULL)
2867 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002868 if (Py_EnterRecursiveCall(" while pickling an object")) {
2869 Py_DECREF(iter);
2870 goto error;
2871 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002872 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002873 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002874 Py_DECREF(iter);
2875 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002876 }
2877
2878 if (0) {
2879 error:
2880 status = -1;
2881 }
2882
2883 if (self->fast && !fast_save_leave(self, obj))
2884 status = -1;
2885
2886 return status;
2887}
2888
2889static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002890save_set(PicklerObject *self, PyObject *obj)
2891{
2892 PyObject *item;
2893 int i;
2894 Py_ssize_t set_size, ppos = 0;
2895 Py_hash_t hash;
2896
2897 const char empty_set_op = EMPTY_SET;
2898 const char mark_op = MARK;
2899 const char additems_op = ADDITEMS;
2900
2901 if (self->proto < 4) {
2902 PyObject *items;
2903 PyObject *reduce_value;
2904 int status;
2905
2906 items = PySequence_List(obj);
2907 if (items == NULL) {
2908 return -1;
2909 }
2910 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2911 Py_DECREF(items);
2912 if (reduce_value == NULL) {
2913 return -1;
2914 }
2915 /* save_reduce() will memoize the object automatically. */
2916 status = save_reduce(self, reduce_value, obj);
2917 Py_DECREF(reduce_value);
2918 return status;
2919 }
2920
2921 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2922 return -1;
2923
2924 if (memo_put(self, obj) < 0)
2925 return -1;
2926
2927 set_size = PySet_GET_SIZE(obj);
2928 if (set_size == 0)
2929 return 0; /* nothing to do */
2930
2931 /* Write in batches of BATCHSIZE. */
2932 do {
2933 i = 0;
2934 if (_Pickler_Write(self, &mark_op, 1) < 0)
2935 return -1;
2936 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2937 if (save(self, item, 0) < 0)
2938 return -1;
2939 if (++i == BATCHSIZE)
2940 break;
2941 }
2942 if (_Pickler_Write(self, &additems_op, 1) < 0)
2943 return -1;
2944 if (PySet_GET_SIZE(obj) != set_size) {
2945 PyErr_Format(
2946 PyExc_RuntimeError,
2947 "set changed size during iteration");
2948 return -1;
2949 }
2950 } while (i == BATCHSIZE);
2951
2952 return 0;
2953}
2954
2955static int
2956save_frozenset(PicklerObject *self, PyObject *obj)
2957{
2958 PyObject *iter;
2959
2960 const char mark_op = MARK;
2961 const char frozenset_op = FROZENSET;
2962
2963 if (self->fast && !fast_save_enter(self, obj))
2964 return -1;
2965
2966 if (self->proto < 4) {
2967 PyObject *items;
2968 PyObject *reduce_value;
2969 int status;
2970
2971 items = PySequence_List(obj);
2972 if (items == NULL) {
2973 return -1;
2974 }
2975 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2976 items);
2977 Py_DECREF(items);
2978 if (reduce_value == NULL) {
2979 return -1;
2980 }
2981 /* save_reduce() will memoize the object automatically. */
2982 status = save_reduce(self, reduce_value, obj);
2983 Py_DECREF(reduce_value);
2984 return status;
2985 }
2986
2987 if (_Pickler_Write(self, &mark_op, 1) < 0)
2988 return -1;
2989
2990 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002991 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002992 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002993 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002994 for (;;) {
2995 PyObject *item;
2996
2997 item = PyIter_Next(iter);
2998 if (item == NULL) {
2999 if (PyErr_Occurred()) {
3000 Py_DECREF(iter);
3001 return -1;
3002 }
3003 break;
3004 }
3005 if (save(self, item, 0) < 0) {
3006 Py_DECREF(item);
3007 Py_DECREF(iter);
3008 return -1;
3009 }
3010 Py_DECREF(item);
3011 }
3012 Py_DECREF(iter);
3013
3014 /* If the object is already in the memo, this means it is
3015 recursive. In this case, throw away everything we put on the
3016 stack, and fetch the object back from the memo. */
3017 if (PyMemoTable_Get(self->memo, obj)) {
3018 const char pop_mark_op = POP_MARK;
3019
3020 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3021 return -1;
3022 if (memo_get(self, obj) < 0)
3023 return -1;
3024 return 0;
3025 }
3026
3027 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3028 return -1;
3029 if (memo_put(self, obj) < 0)
3030 return -1;
3031
3032 return 0;
3033}
3034
3035static int
3036fix_imports(PyObject **module_name, PyObject **global_name)
3037{
3038 PyObject *key;
3039 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003040 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003041
3042 key = PyTuple_Pack(2, *module_name, *global_name);
3043 if (key == NULL)
3044 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003045 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003046 Py_DECREF(key);
3047 if (item) {
3048 PyObject *fixed_module_name;
3049 PyObject *fixed_global_name;
3050
3051 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3052 PyErr_Format(PyExc_RuntimeError,
3053 "_compat_pickle.REVERSE_NAME_MAPPING values "
3054 "should be 2-tuples, not %.200s",
3055 Py_TYPE(item)->tp_name);
3056 return -1;
3057 }
3058 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3059 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3060 if (!PyUnicode_Check(fixed_module_name) ||
3061 !PyUnicode_Check(fixed_global_name)) {
3062 PyErr_Format(PyExc_RuntimeError,
3063 "_compat_pickle.REVERSE_NAME_MAPPING values "
3064 "should be pairs of str, not (%.200s, %.200s)",
3065 Py_TYPE(fixed_module_name)->tp_name,
3066 Py_TYPE(fixed_global_name)->tp_name);
3067 return -1;
3068 }
3069
3070 Py_CLEAR(*module_name);
3071 Py_CLEAR(*global_name);
3072 Py_INCREF(fixed_module_name);
3073 Py_INCREF(fixed_global_name);
3074 *module_name = fixed_module_name;
3075 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003076 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003077 }
3078 else if (PyErr_Occurred()) {
3079 return -1;
3080 }
3081
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003082 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003083 if (item) {
3084 if (!PyUnicode_Check(item)) {
3085 PyErr_Format(PyExc_RuntimeError,
3086 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3087 "should be strings, not %.200s",
3088 Py_TYPE(item)->tp_name);
3089 return -1;
3090 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003091 Py_INCREF(item);
Serhiy Storchaka48842712016-04-06 09:45:48 +03003092 Py_XSETREF(*module_name, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003093 }
3094 else if (PyErr_Occurred()) {
3095 return -1;
3096 }
3097
3098 return 0;
3099}
3100
3101static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003102save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3103{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003104 PyObject *global_name = NULL;
3105 PyObject *module_name = NULL;
3106 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003107 PyObject *parent = NULL;
3108 PyObject *dotted_path = NULL;
3109 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003110 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003111 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003112 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003113 _Py_IDENTIFIER(__name__);
3114 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003115
3116 const char global_op = GLOBAL;
3117
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003118 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003119 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003120 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003121 }
3122 else {
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003123 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3124 if (global_name == NULL) {
3125 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3126 goto error;
3127 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003128 }
3129 if (global_name == NULL) {
3130 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3131 if (global_name == NULL)
3132 goto error;
3133 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003134 }
3135
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003136 dotted_path = get_dotted_path(module, global_name);
3137 if (dotted_path == NULL)
3138 goto error;
3139 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003140 if (module_name == NULL)
3141 goto error;
3142
3143 /* XXX: Change to use the import C API directly with level=0 to disallow
3144 relative imports.
3145
3146 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3147 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3148 custom import functions (IMHO, this would be a nice security
3149 feature). The import C API would need to be extended to support the
3150 extra parameters of __import__ to fix that. */
3151 module = PyImport_Import(module_name);
3152 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003153 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003154 "Can't pickle %R: import of module %R failed",
3155 obj, module_name);
3156 goto error;
3157 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003158 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3159 Py_INCREF(lastname);
3160 cls = get_deep_attribute(module, dotted_path, &parent);
3161 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003162 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003163 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003164 "Can't pickle %R: attribute lookup %S on %S failed",
3165 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003166 goto error;
3167 }
3168 if (cls != obj) {
3169 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003170 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003171 "Can't pickle %R: it's not the same object as %S.%S",
3172 obj, module_name, global_name);
3173 goto error;
3174 }
3175 Py_DECREF(cls);
3176
3177 if (self->proto >= 2) {
3178 /* See whether this is in the extension registry, and if
3179 * so generate an EXT opcode.
3180 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003181 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003182 PyObject *code_obj; /* extension code as Python object */
3183 long code; /* extension code as C value */
3184 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003185 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003186
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003187 extension_key = PyTuple_Pack(2, module_name, global_name);
3188 if (extension_key == NULL) {
3189 goto error;
3190 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003191 code_obj = PyDict_GetItemWithError(st->extension_registry,
3192 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003193 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003194 /* The object is not registered in the extension registry.
3195 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003196 if (code_obj == NULL) {
3197 if (PyErr_Occurred()) {
3198 goto error;
3199 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003200 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003201 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003202
3203 /* XXX: pickle.py doesn't check neither the type, nor the range
3204 of the value returned by the extension_registry. It should for
3205 consistency. */
3206
3207 /* Verify code_obj has the right type and value. */
3208 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003209 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003210 "Can't pickle %R: extension code %R isn't an integer",
3211 obj, code_obj);
3212 goto error;
3213 }
3214 code = PyLong_AS_LONG(code_obj);
3215 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003216 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003217 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3218 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003219 goto error;
3220 }
3221
3222 /* Generate an EXT opcode. */
3223 if (code <= 0xff) {
3224 pdata[0] = EXT1;
3225 pdata[1] = (unsigned char)code;
3226 n = 2;
3227 }
3228 else if (code <= 0xffff) {
3229 pdata[0] = EXT2;
3230 pdata[1] = (unsigned char)(code & 0xff);
3231 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3232 n = 3;
3233 }
3234 else {
3235 pdata[0] = EXT4;
3236 pdata[1] = (unsigned char)(code & 0xff);
3237 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3238 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3239 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3240 n = 5;
3241 }
3242
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003243 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003244 goto error;
3245 }
3246 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003247 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003248 if (parent == module) {
3249 Py_INCREF(lastname);
3250 Py_DECREF(global_name);
3251 global_name = lastname;
3252 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003253 if (self->proto >= 4) {
3254 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003255
Christian Heimese8b1ba12013-11-23 21:13:39 +01003256 if (save(self, module_name, 0) < 0)
3257 goto error;
3258 if (save(self, global_name, 0) < 0)
3259 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003260
3261 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3262 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003263 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003264 else if (parent != module) {
3265 PickleState *st = _Pickle_GetGlobalState();
3266 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3267 st->getattr, parent, lastname);
3268 status = save_reduce(self, reduce_value, NULL);
3269 Py_DECREF(reduce_value);
3270 if (status < 0)
3271 goto error;
3272 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003273 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003274 /* Generate a normal global opcode if we are using a pickle
3275 protocol < 4, or if the object is not registered in the
3276 extension registry. */
3277 PyObject *encoded;
3278 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003279
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003280 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003281 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003282
3283 /* For protocol < 3 and if the user didn't request against doing
3284 so, we convert module names to the old 2.x module names. */
3285 if (self->proto < 3 && self->fix_imports) {
3286 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003287 goto error;
3288 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003289 }
3290
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003291 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3292 both the module name and the global name using UTF-8. We do so
3293 only when we are using the pickle protocol newer than version
3294 3. This is to ensure compatibility with older Unpickler running
3295 on Python 2.x. */
3296 if (self->proto == 3) {
3297 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003298 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003299 else {
3300 unicode_encoder = PyUnicode_AsASCIIString;
3301 }
3302 encoded = unicode_encoder(module_name);
3303 if (encoded == NULL) {
3304 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003305 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003306 "can't pickle module identifier '%S' using "
3307 "pickle protocol %i",
3308 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003309 goto error;
3310 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003311 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3312 PyBytes_GET_SIZE(encoded)) < 0) {
3313 Py_DECREF(encoded);
3314 goto error;
3315 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003316 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003317 if(_Pickler_Write(self, "\n", 1) < 0)
3318 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003319
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003320 /* Save the name of the module. */
3321 encoded = unicode_encoder(global_name);
3322 if (encoded == NULL) {
3323 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003324 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003325 "can't pickle global identifier '%S' using "
3326 "pickle protocol %i",
3327 global_name, self->proto);
3328 goto error;
3329 }
3330 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3331 PyBytes_GET_SIZE(encoded)) < 0) {
3332 Py_DECREF(encoded);
3333 goto error;
3334 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003335 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003336 if (_Pickler_Write(self, "\n", 1) < 0)
3337 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003338 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003339 /* Memoize the object. */
3340 if (memo_put(self, obj) < 0)
3341 goto error;
3342 }
3343
3344 if (0) {
3345 error:
3346 status = -1;
3347 }
3348 Py_XDECREF(module_name);
3349 Py_XDECREF(global_name);
3350 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003351 Py_XDECREF(parent);
3352 Py_XDECREF(dotted_path);
3353 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003354
3355 return status;
3356}
3357
3358static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003359save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3360{
3361 PyObject *reduce_value;
3362 int status;
3363
3364 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3365 if (reduce_value == NULL) {
3366 return -1;
3367 }
3368 status = save_reduce(self, reduce_value, obj);
3369 Py_DECREF(reduce_value);
3370 return status;
3371}
3372
3373static int
3374save_type(PicklerObject *self, PyObject *obj)
3375{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003376 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003377 return save_singleton_type(self, obj, Py_None);
3378 }
3379 else if (obj == (PyObject *)&PyEllipsis_Type) {
3380 return save_singleton_type(self, obj, Py_Ellipsis);
3381 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003382 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003383 return save_singleton_type(self, obj, Py_NotImplemented);
3384 }
3385 return save_global(self, obj, NULL);
3386}
3387
3388static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003389save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3390{
3391 PyObject *pid = NULL;
3392 int status = 0;
3393
3394 const char persid_op = PERSID;
3395 const char binpersid_op = BINPERSID;
3396
3397 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003398 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003399 if (pid == NULL)
3400 return -1;
3401
3402 if (pid != Py_None) {
3403 if (self->bin) {
3404 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003405 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003406 goto error;
3407 }
3408 else {
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003409 PyObject *pid_str;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003410
3411 pid_str = PyObject_Str(pid);
3412 if (pid_str == NULL)
3413 goto error;
3414
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003415 /* XXX: Should it check whether the pid contains embedded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003416 newlines? */
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003417 if (!PyUnicode_IS_ASCII(pid_str)) {
3418 PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
3419 "persistent IDs in protocol 0 must be "
3420 "ASCII strings");
3421 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003422 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003423 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003424
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003425 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003426 _Pickler_Write(self, PyUnicode_DATA(pid_str),
3427 PyUnicode_GET_LENGTH(pid_str)) < 0 ||
3428 _Pickler_Write(self, "\n", 1) < 0) {
3429 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003430 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003431 }
3432 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003433 }
3434 status = 1;
3435 }
3436
3437 if (0) {
3438 error:
3439 status = -1;
3440 }
3441 Py_XDECREF(pid);
3442
3443 return status;
3444}
3445
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003446static PyObject *
3447get_class(PyObject *obj)
3448{
3449 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003450 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003451
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003452 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003453 if (cls == NULL) {
3454 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3455 PyErr_Clear();
3456 cls = (PyObject *) Py_TYPE(obj);
3457 Py_INCREF(cls);
3458 }
3459 }
3460 return cls;
3461}
3462
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003463/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3464 * appropriate __reduce__ method for obj.
3465 */
3466static int
3467save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3468{
3469 PyObject *callable;
3470 PyObject *argtup;
3471 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003472 PyObject *listitems = Py_None;
3473 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003474 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003475 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003476 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003477
3478 const char reduce_op = REDUCE;
3479 const char build_op = BUILD;
3480 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003481 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003482
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003483 size = PyTuple_Size(args);
3484 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003485 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003486 "__reduce__ must contain 2 through 5 elements");
3487 return -1;
3488 }
3489
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003490 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3491 &callable, &argtup, &state, &listitems, &dictitems))
3492 return -1;
3493
3494 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003495 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003496 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003497 return -1;
3498 }
3499 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003500 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003501 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003502 return -1;
3503 }
3504
3505 if (state == Py_None)
3506 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003507
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003508 if (listitems == Py_None)
3509 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003510 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003511 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003512 "returned by __reduce__ must be an iterator, not %s",
3513 Py_TYPE(listitems)->tp_name);
3514 return -1;
3515 }
3516
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003517 if (dictitems == Py_None)
3518 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003519 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003520 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003521 "returned by __reduce__ must be an iterator, not %s",
3522 Py_TYPE(dictitems)->tp_name);
3523 return -1;
3524 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003525
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003526 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003527 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003528 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003529
Victor Stinner804e05e2013-11-14 01:26:17 +01003530 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003531 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003532 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003533 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003534 }
3535 PyErr_Clear();
3536 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003537 else if (PyUnicode_Check(name)) {
3538 if (self->proto >= 4) {
3539 _Py_IDENTIFIER(__newobj_ex__);
3540 use_newobj_ex = PyUnicode_Compare(
3541 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3542 }
3543 if (!use_newobj_ex) {
3544 _Py_IDENTIFIER(__newobj__);
3545 use_newobj = PyUnicode_Compare(
3546 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
3547 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003548 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003549 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003550 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003551
3552 if (use_newobj_ex) {
3553 PyObject *cls;
3554 PyObject *args;
3555 PyObject *kwargs;
3556
3557 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003558 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003559 "length of the NEWOBJ_EX argument tuple must be "
3560 "exactly 3, not %zd", Py_SIZE(argtup));
3561 return -1;
3562 }
3563
3564 cls = PyTuple_GET_ITEM(argtup, 0);
3565 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003566 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003567 "first item from NEWOBJ_EX argument tuple must "
3568 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3569 return -1;
3570 }
3571 args = PyTuple_GET_ITEM(argtup, 1);
3572 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003573 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003574 "second item from NEWOBJ_EX argument tuple must "
3575 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3576 return -1;
3577 }
3578 kwargs = PyTuple_GET_ITEM(argtup, 2);
3579 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003580 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003581 "third item from NEWOBJ_EX argument tuple must "
3582 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3583 return -1;
3584 }
3585
3586 if (save(self, cls, 0) < 0 ||
3587 save(self, args, 0) < 0 ||
3588 save(self, kwargs, 0) < 0 ||
3589 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3590 return -1;
3591 }
3592 }
3593 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003594 PyObject *cls;
3595 PyObject *newargtup;
3596 PyObject *obj_class;
3597 int p;
3598
3599 /* Sanity checks. */
3600 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003601 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003602 return -1;
3603 }
3604
3605 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003606 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003607 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003608 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003609 return -1;
3610 }
3611
3612 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003613 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003614 p = obj_class != cls; /* true iff a problem */
3615 Py_DECREF(obj_class);
3616 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003617 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003618 "__newobj__ args has the wrong class");
3619 return -1;
3620 }
3621 }
3622 /* XXX: These calls save() are prone to infinite recursion. Imagine
3623 what happen if the value returned by the __reduce__() method of
3624 some extension type contains another object of the same type. Ouch!
3625
3626 Here is a quick example, that I ran into, to illustrate what I
3627 mean:
3628
3629 >>> import pickle, copyreg
3630 >>> copyreg.dispatch_table.pop(complex)
3631 >>> pickle.dumps(1+2j)
3632 Traceback (most recent call last):
3633 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04003634 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003635
3636 Removing the complex class from copyreg.dispatch_table made the
3637 __reduce_ex__() method emit another complex object:
3638
3639 >>> (1+1j).__reduce_ex__(2)
3640 (<function __newobj__ at 0xb7b71c3c>,
3641 (<class 'complex'>, (1+1j)), None, None, None)
3642
3643 Thus when save() was called on newargstup (the 2nd item) recursion
3644 ensued. Of course, the bug was in the complex class which had a
3645 broken __getnewargs__() that emitted another complex object. But,
3646 the point, here, is it is quite easy to end up with a broken reduce
3647 function. */
3648
3649 /* Save the class and its __new__ arguments. */
3650 if (save(self, cls, 0) < 0)
3651 return -1;
3652
3653 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3654 if (newargtup == NULL)
3655 return -1;
3656
3657 p = save(self, newargtup, 0);
3658 Py_DECREF(newargtup);
3659 if (p < 0)
3660 return -1;
3661
3662 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003663 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003664 return -1;
3665 }
3666 else { /* Not using NEWOBJ. */
3667 if (save(self, callable, 0) < 0 ||
3668 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003669 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003670 return -1;
3671 }
3672
3673 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3674 the caller do not want to memoize the object. Not particularly useful,
3675 but that is to mimic the behavior save_reduce() in pickle.py when
3676 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003677 if (obj != NULL) {
3678 /* If the object is already in the memo, this means it is
3679 recursive. In this case, throw away everything we put on the
3680 stack, and fetch the object back from the memo. */
3681 if (PyMemoTable_Get(self->memo, obj)) {
3682 const char pop_op = POP;
3683
3684 if (_Pickler_Write(self, &pop_op, 1) < 0)
3685 return -1;
3686 if (memo_get(self, obj) < 0)
3687 return -1;
3688
3689 return 0;
3690 }
3691 else if (memo_put(self, obj) < 0)
3692 return -1;
3693 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003694
3695 if (listitems && batch_list(self, listitems) < 0)
3696 return -1;
3697
3698 if (dictitems && batch_dict(self, dictitems) < 0)
3699 return -1;
3700
3701 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003702 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003703 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003704 return -1;
3705 }
3706
3707 return 0;
3708}
3709
3710static int
3711save(PicklerObject *self, PyObject *obj, int pers_save)
3712{
3713 PyTypeObject *type;
3714 PyObject *reduce_func = NULL;
3715 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003716 int status = 0;
3717
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003718 if (_Pickler_OpcodeBoundary(self) < 0)
3719 return -1;
3720
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003721 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003722 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003723
3724 /* The extra pers_save argument is necessary to avoid calling save_pers()
3725 on its returned object. */
3726 if (!pers_save && self->pers_func) {
3727 /* save_pers() returns:
3728 -1 to signal an error;
3729 0 if it did nothing successfully;
3730 1 if a persistent id was saved.
3731 */
3732 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3733 goto done;
3734 }
3735
3736 type = Py_TYPE(obj);
3737
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003738 /* The old cPickle had an optimization that used switch-case statement
3739 dispatching on the first letter of the type name. This has was removed
3740 since benchmarks shown that this optimization was actually slowing
3741 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003742
3743 /* Atom types; these aren't memoized, so don't check the memo. */
3744
3745 if (obj == Py_None) {
3746 status = save_none(self, obj);
3747 goto done;
3748 }
3749 else if (obj == Py_False || obj == Py_True) {
3750 status = save_bool(self, obj);
3751 goto done;
3752 }
3753 else if (type == &PyLong_Type) {
3754 status = save_long(self, obj);
3755 goto done;
3756 }
3757 else if (type == &PyFloat_Type) {
3758 status = save_float(self, obj);
3759 goto done;
3760 }
3761
3762 /* Check the memo to see if it has the object. If so, generate
3763 a GET (or BINGET) opcode, instead of pickling the object
3764 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003765 if (PyMemoTable_Get(self->memo, obj)) {
3766 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003767 goto error;
3768 goto done;
3769 }
3770
3771 if (type == &PyBytes_Type) {
3772 status = save_bytes(self, obj);
3773 goto done;
3774 }
3775 else if (type == &PyUnicode_Type) {
3776 status = save_unicode(self, obj);
3777 goto done;
3778 }
3779 else if (type == &PyDict_Type) {
3780 status = save_dict(self, obj);
3781 goto done;
3782 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003783 else if (type == &PySet_Type) {
3784 status = save_set(self, obj);
3785 goto done;
3786 }
3787 else if (type == &PyFrozenSet_Type) {
3788 status = save_frozenset(self, obj);
3789 goto done;
3790 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003791 else if (type == &PyList_Type) {
3792 status = save_list(self, obj);
3793 goto done;
3794 }
3795 else if (type == &PyTuple_Type) {
3796 status = save_tuple(self, obj);
3797 goto done;
3798 }
3799 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003800 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003801 goto done;
3802 }
3803 else if (type == &PyFunction_Type) {
3804 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003805 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003806 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003807
3808 /* XXX: This part needs some unit tests. */
3809
3810 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003811 * self.dispatch_table, copyreg.dispatch_table, the object's
3812 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003813 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003814 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003815 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003816 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3817 (PyObject *)type);
3818 if (reduce_func == NULL) {
3819 if (PyErr_Occurred()) {
3820 goto error;
3821 }
3822 } else {
3823 /* PyDict_GetItemWithError() returns a borrowed reference.
3824 Increase the reference count to be consistent with
3825 PyObject_GetItem and _PyObject_GetAttrId used below. */
3826 Py_INCREF(reduce_func);
3827 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003828 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003829 reduce_func = PyObject_GetItem(self->dispatch_table,
3830 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003831 if (reduce_func == NULL) {
3832 if (PyErr_ExceptionMatches(PyExc_KeyError))
3833 PyErr_Clear();
3834 else
3835 goto error;
3836 }
3837 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003838 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003839 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003840 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003841 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003842 else if (PyType_IsSubtype(type, &PyType_Type)) {
3843 status = save_global(self, obj, NULL);
3844 goto done;
3845 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003846 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003847 _Py_IDENTIFIER(__reduce__);
3848 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003849
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003850
3851 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3852 automatically defined as __reduce__. While this is convenient, this
3853 make it impossible to know which method was actually called. Of
3854 course, this is not a big deal. But still, it would be nice to let
3855 the user know which method was called when something go
3856 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3857 don't actually have to check for a __reduce__ method. */
3858
3859 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003860 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003861 if (reduce_func != NULL) {
3862 PyObject *proto;
3863 proto = PyLong_FromLong(self->proto);
3864 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003865 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003866 }
3867 }
3868 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003869 PickleState *st = _Pickle_GetGlobalState();
3870
3871 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003872 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003873 }
3874 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003875 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003876 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003877 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003878 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003879 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003880 PyObject *empty_tuple = PyTuple_New(0);
3881 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003882 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003883 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003884 }
3885 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003886 PyErr_Format(st->PicklingError,
3887 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003888 type->tp_name, obj);
3889 goto error;
3890 }
3891 }
3892 }
3893
3894 if (reduce_value == NULL)
3895 goto error;
3896
3897 if (PyUnicode_Check(reduce_value)) {
3898 status = save_global(self, obj, reduce_value);
3899 goto done;
3900 }
3901
3902 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003903 PickleState *st = _Pickle_GetGlobalState();
3904 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003905 "__reduce__ must return a string or tuple");
3906 goto error;
3907 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003908
3909 status = save_reduce(self, reduce_value, obj);
3910
3911 if (0) {
3912 error:
3913 status = -1;
3914 }
3915 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003916
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003917 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003918 Py_XDECREF(reduce_func);
3919 Py_XDECREF(reduce_value);
3920
3921 return status;
3922}
3923
3924static int
3925dump(PicklerObject *self, PyObject *obj)
3926{
3927 const char stop_op = STOP;
3928
3929 if (self->proto >= 2) {
3930 char header[2];
3931
3932 header[0] = PROTO;
3933 assert(self->proto >= 0 && self->proto < 256);
3934 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003935 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003936 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003937 if (self->proto >= 4)
3938 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003939 }
3940
3941 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003942 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003943 return -1;
3944
3945 return 0;
3946}
3947
Larry Hastings61272b72014-01-07 12:41:53 -08003948/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003949
3950_pickle.Pickler.clear_memo
3951
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003952Clears the pickler's "memo".
3953
3954The memo is the data structure that remembers which objects the
3955pickler has already seen, so that shared or recursive objects are
3956pickled by reference and not by value. This method is useful when
3957re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003958[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003959
Larry Hastings3cceb382014-01-04 11:09:09 -08003960static PyObject *
3961_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08003962/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003963{
3964 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003965 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003966
3967 Py_RETURN_NONE;
3968}
3969
Larry Hastings61272b72014-01-07 12:41:53 -08003970/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003971
3972_pickle.Pickler.dump
3973
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003974 obj: object
3975 /
3976
3977Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003978[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003979
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003980static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003981_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08003982/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003983{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003984 /* Check whether the Pickler was initialized correctly (issue3664).
3985 Developers often forget to call __init__() in their subclasses, which
3986 would trigger a segfault without this check. */
3987 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003988 PickleState *st = _Pickle_GetGlobalState();
3989 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003990 "Pickler.__init__() was not called by %s.__init__()",
3991 Py_TYPE(self)->tp_name);
3992 return NULL;
3993 }
3994
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003995 if (_Pickler_ClearBuffer(self) < 0)
3996 return NULL;
3997
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003998 if (dump(self, obj) < 0)
3999 return NULL;
4000
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004001 if (_Pickler_FlushToFile(self) < 0)
4002 return NULL;
4003
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004004 Py_RETURN_NONE;
4005}
4006
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004007/*[clinic input]
4008
4009_pickle.Pickler.__sizeof__ -> Py_ssize_t
4010
4011Returns size in memory, in bytes.
4012[clinic start generated code]*/
4013
4014static Py_ssize_t
4015_pickle_Pickler___sizeof___impl(PicklerObject *self)
4016/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4017{
4018 Py_ssize_t res, s;
4019
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004020 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004021 if (self->memo != NULL) {
4022 res += sizeof(PyMemoTable);
4023 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4024 }
4025 if (self->output_buffer != NULL) {
4026 s = _PySys_GetSizeOf(self->output_buffer);
4027 if (s == -1)
4028 return -1;
4029 res += s;
4030 }
4031 return res;
4032}
4033
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004034static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004035 _PICKLE_PICKLER_DUMP_METHODDEF
4036 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004037 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004038 {NULL, NULL} /* sentinel */
4039};
4040
4041static void
4042Pickler_dealloc(PicklerObject *self)
4043{
4044 PyObject_GC_UnTrack(self);
4045
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004046 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004047 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004048 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004049 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004050 Py_XDECREF(self->fast_memo);
4051
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004052 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004053
4054 Py_TYPE(self)->tp_free((PyObject *)self);
4055}
4056
4057static int
4058Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4059{
4060 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004061 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004062 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004063 Py_VISIT(self->fast_memo);
4064 return 0;
4065}
4066
4067static int
4068Pickler_clear(PicklerObject *self)
4069{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004070 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004071 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004072 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004073 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004074 Py_CLEAR(self->fast_memo);
4075
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004076 if (self->memo != NULL) {
4077 PyMemoTable *memo = self->memo;
4078 self->memo = NULL;
4079 PyMemoTable_Del(memo);
4080 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004081 return 0;
4082}
4083
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004084
Larry Hastings61272b72014-01-07 12:41:53 -08004085/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004086
4087_pickle.Pickler.__init__
4088
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004089 file: object
4090 protocol: object = NULL
4091 fix_imports: bool = True
4092
4093This takes a binary file for writing a pickle data stream.
4094
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004095The optional *protocol* argument tells the pickler to use the given
4096protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4097protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004098
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004099Specifying a negative protocol version selects the highest protocol
4100version supported. The higher the protocol used, the more recent the
4101version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004102
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004103The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004104bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004105writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004106this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004107
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004108If *fix_imports* is True and protocol is less than 3, pickle will try
4109to map the new Python 3 names to the old module names used in Python
41102, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004111[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004112
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004113static int
Larry Hastings89964c42015-04-14 18:07:59 -04004114_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4115 PyObject *protocol, int fix_imports)
Martin Panter2eb819f2015-11-02 04:04:57 +00004116/*[clinic end generated code: output=b5f31078dab17fb0 input=4faabdbc763c2389]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004117{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004118 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004119 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004120
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004121 /* In case of multiple __init__() calls, clear previous content. */
4122 if (self->write != NULL)
4123 (void)Pickler_clear(self);
4124
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004125 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004126 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004127
4128 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004129 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004130
4131 /* memo and output_buffer may have already been created in _Pickler_New */
4132 if (self->memo == NULL) {
4133 self->memo = PyMemoTable_New();
4134 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004135 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004136 }
4137 self->output_len = 0;
4138 if (self->output_buffer == NULL) {
4139 self->max_output_len = WRITE_BUF_SIZE;
4140 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4141 self->max_output_len);
4142 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004143 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004144 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004145
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004146 self->fast = 0;
4147 self->fast_nesting = 0;
4148 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004149 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004150 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4151 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4152 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004153 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004154 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004155 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004156 self->dispatch_table = NULL;
4157 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4158 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4159 &PyId_dispatch_table);
4160 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004161 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004162 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004163
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004164 return 0;
4165}
4166
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004167
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004168/* Define a proxy object for the Pickler's internal memo object. This is to
4169 * avoid breaking code like:
4170 * pickler.memo.clear()
4171 * and
4172 * pickler.memo = saved_memo
4173 * Is this a good idea? Not really, but we don't want to break code that uses
4174 * it. Note that we don't implement the entire mapping API here. This is
4175 * intentional, as these should be treated as black-box implementation details.
4176 */
4177
Larry Hastings61272b72014-01-07 12:41:53 -08004178/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004179_pickle.PicklerMemoProxy.clear
4180
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004181Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004182[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004183
Larry Hastings3cceb382014-01-04 11:09:09 -08004184static PyObject *
4185_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004186/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004187{
4188 if (self->pickler->memo)
4189 PyMemoTable_Clear(self->pickler->memo);
4190 Py_RETURN_NONE;
4191}
4192
Larry Hastings61272b72014-01-07 12:41:53 -08004193/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004194_pickle.PicklerMemoProxy.copy
4195
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004196Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004197[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004198
Larry Hastings3cceb382014-01-04 11:09:09 -08004199static PyObject *
4200_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004201/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004202{
4203 Py_ssize_t i;
4204 PyMemoTable *memo;
4205 PyObject *new_memo = PyDict_New();
4206 if (new_memo == NULL)
4207 return NULL;
4208
4209 memo = self->pickler->memo;
4210 for (i = 0; i < memo->mt_allocated; ++i) {
4211 PyMemoEntry entry = memo->mt_table[i];
4212 if (entry.me_key != NULL) {
4213 int status;
4214 PyObject *key, *value;
4215
4216 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004217 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004218
4219 if (key == NULL || value == NULL) {
4220 Py_XDECREF(key);
4221 Py_XDECREF(value);
4222 goto error;
4223 }
4224 status = PyDict_SetItem(new_memo, key, value);
4225 Py_DECREF(key);
4226 Py_DECREF(value);
4227 if (status < 0)
4228 goto error;
4229 }
4230 }
4231 return new_memo;
4232
4233 error:
4234 Py_XDECREF(new_memo);
4235 return NULL;
4236}
4237
Larry Hastings61272b72014-01-07 12:41:53 -08004238/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004239_pickle.PicklerMemoProxy.__reduce__
4240
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004241Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004242[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004243
Larry Hastings3cceb382014-01-04 11:09:09 -08004244static PyObject *
4245_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004246/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004247{
4248 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004249 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004250 if (contents == NULL)
4251 return NULL;
4252
4253 reduce_value = PyTuple_New(2);
4254 if (reduce_value == NULL) {
4255 Py_DECREF(contents);
4256 return NULL;
4257 }
4258 dict_args = PyTuple_New(1);
4259 if (dict_args == NULL) {
4260 Py_DECREF(contents);
4261 Py_DECREF(reduce_value);
4262 return NULL;
4263 }
4264 PyTuple_SET_ITEM(dict_args, 0, contents);
4265 Py_INCREF((PyObject *)&PyDict_Type);
4266 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4267 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4268 return reduce_value;
4269}
4270
4271static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004272 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4273 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4274 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004275 {NULL, NULL} /* sentinel */
4276};
4277
4278static void
4279PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4280{
4281 PyObject_GC_UnTrack(self);
4282 Py_XDECREF(self->pickler);
4283 PyObject_GC_Del((PyObject *)self);
4284}
4285
4286static int
4287PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4288 visitproc visit, void *arg)
4289{
4290 Py_VISIT(self->pickler);
4291 return 0;
4292}
4293
4294static int
4295PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4296{
4297 Py_CLEAR(self->pickler);
4298 return 0;
4299}
4300
4301static PyTypeObject PicklerMemoProxyType = {
4302 PyVarObject_HEAD_INIT(NULL, 0)
4303 "_pickle.PicklerMemoProxy", /*tp_name*/
4304 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4305 0,
4306 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4307 0, /* tp_print */
4308 0, /* tp_getattr */
4309 0, /* tp_setattr */
4310 0, /* tp_compare */
4311 0, /* tp_repr */
4312 0, /* tp_as_number */
4313 0, /* tp_as_sequence */
4314 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004315 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004316 0, /* tp_call */
4317 0, /* tp_str */
4318 PyObject_GenericGetAttr, /* tp_getattro */
4319 PyObject_GenericSetAttr, /* tp_setattro */
4320 0, /* tp_as_buffer */
4321 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4322 0, /* tp_doc */
4323 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4324 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4325 0, /* tp_richcompare */
4326 0, /* tp_weaklistoffset */
4327 0, /* tp_iter */
4328 0, /* tp_iternext */
4329 picklerproxy_methods, /* tp_methods */
4330};
4331
4332static PyObject *
4333PicklerMemoProxy_New(PicklerObject *pickler)
4334{
4335 PicklerMemoProxyObject *self;
4336
4337 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4338 if (self == NULL)
4339 return NULL;
4340 Py_INCREF(pickler);
4341 self->pickler = pickler;
4342 PyObject_GC_Track(self);
4343 return (PyObject *)self;
4344}
4345
4346/*****************************************************************************/
4347
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004348static PyObject *
4349Pickler_get_memo(PicklerObject *self)
4350{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004351 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004352}
4353
4354static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004355Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004356{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004357 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004358
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004359 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004360 PyErr_SetString(PyExc_TypeError,
4361 "attribute deletion is not supported");
4362 return -1;
4363 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004364
4365 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4366 PicklerObject *pickler =
4367 ((PicklerMemoProxyObject *)obj)->pickler;
4368
4369 new_memo = PyMemoTable_Copy(pickler->memo);
4370 if (new_memo == NULL)
4371 return -1;
4372 }
4373 else if (PyDict_Check(obj)) {
4374 Py_ssize_t i = 0;
4375 PyObject *key, *value;
4376
4377 new_memo = PyMemoTable_New();
4378 if (new_memo == NULL)
4379 return -1;
4380
4381 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004382 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004383 PyObject *memo_obj;
4384
4385 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4386 PyErr_SetString(PyExc_TypeError,
4387 "'memo' values must be 2-item tuples");
4388 goto error;
4389 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004390 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004391 if (memo_id == -1 && PyErr_Occurred())
4392 goto error;
4393 memo_obj = PyTuple_GET_ITEM(value, 1);
4394 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4395 goto error;
4396 }
4397 }
4398 else {
4399 PyErr_Format(PyExc_TypeError,
4400 "'memo' attribute must be an PicklerMemoProxy object"
4401 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004402 return -1;
4403 }
4404
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004405 PyMemoTable_Del(self->memo);
4406 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004407
4408 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004409
4410 error:
4411 if (new_memo)
4412 PyMemoTable_Del(new_memo);
4413 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004414}
4415
4416static PyObject *
4417Pickler_get_persid(PicklerObject *self)
4418{
4419 if (self->pers_func == NULL)
4420 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4421 else
4422 Py_INCREF(self->pers_func);
4423 return self->pers_func;
4424}
4425
4426static int
4427Pickler_set_persid(PicklerObject *self, PyObject *value)
4428{
4429 PyObject *tmp;
4430
4431 if (value == NULL) {
4432 PyErr_SetString(PyExc_TypeError,
4433 "attribute deletion is not supported");
4434 return -1;
4435 }
4436 if (!PyCallable_Check(value)) {
4437 PyErr_SetString(PyExc_TypeError,
4438 "persistent_id must be a callable taking one argument");
4439 return -1;
4440 }
4441
4442 tmp = self->pers_func;
4443 Py_INCREF(value);
4444 self->pers_func = value;
4445 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4446
4447 return 0;
4448}
4449
4450static PyMemberDef Pickler_members[] = {
4451 {"bin", T_INT, offsetof(PicklerObject, bin)},
4452 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004453 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004454 {NULL}
4455};
4456
4457static PyGetSetDef Pickler_getsets[] = {
4458 {"memo", (getter)Pickler_get_memo,
4459 (setter)Pickler_set_memo},
4460 {"persistent_id", (getter)Pickler_get_persid,
4461 (setter)Pickler_set_persid},
4462 {NULL}
4463};
4464
4465static PyTypeObject Pickler_Type = {
4466 PyVarObject_HEAD_INIT(NULL, 0)
4467 "_pickle.Pickler" , /*tp_name*/
4468 sizeof(PicklerObject), /*tp_basicsize*/
4469 0, /*tp_itemsize*/
4470 (destructor)Pickler_dealloc, /*tp_dealloc*/
4471 0, /*tp_print*/
4472 0, /*tp_getattr*/
4473 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004474 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004475 0, /*tp_repr*/
4476 0, /*tp_as_number*/
4477 0, /*tp_as_sequence*/
4478 0, /*tp_as_mapping*/
4479 0, /*tp_hash*/
4480 0, /*tp_call*/
4481 0, /*tp_str*/
4482 0, /*tp_getattro*/
4483 0, /*tp_setattro*/
4484 0, /*tp_as_buffer*/
4485 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004486 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004487 (traverseproc)Pickler_traverse, /*tp_traverse*/
4488 (inquiry)Pickler_clear, /*tp_clear*/
4489 0, /*tp_richcompare*/
4490 0, /*tp_weaklistoffset*/
4491 0, /*tp_iter*/
4492 0, /*tp_iternext*/
4493 Pickler_methods, /*tp_methods*/
4494 Pickler_members, /*tp_members*/
4495 Pickler_getsets, /*tp_getset*/
4496 0, /*tp_base*/
4497 0, /*tp_dict*/
4498 0, /*tp_descr_get*/
4499 0, /*tp_descr_set*/
4500 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004501 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004502 PyType_GenericAlloc, /*tp_alloc*/
4503 PyType_GenericNew, /*tp_new*/
4504 PyObject_GC_Del, /*tp_free*/
4505 0, /*tp_is_gc*/
4506};
4507
Victor Stinner121aab42011-09-29 23:40:53 +02004508/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004509
4510 XXX: It would be nice to able to avoid Python function call overhead, by
4511 using directly the C version of find_class(), when find_class() is not
4512 overridden by a subclass. Although, this could become rather hackish. A
4513 simpler optimization would be to call the C function when self is not a
4514 subclass instance. */
4515static PyObject *
4516find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4517{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004518 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004519
4520 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4521 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004522}
4523
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004524static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004525marker(UnpicklerObject *self)
4526{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004527 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004528 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004529 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004530 return -1;
4531 }
4532
4533 return self->marks[--self->num_marks];
4534}
4535
4536static int
4537load_none(UnpicklerObject *self)
4538{
4539 PDATA_APPEND(self->stack, Py_None, -1);
4540 return 0;
4541}
4542
4543static int
4544bad_readline(void)
4545{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004546 PickleState *st = _Pickle_GetGlobalState();
4547 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004548 return -1;
4549}
4550
4551static int
4552load_int(UnpicklerObject *self)
4553{
4554 PyObject *value;
4555 char *endptr, *s;
4556 Py_ssize_t len;
4557 long x;
4558
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004559 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004560 return -1;
4561 if (len < 2)
4562 return bad_readline();
4563
4564 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004565 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004566 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004567 x = strtol(s, &endptr, 0);
4568
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004569 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004570 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004571 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004572 errno = 0;
4573 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004574 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004575 if (value == NULL) {
4576 PyErr_SetString(PyExc_ValueError,
4577 "could not convert string to int");
4578 return -1;
4579 }
4580 }
4581 else {
4582 if (len == 3 && (x == 0 || x == 1)) {
4583 if ((value = PyBool_FromLong(x)) == NULL)
4584 return -1;
4585 }
4586 else {
4587 if ((value = PyLong_FromLong(x)) == NULL)
4588 return -1;
4589 }
4590 }
4591
4592 PDATA_PUSH(self->stack, value, -1);
4593 return 0;
4594}
4595
4596static int
4597load_bool(UnpicklerObject *self, PyObject *boolean)
4598{
4599 assert(boolean == Py_True || boolean == Py_False);
4600 PDATA_APPEND(self->stack, boolean, -1);
4601 return 0;
4602}
4603
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004604/* s contains x bytes of an unsigned little-endian integer. Return its value
4605 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4606 */
4607static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004608calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004609{
4610 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004611 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004612 size_t x = 0;
4613
Serhiy Storchakae0606192015-09-29 22:10:07 +03004614 if (nbytes > (int)sizeof(size_t)) {
4615 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
4616 * have 64-bit size that can't be represented on 32-bit platform.
4617 */
4618 for (i = (int)sizeof(size_t); i < nbytes; i++) {
4619 if (s[i])
4620 return -1;
4621 }
4622 nbytes = (int)sizeof(size_t);
4623 }
4624 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004625 x |= (size_t) s[i] << (8 * i);
4626 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004627
4628 if (x > PY_SSIZE_T_MAX)
4629 return -1;
4630 else
4631 return (Py_ssize_t) x;
4632}
4633
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004634/* s contains x bytes of a little-endian integer. Return its value as a
4635 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03004636 * int, but when x is 4 it's a signed one. This is a historical source
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004637 * of x-platform bugs.
4638 */
4639static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004640calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004641{
4642 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004643 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004644 long x = 0;
4645
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004646 for (i = 0; i < nbytes; i++) {
4647 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004648 }
4649
4650 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4651 * is signed, so on a box with longs bigger than 4 bytes we need
4652 * to extend a BININT's sign bit to the full width.
4653 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004654 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004655 x |= -(x & (1L << 31));
4656 }
4657
4658 return x;
4659}
4660
4661static int
4662load_binintx(UnpicklerObject *self, char *s, int size)
4663{
4664 PyObject *value;
4665 long x;
4666
4667 x = calc_binint(s, size);
4668
4669 if ((value = PyLong_FromLong(x)) == NULL)
4670 return -1;
4671
4672 PDATA_PUSH(self->stack, value, -1);
4673 return 0;
4674}
4675
4676static int
4677load_binint(UnpicklerObject *self)
4678{
4679 char *s;
4680
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004681 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004682 return -1;
4683
4684 return load_binintx(self, s, 4);
4685}
4686
4687static int
4688load_binint1(UnpicklerObject *self)
4689{
4690 char *s;
4691
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004692 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004693 return -1;
4694
4695 return load_binintx(self, s, 1);
4696}
4697
4698static int
4699load_binint2(UnpicklerObject *self)
4700{
4701 char *s;
4702
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004703 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004704 return -1;
4705
4706 return load_binintx(self, s, 2);
4707}
4708
4709static int
4710load_long(UnpicklerObject *self)
4711{
4712 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004713 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004714 Py_ssize_t len;
4715
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004716 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004717 return -1;
4718 if (len < 2)
4719 return bad_readline();
4720
Mark Dickinson8dd05142009-01-20 20:43:58 +00004721 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4722 the 'L' before calling PyLong_FromString. In order to maintain
4723 compatibility with Python 3.0.0, we don't actually *require*
4724 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004725 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004726 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004727 /* XXX: Should the base argument explicitly set to 10? */
4728 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004729 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004730 return -1;
4731
4732 PDATA_PUSH(self->stack, value, -1);
4733 return 0;
4734}
4735
4736/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4737 * data following.
4738 */
4739static int
4740load_counted_long(UnpicklerObject *self, int size)
4741{
4742 PyObject *value;
4743 char *nbytes;
4744 char *pdata;
4745
4746 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004747 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004748 return -1;
4749
4750 size = calc_binint(nbytes, size);
4751 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004752 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004753 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004754 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004755 "LONG pickle has negative byte count");
4756 return -1;
4757 }
4758
4759 if (size == 0)
4760 value = PyLong_FromLong(0L);
4761 else {
4762 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004763 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004764 return -1;
4765 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4766 1 /* little endian */ , 1 /* signed */ );
4767 }
4768 if (value == NULL)
4769 return -1;
4770 PDATA_PUSH(self->stack, value, -1);
4771 return 0;
4772}
4773
4774static int
4775load_float(UnpicklerObject *self)
4776{
4777 PyObject *value;
4778 char *endptr, *s;
4779 Py_ssize_t len;
4780 double d;
4781
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004782 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004783 return -1;
4784 if (len < 2)
4785 return bad_readline();
4786
4787 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004788 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4789 if (d == -1.0 && PyErr_Occurred())
4790 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004791 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004792 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4793 return -1;
4794 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004795 value = PyFloat_FromDouble(d);
4796 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004797 return -1;
4798
4799 PDATA_PUSH(self->stack, value, -1);
4800 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004801}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004802
4803static int
4804load_binfloat(UnpicklerObject *self)
4805{
4806 PyObject *value;
4807 double x;
4808 char *s;
4809
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004810 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004811 return -1;
4812
4813 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4814 if (x == -1.0 && PyErr_Occurred())
4815 return -1;
4816
4817 if ((value = PyFloat_FromDouble(x)) == NULL)
4818 return -1;
4819
4820 PDATA_PUSH(self->stack, value, -1);
4821 return 0;
4822}
4823
4824static int
4825load_string(UnpicklerObject *self)
4826{
4827 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004828 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004829 Py_ssize_t len;
4830 char *s, *p;
4831
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004832 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004833 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004834 /* Strip the newline */
4835 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004836 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004837 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004838 p = s + 1;
4839 len -= 2;
4840 }
4841 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004842 PickleState *st = _Pickle_GetGlobalState();
4843 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004844 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004845 return -1;
4846 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004847 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004848
4849 /* Use the PyBytes API to decode the string, since that is what is used
4850 to encode, and then coerce the result to Unicode. */
4851 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004852 if (bytes == NULL)
4853 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004854
4855 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4856 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4857 if (strcmp(self->encoding, "bytes") == 0) {
4858 obj = bytes;
4859 }
4860 else {
4861 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4862 Py_DECREF(bytes);
4863 if (obj == NULL) {
4864 return -1;
4865 }
4866 }
4867
4868 PDATA_PUSH(self->stack, obj, -1);
4869 return 0;
4870}
4871
4872static int
4873load_counted_binstring(UnpicklerObject *self, int nbytes)
4874{
4875 PyObject *obj;
4876 Py_ssize_t size;
4877 char *s;
4878
4879 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004880 return -1;
4881
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004882 size = calc_binsize(s, nbytes);
4883 if (size < 0) {
4884 PickleState *st = _Pickle_GetGlobalState();
4885 PyErr_Format(st->UnpicklingError,
4886 "BINSTRING exceeds system's maximum size of %zd bytes",
4887 PY_SSIZE_T_MAX);
4888 return -1;
4889 }
4890
4891 if (_Unpickler_Read(self, &s, size) < 0)
4892 return -1;
4893
4894 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4895 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4896 if (strcmp(self->encoding, "bytes") == 0) {
4897 obj = PyBytes_FromStringAndSize(s, size);
4898 }
4899 else {
4900 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4901 }
4902 if (obj == NULL) {
4903 return -1;
4904 }
4905
4906 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004907 return 0;
4908}
4909
4910static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004911load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004912{
4913 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004914 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004915 char *s;
4916
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004917 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004918 return -1;
4919
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004920 size = calc_binsize(s, nbytes);
4921 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004922 PyErr_Format(PyExc_OverflowError,
4923 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004924 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004925 return -1;
4926 }
4927
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004928 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004929 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004930
4931 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004932 if (bytes == NULL)
4933 return -1;
4934
4935 PDATA_PUSH(self->stack, bytes, -1);
4936 return 0;
4937}
4938
4939static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004940load_unicode(UnpicklerObject *self)
4941{
4942 PyObject *str;
4943 Py_ssize_t len;
4944 char *s;
4945
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004946 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004947 return -1;
4948 if (len < 1)
4949 return bad_readline();
4950
4951 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4952 if (str == NULL)
4953 return -1;
4954
4955 PDATA_PUSH(self->stack, str, -1);
4956 return 0;
4957}
4958
4959static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004960load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004961{
4962 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004963 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004964 char *s;
4965
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004966 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004967 return -1;
4968
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004969 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004970 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004971 PyErr_Format(PyExc_OverflowError,
4972 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004973 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004974 return -1;
4975 }
4976
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004977 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004978 return -1;
4979
Victor Stinner485fb562010-04-13 11:07:24 +00004980 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004981 if (str == NULL)
4982 return -1;
4983
4984 PDATA_PUSH(self->stack, str, -1);
4985 return 0;
4986}
4987
4988static int
Victor Stinner13f0c612016-03-14 18:09:39 +01004989load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004990{
4991 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004992
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02004993 if (Py_SIZE(self->stack) < len)
4994 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004995
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02004996 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004997 if (tuple == NULL)
4998 return -1;
4999 PDATA_PUSH(self->stack, tuple, -1);
5000 return 0;
5001}
5002
5003static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005004load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005005{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005006 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005007
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005008 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005009 return -1;
5010
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005011 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005012}
5013
5014static int
5015load_empty_list(UnpicklerObject *self)
5016{
5017 PyObject *list;
5018
5019 if ((list = PyList_New(0)) == NULL)
5020 return -1;
5021 PDATA_PUSH(self->stack, list, -1);
5022 return 0;
5023}
5024
5025static int
5026load_empty_dict(UnpicklerObject *self)
5027{
5028 PyObject *dict;
5029
5030 if ((dict = PyDict_New()) == NULL)
5031 return -1;
5032 PDATA_PUSH(self->stack, dict, -1);
5033 return 0;
5034}
5035
5036static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005037load_empty_set(UnpicklerObject *self)
5038{
5039 PyObject *set;
5040
5041 if ((set = PySet_New(NULL)) == NULL)
5042 return -1;
5043 PDATA_PUSH(self->stack, set, -1);
5044 return 0;
5045}
5046
5047static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005048load_list(UnpicklerObject *self)
5049{
5050 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005051 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005052
5053 if ((i = marker(self)) < 0)
5054 return -1;
5055
5056 list = Pdata_poplist(self->stack, i);
5057 if (list == NULL)
5058 return -1;
5059 PDATA_PUSH(self->stack, list, -1);
5060 return 0;
5061}
5062
5063static int
5064load_dict(UnpicklerObject *self)
5065{
5066 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005067 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005068
5069 if ((i = marker(self)) < 0)
5070 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005071 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005072
5073 if ((dict = PyDict_New()) == NULL)
5074 return -1;
5075
5076 for (k = i + 1; k < j; k += 2) {
5077 key = self->stack->data[k - 1];
5078 value = self->stack->data[k];
5079 if (PyDict_SetItem(dict, key, value) < 0) {
5080 Py_DECREF(dict);
5081 return -1;
5082 }
5083 }
5084 Pdata_clear(self->stack, i);
5085 PDATA_PUSH(self->stack, dict, -1);
5086 return 0;
5087}
5088
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005089static int
5090load_frozenset(UnpicklerObject *self)
5091{
5092 PyObject *items;
5093 PyObject *frozenset;
5094 Py_ssize_t i;
5095
5096 if ((i = marker(self)) < 0)
5097 return -1;
5098
5099 items = Pdata_poptuple(self->stack, i);
5100 if (items == NULL)
5101 return -1;
5102
5103 frozenset = PyFrozenSet_New(items);
5104 Py_DECREF(items);
5105 if (frozenset == NULL)
5106 return -1;
5107
5108 PDATA_PUSH(self->stack, frozenset, -1);
5109 return 0;
5110}
5111
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005112static PyObject *
5113instantiate(PyObject *cls, PyObject *args)
5114{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005115 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005116 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005117 /* Caller must assure args are a tuple. Normally, args come from
5118 Pdata_poptuple which packs objects from the top of the stack
5119 into a newly created tuple. */
5120 assert(PyTuple_Check(args));
5121 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005122 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005123 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005124 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005125 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005126 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005127
5128 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005129 }
5130 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005131}
5132
5133static int
5134load_obj(UnpicklerObject *self)
5135{
5136 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005137 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005138
5139 if ((i = marker(self)) < 0)
5140 return -1;
5141
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005142 if (Py_SIZE(self->stack) - i < 1)
5143 return stack_underflow();
5144
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005145 args = Pdata_poptuple(self->stack, i + 1);
5146 if (args == NULL)
5147 return -1;
5148
5149 PDATA_POP(self->stack, cls);
5150 if (cls) {
5151 obj = instantiate(cls, args);
5152 Py_DECREF(cls);
5153 }
5154 Py_DECREF(args);
5155 if (obj == NULL)
5156 return -1;
5157
5158 PDATA_PUSH(self->stack, obj, -1);
5159 return 0;
5160}
5161
5162static int
5163load_inst(UnpicklerObject *self)
5164{
5165 PyObject *cls = NULL;
5166 PyObject *args = NULL;
5167 PyObject *obj = NULL;
5168 PyObject *module_name;
5169 PyObject *class_name;
5170 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005171 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005172 char *s;
5173
5174 if ((i = marker(self)) < 0)
5175 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005176 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005177 return -1;
5178 if (len < 2)
5179 return bad_readline();
5180
5181 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5182 identifiers are permitted in Python 3.0, since the INST opcode is only
5183 supported by older protocols on Python 2.x. */
5184 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5185 if (module_name == NULL)
5186 return -1;
5187
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005188 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005189 if (len < 2) {
5190 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005191 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005192 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005193 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005194 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005195 cls = find_class(self, module_name, class_name);
5196 Py_DECREF(class_name);
5197 }
5198 }
5199 Py_DECREF(module_name);
5200
5201 if (cls == NULL)
5202 return -1;
5203
5204 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5205 obj = instantiate(cls, args);
5206 Py_DECREF(args);
5207 }
5208 Py_DECREF(cls);
5209
5210 if (obj == NULL)
5211 return -1;
5212
5213 PDATA_PUSH(self->stack, obj, -1);
5214 return 0;
5215}
5216
5217static int
5218load_newobj(UnpicklerObject *self)
5219{
5220 PyObject *args = NULL;
5221 PyObject *clsraw = NULL;
5222 PyTypeObject *cls; /* clsraw cast to its true type */
5223 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005224 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005225
5226 /* Stack is ... cls argtuple, and we want to call
5227 * cls.__new__(cls, *argtuple).
5228 */
5229 PDATA_POP(self->stack, args);
5230 if (args == NULL)
5231 goto error;
5232 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005233 PyErr_SetString(st->UnpicklingError,
5234 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005235 goto error;
5236 }
5237
5238 PDATA_POP(self->stack, clsraw);
5239 cls = (PyTypeObject *)clsraw;
5240 if (cls == NULL)
5241 goto error;
5242 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005243 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005244 "isn't a type object");
5245 goto error;
5246 }
5247 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005248 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005249 "has NULL tp_new");
5250 goto error;
5251 }
5252
5253 /* Call __new__. */
5254 obj = cls->tp_new(cls, args, NULL);
5255 if (obj == NULL)
5256 goto error;
5257
5258 Py_DECREF(args);
5259 Py_DECREF(clsraw);
5260 PDATA_PUSH(self->stack, obj, -1);
5261 return 0;
5262
5263 error:
5264 Py_XDECREF(args);
5265 Py_XDECREF(clsraw);
5266 return -1;
5267}
5268
5269static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005270load_newobj_ex(UnpicklerObject *self)
5271{
5272 PyObject *cls, *args, *kwargs;
5273 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005274 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005275
5276 PDATA_POP(self->stack, kwargs);
5277 if (kwargs == NULL) {
5278 return -1;
5279 }
5280 PDATA_POP(self->stack, args);
5281 if (args == NULL) {
5282 Py_DECREF(kwargs);
5283 return -1;
5284 }
5285 PDATA_POP(self->stack, cls);
5286 if (cls == NULL) {
5287 Py_DECREF(kwargs);
5288 Py_DECREF(args);
5289 return -1;
5290 }
Larry Hastings61272b72014-01-07 12:41:53 -08005291
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005292 if (!PyType_Check(cls)) {
5293 Py_DECREF(kwargs);
5294 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005295 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005296 "NEWOBJ_EX class argument must be a type, not %.200s",
5297 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005298 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005299 return -1;
5300 }
5301
5302 if (((PyTypeObject *)cls)->tp_new == NULL) {
5303 Py_DECREF(kwargs);
5304 Py_DECREF(args);
5305 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005306 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005307 "NEWOBJ_EX class argument doesn't have __new__");
5308 return -1;
5309 }
5310 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5311 Py_DECREF(kwargs);
5312 Py_DECREF(args);
5313 Py_DECREF(cls);
5314 if (obj == NULL) {
5315 return -1;
5316 }
5317 PDATA_PUSH(self->stack, obj, -1);
5318 return 0;
5319}
5320
5321static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005322load_global(UnpicklerObject *self)
5323{
5324 PyObject *global = NULL;
5325 PyObject *module_name;
5326 PyObject *global_name;
5327 Py_ssize_t len;
5328 char *s;
5329
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005330 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005331 return -1;
5332 if (len < 2)
5333 return bad_readline();
5334 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5335 if (!module_name)
5336 return -1;
5337
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005338 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005339 if (len < 2) {
5340 Py_DECREF(module_name);
5341 return bad_readline();
5342 }
5343 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5344 if (global_name) {
5345 global = find_class(self, module_name, global_name);
5346 Py_DECREF(global_name);
5347 }
5348 }
5349 Py_DECREF(module_name);
5350
5351 if (global == NULL)
5352 return -1;
5353 PDATA_PUSH(self->stack, global, -1);
5354 return 0;
5355}
5356
5357static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005358load_stack_global(UnpicklerObject *self)
5359{
5360 PyObject *global;
5361 PyObject *module_name;
5362 PyObject *global_name;
5363
5364 PDATA_POP(self->stack, global_name);
5365 PDATA_POP(self->stack, module_name);
5366 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5367 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005368 PickleState *st = _Pickle_GetGlobalState();
5369 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005370 Py_XDECREF(global_name);
5371 Py_XDECREF(module_name);
5372 return -1;
5373 }
5374 global = find_class(self, module_name, global_name);
5375 Py_DECREF(global_name);
5376 Py_DECREF(module_name);
5377 if (global == NULL)
5378 return -1;
5379 PDATA_PUSH(self->stack, global, -1);
5380 return 0;
5381}
5382
5383static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005384load_persid(UnpicklerObject *self)
5385{
5386 PyObject *pid;
5387 Py_ssize_t len;
5388 char *s;
5389
5390 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005391 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005392 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005393 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005394 return bad_readline();
5395
Serhiy Storchakadec25af2016-07-17 11:24:17 +03005396 pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
5397 if (pid == NULL) {
5398 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
5399 PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
5400 "persistent IDs in protocol 0 must be "
5401 "ASCII strings");
5402 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005403 return -1;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03005404 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005405
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005406 /* This does not leak since _Pickle_FastCall() steals the reference
5407 to pid first. */
5408 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005409 if (pid == NULL)
5410 return -1;
5411
5412 PDATA_PUSH(self->stack, pid, -1);
5413 return 0;
5414 }
5415 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005416 PickleState *st = _Pickle_GetGlobalState();
5417 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005418 "A load persistent id instruction was encountered,\n"
5419 "but no persistent_load function was specified.");
5420 return -1;
5421 }
5422}
5423
5424static int
5425load_binpersid(UnpicklerObject *self)
5426{
5427 PyObject *pid;
5428
5429 if (self->pers_func) {
5430 PDATA_POP(self->stack, pid);
5431 if (pid == NULL)
5432 return -1;
5433
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005434 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005435 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005436 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005437 if (pid == NULL)
5438 return -1;
5439
5440 PDATA_PUSH(self->stack, pid, -1);
5441 return 0;
5442 }
5443 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005444 PickleState *st = _Pickle_GetGlobalState();
5445 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005446 "A load persistent id instruction was encountered,\n"
5447 "but no persistent_load function was specified.");
5448 return -1;
5449 }
5450}
5451
5452static int
5453load_pop(UnpicklerObject *self)
5454{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005455 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005456
5457 /* Note that we split the (pickle.py) stack into two stacks,
5458 * an object stack and a mark stack. We have to be clever and
5459 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005460 * mark stack first, and only signalling a stack underflow if
5461 * the object stack is empty and the mark stack doesn't match
5462 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005463 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005464 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005465 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005466 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005467 len--;
5468 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005469 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005470 } else {
5471 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005472 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005473 return 0;
5474}
5475
5476static int
5477load_pop_mark(UnpicklerObject *self)
5478{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005479 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005480
5481 if ((i = marker(self)) < 0)
5482 return -1;
5483
5484 Pdata_clear(self->stack, i);
5485
5486 return 0;
5487}
5488
5489static int
5490load_dup(UnpicklerObject *self)
5491{
5492 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005493 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005494
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005495 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005496 return stack_underflow();
5497 last = self->stack->data[len - 1];
5498 PDATA_APPEND(self->stack, last, -1);
5499 return 0;
5500}
5501
5502static int
5503load_get(UnpicklerObject *self)
5504{
5505 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005506 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005507 Py_ssize_t len;
5508 char *s;
5509
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005510 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005511 return -1;
5512 if (len < 2)
5513 return bad_readline();
5514
5515 key = PyLong_FromString(s, NULL, 10);
5516 if (key == NULL)
5517 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005518 idx = PyLong_AsSsize_t(key);
5519 if (idx == -1 && PyErr_Occurred()) {
5520 Py_DECREF(key);
5521 return -1;
5522 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005523
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005524 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005525 if (value == NULL) {
5526 if (!PyErr_Occurred())
5527 PyErr_SetObject(PyExc_KeyError, key);
5528 Py_DECREF(key);
5529 return -1;
5530 }
5531 Py_DECREF(key);
5532
5533 PDATA_APPEND(self->stack, value, -1);
5534 return 0;
5535}
5536
5537static int
5538load_binget(UnpicklerObject *self)
5539{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005540 PyObject *value;
5541 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005542 char *s;
5543
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005544 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005545 return -1;
5546
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005547 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005548
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005549 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005550 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005551 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005552 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005553 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005554 Py_DECREF(key);
5555 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005556 return -1;
5557 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005558
5559 PDATA_APPEND(self->stack, value, -1);
5560 return 0;
5561}
5562
5563static int
5564load_long_binget(UnpicklerObject *self)
5565{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005566 PyObject *value;
5567 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005568 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005569
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005570 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005571 return -1;
5572
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005573 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005574
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005575 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005576 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005577 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005578 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005579 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005580 Py_DECREF(key);
5581 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005582 return -1;
5583 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005584
5585 PDATA_APPEND(self->stack, value, -1);
5586 return 0;
5587}
5588
5589/* Push an object from the extension registry (EXT[124]). nbytes is
5590 * the number of bytes following the opcode, holding the index (code) value.
5591 */
5592static int
5593load_extension(UnpicklerObject *self, int nbytes)
5594{
5595 char *codebytes; /* the nbytes bytes after the opcode */
5596 long code; /* calc_binint returns long */
5597 PyObject *py_code; /* code as a Python int */
5598 PyObject *obj; /* the object to push */
5599 PyObject *pair; /* (module_name, class_name) */
5600 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005601 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005602
5603 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005604 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005605 return -1;
5606 code = calc_binint(codebytes, nbytes);
5607 if (code <= 0) { /* note that 0 is forbidden */
5608 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005609 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005610 return -1;
5611 }
5612
5613 /* Look for the code in the cache. */
5614 py_code = PyLong_FromLong(code);
5615 if (py_code == NULL)
5616 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005617 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005618 if (obj != NULL) {
5619 /* Bingo. */
5620 Py_DECREF(py_code);
5621 PDATA_APPEND(self->stack, obj, -1);
5622 return 0;
5623 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005624 if (PyErr_Occurred()) {
5625 Py_DECREF(py_code);
5626 return -1;
5627 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005628
5629 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005630 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005631 if (pair == NULL) {
5632 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005633 if (!PyErr_Occurred()) {
5634 PyErr_Format(PyExc_ValueError, "unregistered extension "
5635 "code %ld", code);
5636 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005637 return -1;
5638 }
5639 /* Since the extension registry is manipulable via Python code,
5640 * confirm that pair is really a 2-tuple of strings.
5641 */
5642 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5643 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5644 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5645 Py_DECREF(py_code);
5646 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5647 "isn't a 2-tuple of strings", code);
5648 return -1;
5649 }
5650 /* Load the object. */
5651 obj = find_class(self, module_name, class_name);
5652 if (obj == NULL) {
5653 Py_DECREF(py_code);
5654 return -1;
5655 }
5656 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005657 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005658 Py_DECREF(py_code);
5659 if (code < 0) {
5660 Py_DECREF(obj);
5661 return -1;
5662 }
5663 PDATA_PUSH(self->stack, obj, -1);
5664 return 0;
5665}
5666
5667static int
5668load_put(UnpicklerObject *self)
5669{
5670 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005671 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005672 Py_ssize_t len;
5673 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005675 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005676 return -1;
5677 if (len < 2)
5678 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005679 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005680 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005681 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005682
5683 key = PyLong_FromString(s, NULL, 10);
5684 if (key == NULL)
5685 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005686 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005687 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005688 if (idx < 0) {
5689 if (!PyErr_Occurred())
5690 PyErr_SetString(PyExc_ValueError,
5691 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005692 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005693 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005694
5695 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005696}
5697
5698static int
5699load_binput(UnpicklerObject *self)
5700{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005701 PyObject *value;
5702 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005703 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005704
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005705 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005706 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005707
5708 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005709 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005710 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005711
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005712 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005713
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005714 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005715}
5716
5717static int
5718load_long_binput(UnpicklerObject *self)
5719{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005720 PyObject *value;
5721 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005722 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005723
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005724 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005725 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005726
5727 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005728 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005729 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005730
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005731 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005732 if (idx < 0) {
5733 PyErr_SetString(PyExc_ValueError,
5734 "negative LONG_BINPUT argument");
5735 return -1;
5736 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005737
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005738 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005739}
5740
5741static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005742load_memoize(UnpicklerObject *self)
5743{
5744 PyObject *value;
5745
5746 if (Py_SIZE(self->stack) <= 0)
5747 return stack_underflow();
5748 value = self->stack->data[Py_SIZE(self->stack) - 1];
5749
5750 return _Unpickler_MemoPut(self, self->memo_len, value);
5751}
5752
5753static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005754do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005755{
5756 PyObject *value;
5757 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005758 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005759
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005760 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005761 if (x > len || x <= 0)
5762 return stack_underflow();
5763 if (len == x) /* nothing to do */
5764 return 0;
5765
5766 list = self->stack->data[x - 1];
5767
5768 if (PyList_Check(list)) {
5769 PyObject *slice;
5770 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005771 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005772
5773 slice = Pdata_poplist(self->stack, x);
5774 if (!slice)
5775 return -1;
5776 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005777 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005778 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005779 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005780 }
5781 else {
5782 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005783 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005784
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005785 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005786 if (append_func == NULL)
5787 return -1;
5788 for (i = x; i < len; i++) {
5789 PyObject *result;
5790
5791 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005792 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005793 if (result == NULL) {
5794 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005795 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005796 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005797 return -1;
5798 }
5799 Py_DECREF(result);
5800 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005801 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005802 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005803 }
5804
5805 return 0;
5806}
5807
5808static int
5809load_append(UnpicklerObject *self)
5810{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005811 if (Py_SIZE(self->stack) - 1 <= 0)
5812 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005813 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005814}
5815
5816static int
5817load_appends(UnpicklerObject *self)
5818{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005819 Py_ssize_t i = marker(self);
5820 if (i < 0)
5821 return -1;
5822 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005823}
5824
5825static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005826do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005827{
5828 PyObject *value, *key;
5829 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005830 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005831 int status = 0;
5832
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005833 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005834 if (x > len || x <= 0)
5835 return stack_underflow();
5836 if (len == x) /* nothing to do */
5837 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005838 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005839 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005840 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005841 PyErr_SetString(st->UnpicklingError,
5842 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005843 return -1;
5844 }
5845
5846 /* Here, dict does not actually need to be a PyDict; it could be anything
5847 that supports the __setitem__ attribute. */
5848 dict = self->stack->data[x - 1];
5849
5850 for (i = x + 1; i < len; i += 2) {
5851 key = self->stack->data[i - 1];
5852 value = self->stack->data[i];
5853 if (PyObject_SetItem(dict, key, value) < 0) {
5854 status = -1;
5855 break;
5856 }
5857 }
5858
5859 Pdata_clear(self->stack, x);
5860 return status;
5861}
5862
5863static int
5864load_setitem(UnpicklerObject *self)
5865{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005866 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005867}
5868
5869static int
5870load_setitems(UnpicklerObject *self)
5871{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005872 Py_ssize_t i = marker(self);
5873 if (i < 0)
5874 return -1;
5875 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005876}
5877
5878static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005879load_additems(UnpicklerObject *self)
5880{
5881 PyObject *set;
5882 Py_ssize_t mark, len, i;
5883
5884 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005885 if (mark < 0)
5886 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005887 len = Py_SIZE(self->stack);
5888 if (mark > len || mark <= 0)
5889 return stack_underflow();
5890 if (len == mark) /* nothing to do */
5891 return 0;
5892
5893 set = self->stack->data[mark - 1];
5894
5895 if (PySet_Check(set)) {
5896 PyObject *items;
5897 int status;
5898
5899 items = Pdata_poptuple(self->stack, mark);
5900 if (items == NULL)
5901 return -1;
5902
5903 status = _PySet_Update(set, items);
5904 Py_DECREF(items);
5905 return status;
5906 }
5907 else {
5908 PyObject *add_func;
5909 _Py_IDENTIFIER(add);
5910
5911 add_func = _PyObject_GetAttrId(set, &PyId_add);
5912 if (add_func == NULL)
5913 return -1;
5914 for (i = mark; i < len; i++) {
5915 PyObject *result;
5916 PyObject *item;
5917
5918 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005919 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005920 if (result == NULL) {
5921 Pdata_clear(self->stack, i + 1);
5922 Py_SIZE(self->stack) = mark;
5923 return -1;
5924 }
5925 Py_DECREF(result);
5926 }
5927 Py_SIZE(self->stack) = mark;
5928 }
5929
5930 return 0;
5931}
5932
5933static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005934load_build(UnpicklerObject *self)
5935{
5936 PyObject *state, *inst, *slotstate;
5937 PyObject *setstate;
5938 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005939 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005940
5941 /* Stack is ... instance, state. We want to leave instance at
5942 * the stack top, possibly mutated via instance.__setstate__(state).
5943 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005944 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005945 return stack_underflow();
5946
5947 PDATA_POP(self->stack, state);
5948 if (state == NULL)
5949 return -1;
5950
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005951 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005952
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005953 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005954 if (setstate == NULL) {
5955 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5956 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005957 else {
5958 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005959 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005960 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005961 }
5962 else {
5963 PyObject *result;
5964
5965 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005966 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005967 Py_DECREF(setstate);
5968 if (result == NULL)
5969 return -1;
5970 Py_DECREF(result);
5971 return 0;
5972 }
5973
5974 /* A default __setstate__. First see whether state embeds a
5975 * slot state dict too (a proto 2 addition).
5976 */
5977 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5978 PyObject *tmp = state;
5979
5980 state = PyTuple_GET_ITEM(tmp, 0);
5981 slotstate = PyTuple_GET_ITEM(tmp, 1);
5982 Py_INCREF(state);
5983 Py_INCREF(slotstate);
5984 Py_DECREF(tmp);
5985 }
5986 else
5987 slotstate = NULL;
5988
5989 /* Set inst.__dict__ from the state dict (if any). */
5990 if (state != Py_None) {
5991 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005992 PyObject *d_key, *d_value;
5993 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005994 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005995
5996 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005997 PickleState *st = _Pickle_GetGlobalState();
5998 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005999 goto error;
6000 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006001 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006002 if (dict == NULL)
6003 goto error;
6004
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006005 i = 0;
6006 while (PyDict_Next(state, &i, &d_key, &d_value)) {
6007 /* normally the keys for instance attributes are
6008 interned. we should try to do that here. */
6009 Py_INCREF(d_key);
6010 if (PyUnicode_CheckExact(d_key))
6011 PyUnicode_InternInPlace(&d_key);
6012 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6013 Py_DECREF(d_key);
6014 goto error;
6015 }
6016 Py_DECREF(d_key);
6017 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006018 Py_DECREF(dict);
6019 }
6020
6021 /* Also set instance attributes from the slotstate dict (if any). */
6022 if (slotstate != NULL) {
6023 PyObject *d_key, *d_value;
6024 Py_ssize_t i;
6025
6026 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006027 PickleState *st = _Pickle_GetGlobalState();
6028 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006029 "slot state is not a dictionary");
6030 goto error;
6031 }
6032 i = 0;
6033 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6034 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6035 goto error;
6036 }
6037 }
6038
6039 if (0) {
6040 error:
6041 status = -1;
6042 }
6043
6044 Py_DECREF(state);
6045 Py_XDECREF(slotstate);
6046 return status;
6047}
6048
6049static int
6050load_mark(UnpicklerObject *self)
6051{
6052
6053 /* Note that we split the (pickle.py) stack into two stacks, an
6054 * object stack and a mark stack. Here we push a mark onto the
6055 * mark stack.
6056 */
6057
6058 if ((self->num_marks + 1) >= self->marks_size) {
6059 size_t alloc;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006060
6061 /* Use the size_t type to check for overflow. */
6062 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006063 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006064 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006065 PyErr_NoMemory();
6066 return -1;
6067 }
6068
6069 if (self->marks == NULL)
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006070 self->marks = PyMem_NEW(Py_ssize_t, alloc);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006071 else
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006072 PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
6073 if (self->marks == NULL) {
6074 self->marks_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006075 PyErr_NoMemory();
6076 return -1;
6077 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006078 self->marks_size = (Py_ssize_t)alloc;
6079 }
6080
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006081 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006082
6083 return 0;
6084}
6085
6086static int
6087load_reduce(UnpicklerObject *self)
6088{
6089 PyObject *callable = NULL;
6090 PyObject *argtup = NULL;
6091 PyObject *obj = NULL;
6092
6093 PDATA_POP(self->stack, argtup);
6094 if (argtup == NULL)
6095 return -1;
6096 PDATA_POP(self->stack, callable);
6097 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006098 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006099 Py_DECREF(callable);
6100 }
6101 Py_DECREF(argtup);
6102
6103 if (obj == NULL)
6104 return -1;
6105
6106 PDATA_PUSH(self->stack, obj, -1);
6107 return 0;
6108}
6109
6110/* Just raises an error if we don't know the protocol specified. PROTO
6111 * is the first opcode for protocols >= 2.
6112 */
6113static int
6114load_proto(UnpicklerObject *self)
6115{
6116 char *s;
6117 int i;
6118
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006119 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006120 return -1;
6121
6122 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006123 if (i <= HIGHEST_PROTOCOL) {
6124 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006125 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006126 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006127
6128 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6129 return -1;
6130}
6131
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006132static int
6133load_frame(UnpicklerObject *self)
6134{
6135 char *s;
6136 Py_ssize_t frame_len;
6137
6138 if (_Unpickler_Read(self, &s, 8) < 0)
6139 return -1;
6140
6141 frame_len = calc_binsize(s, 8);
6142 if (frame_len < 0) {
6143 PyErr_Format(PyExc_OverflowError,
6144 "FRAME length exceeds system's maximum of %zd bytes",
6145 PY_SSIZE_T_MAX);
6146 return -1;
6147 }
6148
6149 if (_Unpickler_Read(self, &s, frame_len) < 0)
6150 return -1;
6151
6152 /* Rewind to start of frame */
6153 self->next_read_idx -= frame_len;
6154 return 0;
6155}
6156
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006157static PyObject *
6158load(UnpicklerObject *self)
6159{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006160 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006161 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006162
6163 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006164 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006165 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006166 Pdata_clear(self->stack, 0);
6167
6168 /* Convenient macros for the dispatch while-switch loop just below. */
6169#define OP(opcode, load_func) \
6170 case opcode: if (load_func(self) < 0) break; continue;
6171
6172#define OP_ARG(opcode, load_func, arg) \
6173 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6174
6175 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006176 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006177 break;
6178
6179 switch ((enum opcode)s[0]) {
6180 OP(NONE, load_none)
6181 OP(BININT, load_binint)
6182 OP(BININT1, load_binint1)
6183 OP(BININT2, load_binint2)
6184 OP(INT, load_int)
6185 OP(LONG, load_long)
6186 OP_ARG(LONG1, load_counted_long, 1)
6187 OP_ARG(LONG4, load_counted_long, 4)
6188 OP(FLOAT, load_float)
6189 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006190 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6191 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6192 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6193 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6194 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006195 OP(STRING, load_string)
6196 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006197 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6198 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6199 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006200 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6201 OP_ARG(TUPLE1, load_counted_tuple, 1)
6202 OP_ARG(TUPLE2, load_counted_tuple, 2)
6203 OP_ARG(TUPLE3, load_counted_tuple, 3)
6204 OP(TUPLE, load_tuple)
6205 OP(EMPTY_LIST, load_empty_list)
6206 OP(LIST, load_list)
6207 OP(EMPTY_DICT, load_empty_dict)
6208 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006209 OP(EMPTY_SET, load_empty_set)
6210 OP(ADDITEMS, load_additems)
6211 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006212 OP(OBJ, load_obj)
6213 OP(INST, load_inst)
6214 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006215 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006216 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006217 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006218 OP(APPEND, load_append)
6219 OP(APPENDS, load_appends)
6220 OP(BUILD, load_build)
6221 OP(DUP, load_dup)
6222 OP(BINGET, load_binget)
6223 OP(LONG_BINGET, load_long_binget)
6224 OP(GET, load_get)
6225 OP(MARK, load_mark)
6226 OP(BINPUT, load_binput)
6227 OP(LONG_BINPUT, load_long_binput)
6228 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006229 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006230 OP(POP, load_pop)
6231 OP(POP_MARK, load_pop_mark)
6232 OP(SETITEM, load_setitem)
6233 OP(SETITEMS, load_setitems)
6234 OP(PERSID, load_persid)
6235 OP(BINPERSID, load_binpersid)
6236 OP(REDUCE, load_reduce)
6237 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006238 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006239 OP_ARG(EXT1, load_extension, 1)
6240 OP_ARG(EXT2, load_extension, 2)
6241 OP_ARG(EXT4, load_extension, 4)
6242 OP_ARG(NEWTRUE, load_bool, Py_True)
6243 OP_ARG(NEWFALSE, load_bool, Py_False)
6244
6245 case STOP:
6246 break;
6247
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006248 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006249 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006250 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006251 }
6252 else {
6253 PickleState *st = _Pickle_GetGlobalState();
6254 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006255 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006256 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006257 return NULL;
6258 }
6259
6260 break; /* and we are done! */
6261 }
6262
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006263 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006264 return NULL;
6265 }
6266
Victor Stinner2ae57e32013-10-31 13:39:23 +01006267 if (_Unpickler_SkipConsumed(self) < 0)
6268 return NULL;
6269
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006270 PDATA_POP(self->stack, value);
6271 return value;
6272}
6273
Larry Hastings61272b72014-01-07 12:41:53 -08006274/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006275
6276_pickle.Unpickler.load
6277
6278Load a pickle.
6279
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006280Read a pickled object representation from the open file object given
6281in the constructor, and return the reconstituted object hierarchy
6282specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006283[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006284
Larry Hastings3cceb382014-01-04 11:09:09 -08006285static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006286_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006287/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006288{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006289 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006290
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006291 /* Check whether the Unpickler was initialized correctly. This prevents
6292 segfaulting if a subclass overridden __init__ with a function that does
6293 not call Unpickler.__init__(). Here, we simply ensure that self->read
6294 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006295 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006296 PickleState *st = _Pickle_GetGlobalState();
6297 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006298 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006299 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006300 return NULL;
6301 }
6302
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006303 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006304}
6305
6306/* The name of find_class() is misleading. In newer pickle protocols, this
6307 function is used for loading any global (i.e., functions), not just
6308 classes. The name is kept only for backward compatibility. */
6309
Larry Hastings61272b72014-01-07 12:41:53 -08006310/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006311
6312_pickle.Unpickler.find_class
6313
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006314 module_name: object
6315 global_name: object
6316 /
6317
6318Return an object from a specified module.
6319
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006320If necessary, the module will be imported. Subclasses may override
6321this method (e.g. to restrict unpickling of arbitrary classes and
6322functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006323
6324This method is called whenever a class or a function object is
6325needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006326[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006327
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006328static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006329_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
6330 PyObject *module_name,
6331 PyObject *global_name)
6332/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006333{
6334 PyObject *global;
6335 PyObject *modules_dict;
6336 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006337 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006338
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006339 /* Try to map the old names used in Python 2.x to the new ones used in
6340 Python 3.x. We do this only with old pickle protocols and when the
6341 user has not disabled the feature. */
6342 if (self->proto < 3 && self->fix_imports) {
6343 PyObject *key;
6344 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006345 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006346
6347 /* Check if the global (i.e., a function or a class) was renamed
6348 or moved to another module. */
6349 key = PyTuple_Pack(2, module_name, global_name);
6350 if (key == NULL)
6351 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006352 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006353 Py_DECREF(key);
6354 if (item) {
6355 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6356 PyErr_Format(PyExc_RuntimeError,
6357 "_compat_pickle.NAME_MAPPING values should be "
6358 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6359 return NULL;
6360 }
6361 module_name = PyTuple_GET_ITEM(item, 0);
6362 global_name = PyTuple_GET_ITEM(item, 1);
6363 if (!PyUnicode_Check(module_name) ||
6364 !PyUnicode_Check(global_name)) {
6365 PyErr_Format(PyExc_RuntimeError,
6366 "_compat_pickle.NAME_MAPPING values should be "
6367 "pairs of str, not (%.200s, %.200s)",
6368 Py_TYPE(module_name)->tp_name,
6369 Py_TYPE(global_name)->tp_name);
6370 return NULL;
6371 }
6372 }
6373 else if (PyErr_Occurred()) {
6374 return NULL;
6375 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03006376 else {
6377 /* Check if the module was renamed. */
6378 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
6379 if (item) {
6380 if (!PyUnicode_Check(item)) {
6381 PyErr_Format(PyExc_RuntimeError,
6382 "_compat_pickle.IMPORT_MAPPING values should be "
6383 "strings, not %.200s", Py_TYPE(item)->tp_name);
6384 return NULL;
6385 }
6386 module_name = item;
6387 }
6388 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006389 return NULL;
6390 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006391 }
6392 }
6393
Victor Stinnerbb520202013-11-06 22:40:41 +01006394 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006395 if (modules_dict == NULL) {
6396 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006397 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006398 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006399
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006400 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006401 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006402 if (PyErr_Occurred())
6403 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006404 module = PyImport_Import(module_name);
6405 if (module == NULL)
6406 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006407 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006408 Py_DECREF(module);
6409 }
Victor Stinner121aab42011-09-29 23:40:53 +02006410 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006411 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006412 }
6413 return global;
6414}
6415
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006416/*[clinic input]
6417
6418_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6419
6420Returns size in memory, in bytes.
6421[clinic start generated code]*/
6422
6423static Py_ssize_t
6424_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6425/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6426{
6427 Py_ssize_t res;
6428
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02006429 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006430 if (self->memo != NULL)
6431 res += self->memo_size * sizeof(PyObject *);
6432 if (self->marks != NULL)
6433 res += self->marks_size * sizeof(Py_ssize_t);
6434 if (self->input_line != NULL)
6435 res += strlen(self->input_line) + 1;
6436 if (self->encoding != NULL)
6437 res += strlen(self->encoding) + 1;
6438 if (self->errors != NULL)
6439 res += strlen(self->errors) + 1;
6440 return res;
6441}
6442
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006443static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006444 _PICKLE_UNPICKLER_LOAD_METHODDEF
6445 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006446 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006447 {NULL, NULL} /* sentinel */
6448};
6449
6450static void
6451Unpickler_dealloc(UnpicklerObject *self)
6452{
6453 PyObject_GC_UnTrack((PyObject *)self);
6454 Py_XDECREF(self->readline);
6455 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006456 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006457 Py_XDECREF(self->stack);
6458 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006459 if (self->buffer.buf != NULL) {
6460 PyBuffer_Release(&self->buffer);
6461 self->buffer.buf = NULL;
6462 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006463
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006464 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006465 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006466 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006467 PyMem_Free(self->encoding);
6468 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006469
6470 Py_TYPE(self)->tp_free((PyObject *)self);
6471}
6472
6473static int
6474Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6475{
6476 Py_VISIT(self->readline);
6477 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006478 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006479 Py_VISIT(self->stack);
6480 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006481 return 0;
6482}
6483
6484static int
6485Unpickler_clear(UnpicklerObject *self)
6486{
6487 Py_CLEAR(self->readline);
6488 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006489 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006490 Py_CLEAR(self->stack);
6491 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006492 if (self->buffer.buf != NULL) {
6493 PyBuffer_Release(&self->buffer);
6494 self->buffer.buf = NULL;
6495 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006496
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006497 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006498 PyMem_Free(self->marks);
6499 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006500 PyMem_Free(self->input_line);
6501 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006502 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006503 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006504 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006505 self->errors = NULL;
6506
6507 return 0;
6508}
6509
Larry Hastings61272b72014-01-07 12:41:53 -08006510/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006511
6512_pickle.Unpickler.__init__
6513
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006514 file: object
6515 *
6516 fix_imports: bool = True
6517 encoding: str = 'ASCII'
6518 errors: str = 'strict'
6519
6520This takes a binary file for reading a pickle data stream.
6521
6522The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006523protocol argument is needed. Bytes past the pickled object's
6524representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006525
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006526The argument *file* must have two methods, a read() method that takes
6527an integer argument, and a readline() method that requires no
6528arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00006529binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006530other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006531
6532Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00006533which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006534generated by Python 2. If *fix_imports* is True, pickle will try to
6535map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006536*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006537instances pickled by Python 2; these default to 'ASCII' and 'strict',
6538respectively. The *encoding* can be 'bytes' to read these 8-bit
6539string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006540[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006541
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006542static int
Larry Hastings89964c42015-04-14 18:07:59 -04006543_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6544 int fix_imports, const char *encoding,
6545 const char *errors)
Martin Panter46f50722016-05-26 05:35:26 +00006546/*[clinic end generated code: output=e2c8ce748edc57b0 input=f9b7da04f5f4f335]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006547{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006548 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006549
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006550 /* In case of multiple __init__() calls, clear previous content. */
6551 if (self->read != NULL)
6552 (void)Unpickler_clear(self);
6553
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006554 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006555 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006556
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006557 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006558 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006559
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006560 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006561 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006562 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006563
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006564 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006565 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6566 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006567 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006568 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006569 }
6570 else {
6571 self->pers_func = NULL;
6572 }
6573
6574 self->stack = (Pdata *)Pdata_New();
6575 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006576 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006577
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006578 self->memo_size = 32;
6579 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006580 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006581 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006582
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006583 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006584
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006585 return 0;
6586}
6587
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006588
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006589/* Define a proxy object for the Unpickler's internal memo object. This is to
6590 * avoid breaking code like:
6591 * unpickler.memo.clear()
6592 * and
6593 * unpickler.memo = saved_memo
6594 * Is this a good idea? Not really, but we don't want to break code that uses
6595 * it. Note that we don't implement the entire mapping API here. This is
6596 * intentional, as these should be treated as black-box implementation details.
6597 *
6598 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006599 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006600 */
6601
Larry Hastings61272b72014-01-07 12:41:53 -08006602/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006603_pickle.UnpicklerMemoProxy.clear
6604
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006605Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006606[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006607
Larry Hastings3cceb382014-01-04 11:09:09 -08006608static PyObject *
6609_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006610/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006611{
6612 _Unpickler_MemoCleanup(self->unpickler);
6613 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6614 if (self->unpickler->memo == NULL)
6615 return NULL;
6616 Py_RETURN_NONE;
6617}
6618
Larry Hastings61272b72014-01-07 12:41:53 -08006619/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006620_pickle.UnpicklerMemoProxy.copy
6621
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006622Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006623[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006624
Larry Hastings3cceb382014-01-04 11:09:09 -08006625static PyObject *
6626_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006627/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006628{
6629 Py_ssize_t i;
6630 PyObject *new_memo = PyDict_New();
6631 if (new_memo == NULL)
6632 return NULL;
6633
6634 for (i = 0; i < self->unpickler->memo_size; i++) {
6635 int status;
6636 PyObject *key, *value;
6637
6638 value = self->unpickler->memo[i];
6639 if (value == NULL)
6640 continue;
6641
6642 key = PyLong_FromSsize_t(i);
6643 if (key == NULL)
6644 goto error;
6645 status = PyDict_SetItem(new_memo, key, value);
6646 Py_DECREF(key);
6647 if (status < 0)
6648 goto error;
6649 }
6650 return new_memo;
6651
6652error:
6653 Py_DECREF(new_memo);
6654 return NULL;
6655}
6656
Larry Hastings61272b72014-01-07 12:41:53 -08006657/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006658_pickle.UnpicklerMemoProxy.__reduce__
6659
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006660Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006661[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006662
Larry Hastings3cceb382014-01-04 11:09:09 -08006663static PyObject *
6664_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006665/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006666{
6667 PyObject *reduce_value;
6668 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006669 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006670 if (contents == NULL)
6671 return NULL;
6672
6673 reduce_value = PyTuple_New(2);
6674 if (reduce_value == NULL) {
6675 Py_DECREF(contents);
6676 return NULL;
6677 }
6678 constructor_args = PyTuple_New(1);
6679 if (constructor_args == NULL) {
6680 Py_DECREF(contents);
6681 Py_DECREF(reduce_value);
6682 return NULL;
6683 }
6684 PyTuple_SET_ITEM(constructor_args, 0, contents);
6685 Py_INCREF((PyObject *)&PyDict_Type);
6686 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6687 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6688 return reduce_value;
6689}
6690
6691static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006692 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6693 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6694 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006695 {NULL, NULL} /* sentinel */
6696};
6697
6698static void
6699UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6700{
6701 PyObject_GC_UnTrack(self);
6702 Py_XDECREF(self->unpickler);
6703 PyObject_GC_Del((PyObject *)self);
6704}
6705
6706static int
6707UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6708 visitproc visit, void *arg)
6709{
6710 Py_VISIT(self->unpickler);
6711 return 0;
6712}
6713
6714static int
6715UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6716{
6717 Py_CLEAR(self->unpickler);
6718 return 0;
6719}
6720
6721static PyTypeObject UnpicklerMemoProxyType = {
6722 PyVarObject_HEAD_INIT(NULL, 0)
6723 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6724 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6725 0,
6726 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6727 0, /* tp_print */
6728 0, /* tp_getattr */
6729 0, /* tp_setattr */
6730 0, /* tp_compare */
6731 0, /* tp_repr */
6732 0, /* tp_as_number */
6733 0, /* tp_as_sequence */
6734 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006735 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006736 0, /* tp_call */
6737 0, /* tp_str */
6738 PyObject_GenericGetAttr, /* tp_getattro */
6739 PyObject_GenericSetAttr, /* tp_setattro */
6740 0, /* tp_as_buffer */
6741 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6742 0, /* tp_doc */
6743 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6744 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6745 0, /* tp_richcompare */
6746 0, /* tp_weaklistoffset */
6747 0, /* tp_iter */
6748 0, /* tp_iternext */
6749 unpicklerproxy_methods, /* tp_methods */
6750};
6751
6752static PyObject *
6753UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6754{
6755 UnpicklerMemoProxyObject *self;
6756
6757 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6758 &UnpicklerMemoProxyType);
6759 if (self == NULL)
6760 return NULL;
6761 Py_INCREF(unpickler);
6762 self->unpickler = unpickler;
6763 PyObject_GC_Track(self);
6764 return (PyObject *)self;
6765}
6766
6767/*****************************************************************************/
6768
6769
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006770static PyObject *
6771Unpickler_get_memo(UnpicklerObject *self)
6772{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006773 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006774}
6775
6776static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006777Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006778{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006779 PyObject **new_memo;
6780 Py_ssize_t new_memo_size = 0;
6781 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006782
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006783 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006784 PyErr_SetString(PyExc_TypeError,
6785 "attribute deletion is not supported");
6786 return -1;
6787 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006788
6789 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6790 UnpicklerObject *unpickler =
6791 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6792
6793 new_memo_size = unpickler->memo_size;
6794 new_memo = _Unpickler_NewMemo(new_memo_size);
6795 if (new_memo == NULL)
6796 return -1;
6797
6798 for (i = 0; i < new_memo_size; i++) {
6799 Py_XINCREF(unpickler->memo[i]);
6800 new_memo[i] = unpickler->memo[i];
6801 }
6802 }
6803 else if (PyDict_Check(obj)) {
6804 Py_ssize_t i = 0;
6805 PyObject *key, *value;
6806
6807 new_memo_size = PyDict_Size(obj);
6808 new_memo = _Unpickler_NewMemo(new_memo_size);
6809 if (new_memo == NULL)
6810 return -1;
6811
6812 while (PyDict_Next(obj, &i, &key, &value)) {
6813 Py_ssize_t idx;
6814 if (!PyLong_Check(key)) {
6815 PyErr_SetString(PyExc_TypeError,
6816 "memo key must be integers");
6817 goto error;
6818 }
6819 idx = PyLong_AsSsize_t(key);
6820 if (idx == -1 && PyErr_Occurred())
6821 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006822 if (idx < 0) {
6823 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006824 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006825 goto error;
6826 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006827 if (_Unpickler_MemoPut(self, idx, value) < 0)
6828 goto error;
6829 }
6830 }
6831 else {
6832 PyErr_Format(PyExc_TypeError,
6833 "'memo' attribute must be an UnpicklerMemoProxy object"
6834 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006835 return -1;
6836 }
6837
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006838 _Unpickler_MemoCleanup(self);
6839 self->memo_size = new_memo_size;
6840 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006841
6842 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006843
6844 error:
6845 if (new_memo_size) {
6846 i = new_memo_size;
6847 while (--i >= 0) {
6848 Py_XDECREF(new_memo[i]);
6849 }
6850 PyMem_FREE(new_memo);
6851 }
6852 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006853}
6854
6855static PyObject *
6856Unpickler_get_persload(UnpicklerObject *self)
6857{
6858 if (self->pers_func == NULL)
6859 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6860 else
6861 Py_INCREF(self->pers_func);
6862 return self->pers_func;
6863}
6864
6865static int
6866Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6867{
6868 PyObject *tmp;
6869
6870 if (value == NULL) {
6871 PyErr_SetString(PyExc_TypeError,
6872 "attribute deletion is not supported");
6873 return -1;
6874 }
6875 if (!PyCallable_Check(value)) {
6876 PyErr_SetString(PyExc_TypeError,
6877 "persistent_load must be a callable taking "
6878 "one argument");
6879 return -1;
6880 }
6881
6882 tmp = self->pers_func;
6883 Py_INCREF(value);
6884 self->pers_func = value;
6885 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6886
6887 return 0;
6888}
6889
6890static PyGetSetDef Unpickler_getsets[] = {
6891 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6892 {"persistent_load", (getter)Unpickler_get_persload,
6893 (setter)Unpickler_set_persload},
6894 {NULL}
6895};
6896
6897static PyTypeObject Unpickler_Type = {
6898 PyVarObject_HEAD_INIT(NULL, 0)
6899 "_pickle.Unpickler", /*tp_name*/
6900 sizeof(UnpicklerObject), /*tp_basicsize*/
6901 0, /*tp_itemsize*/
6902 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6903 0, /*tp_print*/
6904 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006905 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006906 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006907 0, /*tp_repr*/
6908 0, /*tp_as_number*/
6909 0, /*tp_as_sequence*/
6910 0, /*tp_as_mapping*/
6911 0, /*tp_hash*/
6912 0, /*tp_call*/
6913 0, /*tp_str*/
6914 0, /*tp_getattro*/
6915 0, /*tp_setattro*/
6916 0, /*tp_as_buffer*/
6917 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006918 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006919 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6920 (inquiry)Unpickler_clear, /*tp_clear*/
6921 0, /*tp_richcompare*/
6922 0, /*tp_weaklistoffset*/
6923 0, /*tp_iter*/
6924 0, /*tp_iternext*/
6925 Unpickler_methods, /*tp_methods*/
6926 0, /*tp_members*/
6927 Unpickler_getsets, /*tp_getset*/
6928 0, /*tp_base*/
6929 0, /*tp_dict*/
6930 0, /*tp_descr_get*/
6931 0, /*tp_descr_set*/
6932 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006933 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006934 PyType_GenericAlloc, /*tp_alloc*/
6935 PyType_GenericNew, /*tp_new*/
6936 PyObject_GC_Del, /*tp_free*/
6937 0, /*tp_is_gc*/
6938};
6939
Larry Hastings61272b72014-01-07 12:41:53 -08006940/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006941
6942_pickle.dump
6943
6944 obj: object
6945 file: object
6946 protocol: object = NULL
6947 *
6948 fix_imports: bool = True
6949
6950Write a pickled representation of obj to the open file object file.
6951
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006952This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6953be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006954
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006955The optional *protocol* argument tells the pickler to use the given
6956protocol supported protocols are 0, 1, 2, 3 and 4. The default
6957protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006958
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006959Specifying a negative protocol version selects the highest protocol
6960version supported. The higher the protocol used, the more recent the
6961version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006962
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006963The *file* argument must have a write() method that accepts a single
6964bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00006965writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006966this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006967
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006968If *fix_imports* is True and protocol is less than 3, pickle will try
6969to map the new Python 3 names to the old module names used in Python
69702, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006971[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006972
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006973static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006974_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
Larry Hastings89964c42015-04-14 18:07:59 -04006975 PyObject *protocol, int fix_imports)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006976/*[clinic end generated code: output=a4774d5fde7d34de input=830f8a64cef6f042]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006977{
6978 PicklerObject *pickler = _Pickler_New();
6979
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006980 if (pickler == NULL)
6981 return NULL;
6982
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006983 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006984 goto error;
6985
6986 if (_Pickler_SetOutputStream(pickler, file) < 0)
6987 goto error;
6988
6989 if (dump(pickler, obj) < 0)
6990 goto error;
6991
6992 if (_Pickler_FlushToFile(pickler) < 0)
6993 goto error;
6994
6995 Py_DECREF(pickler);
6996 Py_RETURN_NONE;
6997
6998 error:
6999 Py_XDECREF(pickler);
7000 return NULL;
7001}
7002
Larry Hastings61272b72014-01-07 12:41:53 -08007003/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007004
7005_pickle.dumps
7006
7007 obj: object
7008 protocol: object = NULL
7009 *
7010 fix_imports: bool = True
7011
7012Return the pickled representation of the object as a bytes object.
7013
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007014The optional *protocol* argument tells the pickler to use the given
7015protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7016protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007017
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007018Specifying a negative protocol version selects the highest protocol
7019version supported. The higher the protocol used, the more recent the
7020version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007021
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007022If *fix_imports* is True and *protocol* is less than 3, pickle will
7023try to map the new Python 3 names to the old module names used in
7024Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007025[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007026
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007027static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007028_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
Larry Hastings89964c42015-04-14 18:07:59 -04007029 int fix_imports)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007030/*[clinic end generated code: output=d75d5cda456fd261 input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007031{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007032 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007033 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007034
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007035 if (pickler == NULL)
7036 return NULL;
7037
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007038 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007039 goto error;
7040
7041 if (dump(pickler, obj) < 0)
7042 goto error;
7043
7044 result = _Pickler_GetString(pickler);
7045 Py_DECREF(pickler);
7046 return result;
7047
7048 error:
7049 Py_XDECREF(pickler);
7050 return NULL;
7051}
7052
Larry Hastings61272b72014-01-07 12:41:53 -08007053/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007054
7055_pickle.load
7056
7057 file: object
7058 *
7059 fix_imports: bool = True
7060 encoding: str = 'ASCII'
7061 errors: str = 'strict'
7062
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007063Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007064
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007065This is equivalent to ``Unpickler(file).load()``, but may be more
7066efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007067
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007068The protocol version of the pickle is detected automatically, so no
7069protocol argument is needed. Bytes past the pickled object's
7070representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007071
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007072The argument *file* must have two methods, a read() method that takes
7073an integer argument, and a readline() method that requires no
7074arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007075binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007076other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007077
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007078Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007079which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007080generated by Python 2. If *fix_imports* is True, pickle will try to
7081map the old Python 2 names to the new names used in Python 3. The
7082*encoding* and *errors* tell pickle how to decode 8-bit string
7083instances pickled by Python 2; these default to 'ASCII' and 'strict',
7084respectively. The *encoding* can be 'bytes' to read these 8-bit
7085string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007086[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007087
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007088static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007089_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
Larry Hastings89964c42015-04-14 18:07:59 -04007090 const char *encoding, const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007091/*[clinic end generated code: output=69e298160285199e input=01b44dd3fc07afa7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007092{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007093 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007094 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007095
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007096 if (unpickler == NULL)
7097 return NULL;
7098
7099 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7100 goto error;
7101
7102 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7103 goto error;
7104
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007105 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007106
7107 result = load(unpickler);
7108 Py_DECREF(unpickler);
7109 return result;
7110
7111 error:
7112 Py_XDECREF(unpickler);
7113 return NULL;
7114}
7115
Larry Hastings61272b72014-01-07 12:41:53 -08007116/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007117
7118_pickle.loads
7119
7120 data: object
7121 *
7122 fix_imports: bool = True
7123 encoding: str = 'ASCII'
7124 errors: str = 'strict'
7125
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007126Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007127
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007128The protocol version of the pickle is detected automatically, so no
7129protocol argument is needed. Bytes past the pickled object's
7130representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007131
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007132Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007133which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007134generated by Python 2. If *fix_imports* is True, pickle will try to
7135map the old Python 2 names to the new names used in Python 3. The
7136*encoding* and *errors* tell pickle how to decode 8-bit string
7137instances pickled by Python 2; these default to 'ASCII' and 'strict',
7138respectively. The *encoding* can be 'bytes' to read these 8-bit
7139string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007140[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007141
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007142static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007143_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
Larry Hastings89964c42015-04-14 18:07:59 -04007144 const char *encoding, const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007145/*[clinic end generated code: output=1e7cb2343f2c440f input=70605948a719feb9]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007146{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007147 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007148 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007149
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007150 if (unpickler == NULL)
7151 return NULL;
7152
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007153 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007154 goto error;
7155
7156 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7157 goto error;
7158
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007159 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007160
7161 result = load(unpickler);
7162 Py_DECREF(unpickler);
7163 return result;
7164
7165 error:
7166 Py_XDECREF(unpickler);
7167 return NULL;
7168}
7169
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007170static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007171 _PICKLE_DUMP_METHODDEF
7172 _PICKLE_DUMPS_METHODDEF
7173 _PICKLE_LOAD_METHODDEF
7174 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007175 {NULL, NULL} /* sentinel */
7176};
7177
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007178static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007179pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007180{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007181 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007182 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007183}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007184
Stefan Krahf483b0f2013-12-14 13:43:10 +01007185static void
7186pickle_free(PyObject *m)
7187{
7188 _Pickle_ClearState(_Pickle_GetState(m));
7189}
7190
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007191static int
7192pickle_traverse(PyObject *m, visitproc visit, void *arg)
7193{
7194 PickleState *st = _Pickle_GetState(m);
7195 Py_VISIT(st->PickleError);
7196 Py_VISIT(st->PicklingError);
7197 Py_VISIT(st->UnpicklingError);
7198 Py_VISIT(st->dispatch_table);
7199 Py_VISIT(st->extension_registry);
7200 Py_VISIT(st->extension_cache);
7201 Py_VISIT(st->inverted_registry);
7202 Py_VISIT(st->name_mapping_2to3);
7203 Py_VISIT(st->import_mapping_2to3);
7204 Py_VISIT(st->name_mapping_3to2);
7205 Py_VISIT(st->import_mapping_3to2);
7206 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007207 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007208 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007209}
7210
7211static struct PyModuleDef _picklemodule = {
7212 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007213 "_pickle", /* m_name */
7214 pickle_module_doc, /* m_doc */
7215 sizeof(PickleState), /* m_size */
7216 pickle_methods, /* m_methods */
7217 NULL, /* m_reload */
7218 pickle_traverse, /* m_traverse */
7219 pickle_clear, /* m_clear */
7220 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007221};
7222
7223PyMODINIT_FUNC
7224PyInit__pickle(void)
7225{
7226 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007227 PickleState *st;
7228
7229 m = PyState_FindModule(&_picklemodule);
7230 if (m) {
7231 Py_INCREF(m);
7232 return m;
7233 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007234
7235 if (PyType_Ready(&Unpickler_Type) < 0)
7236 return NULL;
7237 if (PyType_Ready(&Pickler_Type) < 0)
7238 return NULL;
7239 if (PyType_Ready(&Pdata_Type) < 0)
7240 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007241 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7242 return NULL;
7243 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7244 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007245
7246 /* Create the module and add the functions. */
7247 m = PyModule_Create(&_picklemodule);
7248 if (m == NULL)
7249 return NULL;
7250
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007251 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007252 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7253 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007254 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007255 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7256 return NULL;
7257
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007258 st = _Pickle_GetState(m);
7259
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007260 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007261 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7262 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007263 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007264 st->PicklingError = \
7265 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7266 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007267 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007268 st->UnpicklingError = \
7269 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7270 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007271 return NULL;
7272
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007273 Py_INCREF(st->PickleError);
7274 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007275 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007276 Py_INCREF(st->PicklingError);
7277 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007278 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007279 Py_INCREF(st->UnpicklingError);
7280 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007281 return NULL;
7282
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007283 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007284 return NULL;
7285
7286 return m;
7287}