blob: 56bbd587b596d142740ab7acfcce64a02a1ad1a6 [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
553 where the current frame begins. -1 if there
554 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{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000849 Py_CLEAR(self->output_buffer);
850 self->output_buffer =
851 PyBytes_FromStringAndSize(NULL, self->max_output_len);
852 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000853 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000854 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100855 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000856 return 0;
857}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000858
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100859static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100860_write_size64(char *out, size_t value)
861{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200862 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800863
864 assert(sizeof(size_t) <= 8);
865
866 for (i = 0; i < sizeof(size_t); i++) {
867 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
868 }
869 for (i = sizeof(size_t); i < 8; i++) {
870 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800871 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100872}
873
874static void
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100875_Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
876{
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100877 qdata[0] = FRAME;
878 _write_size64(qdata + 1, frame_len);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100879}
880
881static int
882_Pickler_CommitFrame(PicklerObject *self)
883{
884 size_t frame_len;
885 char *qdata;
886
887 if (!self->framing || self->frame_start == -1)
888 return 0;
889 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
890 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
891 _Pickler_WriteFrameHeader(self, qdata, frame_len);
892 self->frame_start = -1;
893 return 0;
894}
895
896static int
897_Pickler_OpcodeBoundary(PicklerObject *self)
898{
899 Py_ssize_t frame_len;
900
901 if (!self->framing || self->frame_start == -1)
902 return 0;
903 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
904 if (frame_len >= FRAME_SIZE_TARGET)
905 return _Pickler_CommitFrame(self);
906 else
907 return 0;
908}
909
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000910static PyObject *
911_Pickler_GetString(PicklerObject *self)
912{
913 PyObject *output_buffer = self->output_buffer;
914
915 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100916
917 if (_Pickler_CommitFrame(self))
918 return NULL;
919
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000920 self->output_buffer = NULL;
921 /* Resize down to exact size */
922 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
923 return NULL;
924 return output_buffer;
925}
926
927static int
928_Pickler_FlushToFile(PicklerObject *self)
929{
930 PyObject *output, *result;
931
932 assert(self->write != NULL);
933
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100934 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000935 output = _Pickler_GetString(self);
936 if (output == NULL)
937 return -1;
938
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -0800939 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000940 Py_XDECREF(result);
941 return (result == NULL) ? -1 : 0;
942}
943
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200944static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100945_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000946{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100947 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000948 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100949 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000950
951 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100952 need_new_frame = (self->framing && self->frame_start == -1);
953
954 if (need_new_frame)
955 n = data_len + FRAME_HEADER_SIZE;
956 else
957 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000958
959 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100960 if (required > self->max_output_len) {
961 /* Make place in buffer for the pickle chunk */
962 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
963 PyErr_NoMemory();
964 return -1;
965 }
966 self->max_output_len = (self->output_len + n) / 2 * 3;
967 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
968 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000969 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000970 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100971 if (need_new_frame) {
972 /* Setup new frame */
973 Py_ssize_t frame_start = self->output_len;
974 self->frame_start = frame_start;
975 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
976 /* Write an invalid value, for debugging */
977 buffer[frame_start + i] = 0xFE;
978 }
979 self->output_len += FRAME_HEADER_SIZE;
980 }
981 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000982 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100983 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000984 buffer[self->output_len + i] = s[i];
985 }
986 }
987 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100988 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000989 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100990 self->output_len += data_len;
991 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000992}
993
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000994static PicklerObject *
995_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000996{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000997 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000998
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000999 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1000 if (self == NULL)
1001 return NULL;
1002
1003 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01001004 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001005 self->write = NULL;
1006 self->proto = 0;
1007 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001008 self->framing = 0;
1009 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001010 self->fast = 0;
1011 self->fast_nesting = 0;
1012 self->fix_imports = 0;
1013 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001014 self->max_output_len = WRITE_BUF_SIZE;
1015 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001016
1017 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001018 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1019 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001020
1021 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001022 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001023 return NULL;
1024 }
1025 return self;
1026}
1027
1028static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001029_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001030{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001031 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001032
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001033 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001034 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001035 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001036 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001037 proto = PyLong_AsLong(protocol);
1038 if (proto < 0) {
1039 if (proto == -1 && PyErr_Occurred())
1040 return -1;
1041 proto = HIGHEST_PROTOCOL;
1042 }
1043 else if (proto > HIGHEST_PROTOCOL) {
1044 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1045 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001046 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001047 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001048 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001049 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001050 self->bin = proto > 0;
1051 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001052 return 0;
1053}
1054
1055/* Returns -1 (with an exception set) on failure, 0 on success. This may
1056 be called once on a freshly created Pickler. */
1057static int
1058_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1059{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001060 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001061 assert(file != NULL);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001062 self->write = _PyObject_GetAttrId(file, &PyId_write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001063 if (self->write == NULL) {
1064 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1065 PyErr_SetString(PyExc_TypeError,
1066 "file must have a 'write' attribute");
1067 return -1;
1068 }
1069
1070 return 0;
1071}
1072
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001073/* Returns the size of the input on success, -1 on failure. This takes its
1074 own reference to `input`. */
1075static Py_ssize_t
1076_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1077{
1078 if (self->buffer.buf != NULL)
1079 PyBuffer_Release(&self->buffer);
1080 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1081 return -1;
1082 self->input_buffer = self->buffer.buf;
1083 self->input_len = self->buffer.len;
1084 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001085 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001086 return self->input_len;
1087}
1088
Antoine Pitrou04248a82010-10-12 20:51:21 +00001089static int
1090_Unpickler_SkipConsumed(UnpicklerObject *self)
1091{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001092 Py_ssize_t consumed;
1093 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001094
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001095 consumed = self->next_read_idx - self->prefetched_idx;
1096 if (consumed <= 0)
1097 return 0;
1098
1099 assert(self->peek); /* otherwise we did something wrong */
1100 /* This makes an useless copy... */
1101 r = PyObject_CallFunction(self->read, "n", consumed);
1102 if (r == NULL)
1103 return -1;
1104 Py_DECREF(r);
1105
1106 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001107 return 0;
1108}
1109
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001110static const Py_ssize_t READ_WHOLE_LINE = -1;
1111
1112/* If reading from a file, we need to only pull the bytes we need, since there
1113 may be multiple pickle objects arranged contiguously in the same input
1114 buffer.
1115
1116 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1117 bytes from the input stream/buffer.
1118
1119 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1120 failure; on success, returns the number of bytes read from the file.
1121
1122 On success, self->input_len will be 0; this is intentional so that when
1123 unpickling from a file, the "we've run out of data" code paths will trigger,
1124 causing the Unpickler to go back to the file for more data. Use the returned
1125 size to tell you how much data you can process. */
1126static Py_ssize_t
1127_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1128{
1129 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001130 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001131
1132 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001133
Antoine Pitrou04248a82010-10-12 20:51:21 +00001134 if (_Unpickler_SkipConsumed(self) < 0)
1135 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001136
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001137 if (n == READ_WHOLE_LINE) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08001138 PyObject *empty_tuple = PyTuple_New(0);
1139 data = PyObject_Call(self->readline, empty_tuple, NULL);
1140 Py_DECREF(empty_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001141 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001142 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001143 PyObject *len;
1144 /* Prefetch some data without advancing the file pointer, if possible */
1145 if (self->peek && n < PREFETCH) {
1146 len = PyLong_FromSsize_t(PREFETCH);
1147 if (len == NULL)
1148 return -1;
1149 data = _Pickle_FastCall(self->peek, len);
1150 if (data == NULL) {
1151 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1152 return -1;
1153 /* peek() is probably not supported by the given file object */
1154 PyErr_Clear();
1155 Py_CLEAR(self->peek);
1156 }
1157 else {
1158 read_size = _Unpickler_SetStringInput(self, data);
1159 Py_DECREF(data);
1160 self->prefetched_idx = 0;
1161 if (n <= read_size)
1162 return n;
1163 }
1164 }
1165 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001166 if (len == NULL)
1167 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001168 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001169 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001170 if (data == NULL)
1171 return -1;
1172
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001173 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001174 Py_DECREF(data);
1175 return read_size;
1176}
1177
1178/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1179
1180 This should be used for all data reads, rather than accessing the unpickler's
1181 input buffer directly. This method deals correctly with reading from input
1182 streams, which the input buffer doesn't deal with.
1183
1184 Note that when reading from a file-like object, self->next_read_idx won't
1185 be updated (it should remain at 0 for the entire unpickling process). You
1186 should use this function's return value to know how many bytes you can
1187 consume.
1188
1189 Returns -1 (with an exception set) on failure. On success, return the
1190 number of chars read. */
1191static Py_ssize_t
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001192_Unpickler_Read(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001193{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001194 Py_ssize_t num_read;
1195
Benjamin Peterson6aa15642015-09-27 01:16:03 -07001196 *s = NULL;
Benjamin Petersone48cf7e2015-09-26 00:08:34 -07001197 if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1198 PickleState *st = _Pickle_GetGlobalState();
1199 PyErr_SetString(st->UnpicklingError,
1200 "read would overflow (invalid bytecode)");
1201 return -1;
1202 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001203 if (self->next_read_idx + n <= self->input_len) {
1204 *s = self->input_buffer + self->next_read_idx;
1205 self->next_read_idx += n;
1206 return n;
1207 }
1208 if (!self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001209 PyErr_Format(PyExc_EOFError, "Ran out of input");
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001210 return -1;
1211 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001212 num_read = _Unpickler_ReadFromFile(self, n);
1213 if (num_read < 0)
1214 return -1;
1215 if (num_read < n) {
1216 PyErr_Format(PyExc_EOFError, "Ran out of input");
1217 return -1;
1218 }
1219 *s = self->input_buffer;
1220 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001221 return n;
1222}
1223
1224static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001225_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1226 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001227{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001228 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001229 if (input_line == NULL) {
1230 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001231 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001232 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001233
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001234 memcpy(input_line, line, len);
1235 input_line[len] = '\0';
1236 self->input_line = input_line;
1237 *result = self->input_line;
1238 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001239}
1240
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001241/* Read a line from the input stream/buffer. If we run off the end of the input
1242 before hitting \n, return the data we found.
1243
1244 Returns the number of chars read, or -1 on failure. */
1245static Py_ssize_t
1246_Unpickler_Readline(UnpicklerObject *self, char **result)
1247{
1248 Py_ssize_t i, num_read;
1249
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001250 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001251 if (self->input_buffer[i] == '\n') {
1252 char *line_start = self->input_buffer + self->next_read_idx;
1253 num_read = i - self->next_read_idx + 1;
1254 self->next_read_idx = i + 1;
1255 return _Unpickler_CopyLine(self, line_start, num_read, result);
1256 }
1257 }
1258 if (self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001259 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1260 if (num_read < 0)
1261 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001262 self->next_read_idx = num_read;
Antoine Pitrouf6c7a852011-08-11 21:04:02 +02001263 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001264 }
Victor Stinner121aab42011-09-29 23:40:53 +02001265
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001266 /* If we get here, we've run off the end of the input string. Return the
1267 remaining string and let the caller figure it out. */
1268 *result = self->input_buffer + self->next_read_idx;
1269 num_read = i - self->next_read_idx;
1270 self->next_read_idx = i;
1271 return num_read;
1272}
1273
1274/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1275 will be modified in place. */
1276static int
1277_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1278{
1279 Py_ssize_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001280
1281 assert(new_size > self->memo_size);
1282
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001283 PyMem_RESIZE(self->memo, PyObject *, new_size);
1284 if (self->memo == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001285 PyErr_NoMemory();
1286 return -1;
1287 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001288 for (i = self->memo_size; i < new_size; i++)
1289 self->memo[i] = NULL;
1290 self->memo_size = new_size;
1291 return 0;
1292}
1293
1294/* Returns NULL if idx is out of bounds. */
1295static PyObject *
1296_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1297{
1298 if (idx < 0 || idx >= self->memo_size)
1299 return NULL;
1300
1301 return self->memo[idx];
1302}
1303
1304/* Returns -1 (with an exception set) on failure, 0 on success.
1305 This takes its own reference to `value`. */
1306static int
1307_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1308{
1309 PyObject *old_item;
1310
1311 if (idx >= self->memo_size) {
1312 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1313 return -1;
1314 assert(idx < self->memo_size);
1315 }
1316 Py_INCREF(value);
1317 old_item = self->memo[idx];
1318 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001319 if (old_item != NULL) {
1320 Py_DECREF(old_item);
1321 }
1322 else {
1323 self->memo_len++;
1324 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001325 return 0;
1326}
1327
1328static PyObject **
1329_Unpickler_NewMemo(Py_ssize_t new_size)
1330{
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001331 PyObject **memo = PyMem_NEW(PyObject *, new_size);
Victor Stinner42024562013-07-12 00:53:57 +02001332 if (memo == NULL) {
1333 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001334 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001335 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001336 memset(memo, 0, new_size * sizeof(PyObject *));
1337 return memo;
1338}
1339
1340/* Free the unpickler's memo, taking care to decref any items left in it. */
1341static void
1342_Unpickler_MemoCleanup(UnpicklerObject *self)
1343{
1344 Py_ssize_t i;
1345 PyObject **memo = self->memo;
1346
1347 if (self->memo == NULL)
1348 return;
1349 self->memo = NULL;
1350 i = self->memo_size;
1351 while (--i >= 0) {
1352 Py_XDECREF(memo[i]);
1353 }
1354 PyMem_FREE(memo);
1355}
1356
1357static UnpicklerObject *
1358_Unpickler_New(void)
1359{
1360 UnpicklerObject *self;
1361
1362 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1363 if (self == NULL)
1364 return NULL;
1365
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001366 self->pers_func = NULL;
1367 self->input_buffer = NULL;
1368 self->input_line = NULL;
1369 self->input_len = 0;
1370 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001371 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001372 self->read = NULL;
1373 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001374 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001375 self->encoding = NULL;
1376 self->errors = NULL;
1377 self->marks = NULL;
1378 self->num_marks = 0;
1379 self->marks_size = 0;
1380 self->proto = 0;
1381 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001382 memset(&self->buffer, 0, sizeof(Py_buffer));
1383 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001384 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001385 self->memo = _Unpickler_NewMemo(self->memo_size);
1386 self->stack = (Pdata *)Pdata_New();
1387
1388 if (self->memo == NULL || self->stack == NULL) {
1389 Py_DECREF(self);
1390 return NULL;
1391 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001392
1393 return self;
1394}
1395
1396/* Returns -1 (with an exception set) on failure, 0 on success. This may
1397 be called once on a freshly created Pickler. */
1398static int
1399_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1400{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001401 _Py_IDENTIFIER(peek);
1402 _Py_IDENTIFIER(read);
1403 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001404
1405 self->peek = _PyObject_GetAttrId(file, &PyId_peek);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001406 if (self->peek == NULL) {
1407 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1408 PyErr_Clear();
1409 else
1410 return -1;
1411 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001412 self->read = _PyObject_GetAttrId(file, &PyId_read);
1413 self->readline = _PyObject_GetAttrId(file, &PyId_readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001414 if (self->readline == NULL || self->read == NULL) {
1415 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1416 PyErr_SetString(PyExc_TypeError,
1417 "file must have 'read' and 'readline' attributes");
1418 Py_CLEAR(self->read);
1419 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001420 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001421 return -1;
1422 }
1423 return 0;
1424}
1425
1426/* Returns -1 (with an exception set) on failure, 0 on success. This may
1427 be called once on a freshly created Pickler. */
1428static int
1429_Unpickler_SetInputEncoding(UnpicklerObject *self,
1430 const char *encoding,
1431 const char *errors)
1432{
1433 if (encoding == NULL)
1434 encoding = "ASCII";
1435 if (errors == NULL)
1436 errors = "strict";
1437
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001438 self->encoding = _PyMem_Strdup(encoding);
1439 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001440 if (self->encoding == NULL || self->errors == NULL) {
1441 PyErr_NoMemory();
1442 return -1;
1443 }
1444 return 0;
1445}
1446
1447/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001448static int
1449memo_get(PicklerObject *self, PyObject *key)
1450{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001451 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001452 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001453 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001454
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001455 value = PyMemoTable_Get(self->memo, key);
1456 if (value == NULL) {
1457 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001458 return -1;
1459 }
1460
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001461 if (!self->bin) {
1462 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001463 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1464 "%" PY_FORMAT_SIZE_T "d\n", *value);
1465 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001466 }
1467 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001468 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001469 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001470 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001471 len = 2;
1472 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001473 else if ((size_t)*value <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001474 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001475 pdata[1] = (unsigned char)(*value & 0xff);
1476 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1477 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1478 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001479 len = 5;
1480 }
1481 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001482 PickleState *st = _Pickle_GetGlobalState();
1483 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001484 "memo id too large for LONG_BINGET");
1485 return -1;
1486 }
1487 }
1488
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001489 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001490 return -1;
1491
1492 return 0;
1493}
1494
1495/* Store an object in the memo, assign it a new unique ID based on the number
1496 of objects currently stored in the memo and generate a PUT opcode. */
1497static int
1498memo_put(PicklerObject *self, PyObject *obj)
1499{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001500 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001501 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001502 Py_ssize_t idx;
1503
1504 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001505
1506 if (self->fast)
1507 return 0;
1508
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001509 idx = PyMemoTable_Size(self->memo);
1510 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1511 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001512
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001513 if (self->proto >= 4) {
1514 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1515 return -1;
1516 return 0;
1517 }
1518 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001519 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001520 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001521 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001522 len = strlen(pdata);
1523 }
1524 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001525 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001526 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001527 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001528 len = 2;
1529 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001530 else if ((size_t)idx <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001531 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001532 pdata[1] = (unsigned char)(idx & 0xff);
1533 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1534 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1535 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001536 len = 5;
1537 }
1538 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001539 PickleState *st = _Pickle_GetGlobalState();
1540 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001541 "memo id too large for LONG_BINPUT");
1542 return -1;
1543 }
1544 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001545 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001546 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001547
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001548 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001549}
1550
1551static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001552get_dotted_path(PyObject *obj, PyObject *name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001553 _Py_static_string(PyId_dot, ".");
1554 _Py_static_string(PyId_locals, "<locals>");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001555 PyObject *dotted_path;
1556 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001557
1558 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001559 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001560 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001561 n = PyList_GET_SIZE(dotted_path);
1562 assert(n >= 1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001563 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001564 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001565 PyObject *result = PyUnicode_RichCompare(
1566 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1567 int is_equal = (result == Py_True);
1568 assert(PyBool_Check(result));
1569 Py_DECREF(result);
1570 if (is_equal) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001571 if (obj == NULL)
1572 PyErr_Format(PyExc_AttributeError,
1573 "Can't pickle local object %R", name);
1574 else
1575 PyErr_Format(PyExc_AttributeError,
1576 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001577 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001578 return NULL;
1579 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001580 }
1581 return dotted_path;
1582}
1583
1584static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001585get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001586{
1587 Py_ssize_t i, n;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001588 PyObject *parent = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001589
1590 assert(PyList_CheckExact(names));
1591 Py_INCREF(obj);
1592 n = PyList_GET_SIZE(names);
1593 for (i = 0; i < n; i++) {
1594 PyObject *name = PyList_GET_ITEM(names, i);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001595 Py_XDECREF(parent);
1596 parent = obj;
1597 obj = PyObject_GetAttr(parent, name);
1598 if (obj == NULL) {
1599 Py_DECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001600 return NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001601 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001602 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001603 if (pparent != NULL)
1604 *pparent = parent;
1605 else
1606 Py_XDECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001607 return obj;
1608}
1609
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001610static void
1611reformat_attribute_error(PyObject *obj, PyObject *name)
1612{
1613 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1614 PyErr_Clear();
1615 PyErr_Format(PyExc_AttributeError,
1616 "Can't get attribute %R on %R", name, obj);
1617 }
1618}
1619
1620
1621static PyObject *
1622getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1623{
1624 PyObject *dotted_path, *attr;
1625
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001626 if (allow_qualname) {
1627 dotted_path = get_dotted_path(obj, name);
1628 if (dotted_path == NULL)
1629 return NULL;
1630 attr = get_deep_attribute(obj, dotted_path, NULL);
1631 Py_DECREF(dotted_path);
1632 }
1633 else
1634 attr = PyObject_GetAttr(obj, name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001635 if (attr == NULL)
1636 reformat_attribute_error(obj, name);
1637 return attr;
1638}
1639
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001640static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001641whichmodule(PyObject *global, PyObject *dotted_path)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001642{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001643 PyObject *module_name;
1644 PyObject *modules_dict;
1645 PyObject *module;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001646 Py_ssize_t i;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001647 _Py_IDENTIFIER(__module__);
1648 _Py_IDENTIFIER(modules);
1649 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001650
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001651 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1652
1653 if (module_name == NULL) {
1654 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001655 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001656 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001657 }
1658 else {
1659 /* In some rare cases (e.g., bound methods of extension types),
1660 __module__ can be None. If it is so, then search sys.modules for
1661 the module of global. */
1662 if (module_name != Py_None)
1663 return module_name;
1664 Py_CLEAR(module_name);
1665 }
1666 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001667
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001668 /* Fallback on walking sys.modules */
Victor Stinnerbb520202013-11-06 22:40:41 +01001669 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001670 if (modules_dict == NULL) {
1671 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001672 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001673 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001674
1675 i = 0;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001676 while (PyDict_Next(modules_dict, &i, &module_name, &module)) {
1677 PyObject *candidate;
1678 if (PyUnicode_Check(module_name) &&
1679 !PyUnicode_CompareWithASCIIString(module_name, "__main__"))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001680 continue;
1681 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001682 continue;
1683
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001684 candidate = get_deep_attribute(module, dotted_path, NULL);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001685 if (candidate == NULL) {
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001686 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001687 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001688 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001689 continue;
1690 }
1691
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001692 if (candidate == global) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001693 Py_INCREF(module_name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001694 Py_DECREF(candidate);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001695 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001696 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001697 Py_DECREF(candidate);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001698 }
1699
1700 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001701 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001702 Py_INCREF(module_name);
1703 return module_name;
1704}
1705
1706/* fast_save_enter() and fast_save_leave() are guards against recursive
1707 objects when Pickler is used with the "fast mode" (i.e., with object
1708 memoization disabled). If the nesting of a list or dict object exceed
1709 FAST_NESTING_LIMIT, these guards will start keeping an internal
1710 reference to the seen list or dict objects and check whether these objects
1711 are recursive. These are not strictly necessary, since save() has a
1712 hard-coded recursion limit, but they give a nicer error message than the
1713 typical RuntimeError. */
1714static int
1715fast_save_enter(PicklerObject *self, PyObject *obj)
1716{
1717 /* if fast_nesting < 0, we're doing an error exit. */
1718 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1719 PyObject *key = NULL;
1720 if (self->fast_memo == NULL) {
1721 self->fast_memo = PyDict_New();
1722 if (self->fast_memo == NULL) {
1723 self->fast_nesting = -1;
1724 return 0;
1725 }
1726 }
1727 key = PyLong_FromVoidPtr(obj);
1728 if (key == NULL)
1729 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001730 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001731 Py_DECREF(key);
1732 PyErr_Format(PyExc_ValueError,
1733 "fast mode: can't pickle cyclic objects "
1734 "including object type %.200s at %p",
1735 obj->ob_type->tp_name, obj);
1736 self->fast_nesting = -1;
1737 return 0;
1738 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001739 if (PyErr_Occurred()) {
1740 return 0;
1741 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001742 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1743 Py_DECREF(key);
1744 self->fast_nesting = -1;
1745 return 0;
1746 }
1747 Py_DECREF(key);
1748 }
1749 return 1;
1750}
1751
1752static int
1753fast_save_leave(PicklerObject *self, PyObject *obj)
1754{
1755 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1756 PyObject *key = PyLong_FromVoidPtr(obj);
1757 if (key == NULL)
1758 return 0;
1759 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1760 Py_DECREF(key);
1761 return 0;
1762 }
1763 Py_DECREF(key);
1764 }
1765 return 1;
1766}
1767
1768static int
1769save_none(PicklerObject *self, PyObject *obj)
1770{
1771 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001772 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001773 return -1;
1774
1775 return 0;
1776}
1777
1778static int
1779save_bool(PicklerObject *self, PyObject *obj)
1780{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001781 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001782 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001783 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001784 return -1;
1785 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001786 else {
1787 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1788 * so that unpicklers written before bools were introduced unpickle them
1789 * as ints, but unpicklers after can recognize that bools were intended.
1790 * Note that protocol 2 added direct ways to pickle bools.
1791 */
1792 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1793 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1794 return -1;
1795 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001796 return 0;
1797}
1798
1799static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001800save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001801{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001802 PyObject *repr = NULL;
1803 Py_ssize_t size;
1804 long val;
1805 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001806
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001807 const char long_op = LONG;
1808
1809 val= PyLong_AsLong(obj);
1810 if (val == -1 && PyErr_Occurred()) {
1811 /* out of range for int pickling */
1812 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001813 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001814 else if (self->bin &&
1815 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001816 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
Larry Hastings61272b72014-01-07 12:41:53 -08001817 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001818
1819 Note: we can't use -0x80000000L in the above condition because some
1820 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1821 before applying the unary minus when sizeof(long) <= 4. The
1822 resulting value stays unsigned which is commonly not what we want,
1823 so MSVC happily warns us about it. However, that result would have
1824 been fine because we guard for sizeof(long) <= 4 which turns the
1825 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001826 char pdata[32];
1827 Py_ssize_t len = 0;
1828
1829 pdata[1] = (unsigned char)(val & 0xff);
1830 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1831 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1832 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001833
1834 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1835 if (pdata[2] == 0) {
1836 pdata[0] = BININT1;
1837 len = 2;
1838 }
1839 else {
1840 pdata[0] = BININT2;
1841 len = 3;
1842 }
1843 }
1844 else {
1845 pdata[0] = BININT;
1846 len = 5;
1847 }
1848
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001849 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001850 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001851
1852 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001853 }
1854
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001855 if (self->proto >= 2) {
1856 /* Linear-time pickling. */
1857 size_t nbits;
1858 size_t nbytes;
1859 unsigned char *pdata;
1860 char header[5];
1861 int i;
1862 int sign = _PyLong_Sign(obj);
1863
1864 if (sign == 0) {
1865 header[0] = LONG1;
1866 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001867 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001868 goto error;
1869 return 0;
1870 }
1871 nbits = _PyLong_NumBits(obj);
1872 if (nbits == (size_t)-1 && PyErr_Occurred())
1873 goto error;
1874 /* How many bytes do we need? There are nbits >> 3 full
1875 * bytes of data, and nbits & 7 leftover bits. If there
1876 * are any leftover bits, then we clearly need another
1877 * byte. Wnat's not so obvious is that we *probably*
1878 * need another byte even if there aren't any leftovers:
1879 * the most-significant bit of the most-significant byte
1880 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001881 * opposite of the one we need. The exception is ints
1882 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001883 * its own 256's-complement, so has the right sign bit
1884 * even without the extra byte. That's a pain to check
1885 * for in advance, though, so we always grab an extra
1886 * byte at the start, and cut it back later if possible.
1887 */
1888 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001889 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001890 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001891 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001892 goto error;
1893 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001894 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001895 if (repr == NULL)
1896 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001897 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001898 i = _PyLong_AsByteArray((PyLongObject *)obj,
1899 pdata, nbytes,
1900 1 /* little endian */ , 1 /* signed */ );
1901 if (i < 0)
1902 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001903 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001904 * needed. This is so iff the MSB is all redundant sign
1905 * bits.
1906 */
1907 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001908 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001909 pdata[nbytes - 1] == 0xff &&
1910 (pdata[nbytes - 2] & 0x80) != 0) {
1911 nbytes--;
1912 }
1913
1914 if (nbytes < 256) {
1915 header[0] = LONG1;
1916 header[1] = (unsigned char)nbytes;
1917 size = 2;
1918 }
1919 else {
1920 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001921 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001922 for (i = 1; i < 5; i++) {
1923 header[i] = (unsigned char)(size & 0xff);
1924 size >>= 8;
1925 }
1926 size = 5;
1927 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001928 if (_Pickler_Write(self, header, size) < 0 ||
1929 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001930 goto error;
1931 }
1932 else {
1933 char *string;
1934
Mark Dickinson8dd05142009-01-20 20:43:58 +00001935 /* proto < 2: write the repr and newline. This is quadratic-time (in
1936 the number of digits), in both directions. We add a trailing 'L'
1937 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001938
1939 repr = PyObject_Repr(obj);
1940 if (repr == NULL)
1941 goto error;
1942
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001943 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001944 if (string == NULL)
1945 goto error;
1946
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001947 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1948 _Pickler_Write(self, string, size) < 0 ||
1949 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001950 goto error;
1951 }
1952
1953 if (0) {
1954 error:
1955 status = -1;
1956 }
1957 Py_XDECREF(repr);
1958
1959 return status;
1960}
1961
1962static int
1963save_float(PicklerObject *self, PyObject *obj)
1964{
1965 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1966
1967 if (self->bin) {
1968 char pdata[9];
1969 pdata[0] = BINFLOAT;
1970 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1971 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001972 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001973 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001974 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001975 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001976 int result = -1;
1977 char *buf = NULL;
1978 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001979
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001980 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001981 goto done;
1982
Serhiy Storchakac86ca262015-02-15 14:18:32 +02001983 buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001984 if (!buf) {
1985 PyErr_NoMemory();
1986 goto done;
1987 }
1988
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001989 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001990 goto done;
1991
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001992 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001993 goto done;
1994
1995 result = 0;
1996done:
1997 PyMem_Free(buf);
1998 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001999 }
2000
2001 return 0;
2002}
2003
2004static int
2005save_bytes(PicklerObject *self, PyObject *obj)
2006{
2007 if (self->proto < 3) {
2008 /* Older pickle protocols do not have an opcode for pickling bytes
2009 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002010 the __reduce__ method) to permit bytes object unpickling.
2011
2012 Here we use a hack to be compatible with Python 2. Since in Python
2013 2 'bytes' is just an alias for 'str' (which has different
2014 parameters than the actual bytes object), we use codecs.encode
2015 to create the appropriate 'str' object when unpickled using
2016 Python 2 *and* the appropriate 'bytes' object when unpickled
2017 using Python 3. Again this is a hack and we don't need to do this
2018 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002019 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002020 int status;
2021
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002022 if (PyBytes_GET_SIZE(obj) == 0) {
2023 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2024 }
2025 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002026 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002027 PyObject *unicode_str =
2028 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2029 PyBytes_GET_SIZE(obj),
2030 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002031 _Py_IDENTIFIER(latin1);
2032
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002033 if (unicode_str == NULL)
2034 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002035 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002036 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002037 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002038 Py_DECREF(unicode_str);
2039 }
2040
2041 if (reduce_value == NULL)
2042 return -1;
2043
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002044 /* save_reduce() will memoize the object automatically. */
2045 status = save_reduce(self, reduce_value, obj);
2046 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002047 return status;
2048 }
2049 else {
2050 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002051 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002052 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002053
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002054 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002055 if (size < 0)
2056 return -1;
2057
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002058 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002059 header[0] = SHORT_BINBYTES;
2060 header[1] = (unsigned char)size;
2061 len = 2;
2062 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03002063 else if ((size_t)size <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002064 header[0] = BINBYTES;
2065 header[1] = (unsigned char)(size & 0xff);
2066 header[2] = (unsigned char)((size >> 8) & 0xff);
2067 header[3] = (unsigned char)((size >> 16) & 0xff);
2068 header[4] = (unsigned char)((size >> 24) & 0xff);
2069 len = 5;
2070 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002071 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002072 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002073 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002074 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002075 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002076 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002077 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002078 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002079 return -1; /* string too large */
2080 }
2081
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002082 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002083 return -1;
2084
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002085 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002086 return -1;
2087
2088 if (memo_put(self, obj) < 0)
2089 return -1;
2090
2091 return 0;
2092 }
2093}
2094
2095/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2096 backslash and newline characters to \uXXXX escapes. */
2097static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002098raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002099{
Victor Stinner7270b7f2014-08-17 21:14:46 +02002100 PyObject *repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002101 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002102 Py_ssize_t i, size;
2103 size_t expandsize;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002104 void *data;
2105 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002106
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002107 if (PyUnicode_READY(obj))
2108 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002109
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002110 size = PyUnicode_GET_LENGTH(obj);
2111 data = PyUnicode_DATA(obj);
2112 kind = PyUnicode_KIND(obj);
2113 if (kind == PyUnicode_4BYTE_KIND)
2114 expandsize = 10;
2115 else
2116 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002117
Victor Stinner049e5092014-08-17 22:20:00 +02002118 if ((size_t)size > (size_t)PY_SSIZE_T_MAX / expandsize)
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002119 return PyErr_NoMemory();
Victor Stinner7270b7f2014-08-17 21:14:46 +02002120 repr = PyBytes_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002121 if (repr == NULL)
2122 return NULL;
2123 if (size == 0)
Victor Stinner7270b7f2014-08-17 21:14:46 +02002124 return repr;
2125 assert(Py_REFCNT(repr) == 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002126
Victor Stinner7270b7f2014-08-17 21:14:46 +02002127 p = PyBytes_AS_STRING(repr);
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002128 for (i=0; i < size; i++) {
2129 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002130 /* Map 32-bit characters to '\Uxxxxxxxx' */
2131 if (ch >= 0x10000) {
2132 *p++ = '\\';
2133 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002134 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2135 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2136 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2137 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2138 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2139 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2140 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2141 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002142 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002143 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002144 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002145 *p++ = '\\';
2146 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002147 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2148 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2149 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2150 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002151 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002152 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002153 else
2154 *p++ = (char) ch;
2155 }
Victor Stinner7270b7f2014-08-17 21:14:46 +02002156 size = p - PyBytes_AS_STRING(repr);
2157 if (_PyBytes_Resize(&repr, size) < 0)
2158 return NULL;
2159 return repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002160}
2161
2162static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002163write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2164{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002165 char header[9];
2166 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002167
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002168 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002169 if (size <= 0xff && self->proto >= 4) {
2170 header[0] = SHORT_BINUNICODE;
2171 header[1] = (unsigned char)(size & 0xff);
2172 len = 2;
2173 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002174 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002175 header[0] = BINUNICODE;
2176 header[1] = (unsigned char)(size & 0xff);
2177 header[2] = (unsigned char)((size >> 8) & 0xff);
2178 header[3] = (unsigned char)((size >> 16) & 0xff);
2179 header[4] = (unsigned char)((size >> 24) & 0xff);
2180 len = 5;
2181 }
2182 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002183 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002184 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002185 len = 9;
2186 }
2187 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002188 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002189 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002190 return -1;
2191 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002192
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002193 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002194 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002195 if (_Pickler_Write(self, data, size) < 0)
2196 return -1;
2197
2198 return 0;
2199}
2200
2201static int
2202write_unicode_binary(PicklerObject *self, PyObject *obj)
2203{
2204 PyObject *encoded = NULL;
2205 Py_ssize_t size;
2206 char *data;
2207 int r;
2208
2209 if (PyUnicode_READY(obj))
2210 return -1;
2211
2212 data = PyUnicode_AsUTF8AndSize(obj, &size);
2213 if (data != NULL)
2214 return write_utf8(self, data, size);
2215
2216 /* Issue #8383: for strings with lone surrogates, fallback on the
2217 "surrogatepass" error handler. */
2218 PyErr_Clear();
2219 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2220 if (encoded == NULL)
2221 return -1;
2222
2223 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2224 PyBytes_GET_SIZE(encoded));
2225 Py_DECREF(encoded);
2226 return r;
2227}
2228
2229static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002230save_unicode(PicklerObject *self, PyObject *obj)
2231{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002232 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002233 if (write_unicode_binary(self, obj) < 0)
2234 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002235 }
2236 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002237 PyObject *encoded;
2238 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002239 const char unicode_op = UNICODE;
2240
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002241 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002242 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002243 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002244
Antoine Pitrou299978d2013-04-07 17:38:11 +02002245 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2246 Py_DECREF(encoded);
2247 return -1;
2248 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002249
2250 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002251 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2252 Py_DECREF(encoded);
2253 return -1;
2254 }
2255 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002256
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002257 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002258 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002259 }
2260 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002261 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002262
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002263 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002264}
2265
2266/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2267static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002268store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002269{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002270 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002271
2272 assert(PyTuple_Size(t) == len);
2273
2274 for (i = 0; i < len; i++) {
2275 PyObject *element = PyTuple_GET_ITEM(t, i);
2276
2277 if (element == NULL)
2278 return -1;
2279 if (save(self, element, 0) < 0)
2280 return -1;
2281 }
2282
2283 return 0;
2284}
2285
2286/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2287 * used across protocols to minimize the space needed to pickle them.
2288 * Tuples are also the only builtin immutable type that can be recursive
2289 * (a tuple can be reached from itself), and that requires some subtle
2290 * magic so that it works in all cases. IOW, this is a long routine.
2291 */
2292static int
2293save_tuple(PicklerObject *self, PyObject *obj)
2294{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002295 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002296
2297 const char mark_op = MARK;
2298 const char tuple_op = TUPLE;
2299 const char pop_op = POP;
2300 const char pop_mark_op = POP_MARK;
2301 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2302
2303 if ((len = PyTuple_Size(obj)) < 0)
2304 return -1;
2305
2306 if (len == 0) {
2307 char pdata[2];
2308
2309 if (self->proto) {
2310 pdata[0] = EMPTY_TUPLE;
2311 len = 1;
2312 }
2313 else {
2314 pdata[0] = MARK;
2315 pdata[1] = TUPLE;
2316 len = 2;
2317 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002318 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002319 return -1;
2320 return 0;
2321 }
2322
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002323 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002324 * saving the tuple elements, the tuple must be recursive, in
2325 * which case we'll pop everything we put on the stack, and fetch
2326 * its value from the memo.
2327 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002328 if (len <= 3 && self->proto >= 2) {
2329 /* Use TUPLE{1,2,3} opcodes. */
2330 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002331 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002332
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002333 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002334 /* pop the len elements */
2335 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002336 if (_Pickler_Write(self, &pop_op, 1) < 0)
2337 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002338 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002339 if (memo_get(self, obj) < 0)
2340 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002341
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002342 return 0;
2343 }
2344 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002345 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2346 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002347 }
2348 goto memoize;
2349 }
2350
2351 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2352 * Generate MARK e1 e2 ... TUPLE
2353 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002354 if (_Pickler_Write(self, &mark_op, 1) < 0)
2355 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002356
2357 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002358 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002359
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002360 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002361 /* pop the stack stuff we pushed */
2362 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002363 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2364 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002365 }
2366 else {
2367 /* Note that we pop one more than len, to remove
2368 * the MARK too.
2369 */
2370 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002371 if (_Pickler_Write(self, &pop_op, 1) < 0)
2372 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002373 }
2374 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002375 if (memo_get(self, obj) < 0)
2376 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002377
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002378 return 0;
2379 }
2380 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002381 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2382 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002383 }
2384
2385 memoize:
2386 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002387 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002388
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002389 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002390}
2391
2392/* iter is an iterator giving items, and we batch up chunks of
2393 * MARK item item ... item APPENDS
2394 * opcode sequences. Calling code should have arranged to first create an
2395 * empty list, or list-like object, for the APPENDS to operate on.
2396 * Returns 0 on success, <0 on error.
2397 */
2398static int
2399batch_list(PicklerObject *self, PyObject *iter)
2400{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002401 PyObject *obj = NULL;
2402 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002403 int i, n;
2404
2405 const char mark_op = MARK;
2406 const char append_op = APPEND;
2407 const char appends_op = APPENDS;
2408
2409 assert(iter != NULL);
2410
2411 /* XXX: I think this function could be made faster by avoiding the
2412 iterator interface and fetching objects directly from list using
2413 PyList_GET_ITEM.
2414 */
2415
2416 if (self->proto == 0) {
2417 /* APPENDS isn't available; do one at a time. */
2418 for (;;) {
2419 obj = PyIter_Next(iter);
2420 if (obj == NULL) {
2421 if (PyErr_Occurred())
2422 return -1;
2423 break;
2424 }
2425 i = save(self, obj, 0);
2426 Py_DECREF(obj);
2427 if (i < 0)
2428 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002429 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002430 return -1;
2431 }
2432 return 0;
2433 }
2434
2435 /* proto > 0: write in batches of BATCHSIZE. */
2436 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002437 /* Get first item */
2438 firstitem = PyIter_Next(iter);
2439 if (firstitem == NULL) {
2440 if (PyErr_Occurred())
2441 goto error;
2442
2443 /* nothing more to add */
2444 break;
2445 }
2446
2447 /* Try to get a second item */
2448 obj = PyIter_Next(iter);
2449 if (obj == NULL) {
2450 if (PyErr_Occurred())
2451 goto error;
2452
2453 /* Only one item to write */
2454 if (save(self, firstitem, 0) < 0)
2455 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002456 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002457 goto error;
2458 Py_CLEAR(firstitem);
2459 break;
2460 }
2461
2462 /* More than one item to write */
2463
2464 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002465 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002466 goto error;
2467
2468 if (save(self, firstitem, 0) < 0)
2469 goto error;
2470 Py_CLEAR(firstitem);
2471 n = 1;
2472
2473 /* Fetch and save up to BATCHSIZE items */
2474 while (obj) {
2475 if (save(self, obj, 0) < 0)
2476 goto error;
2477 Py_CLEAR(obj);
2478 n += 1;
2479
2480 if (n == BATCHSIZE)
2481 break;
2482
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002483 obj = PyIter_Next(iter);
2484 if (obj == NULL) {
2485 if (PyErr_Occurred())
2486 goto error;
2487 break;
2488 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002489 }
2490
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002491 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002492 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002493
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002494 } while (n == BATCHSIZE);
2495 return 0;
2496
2497 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002498 Py_XDECREF(firstitem);
2499 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002500 return -1;
2501}
2502
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002503/* This is a variant of batch_list() above, specialized for lists (with no
2504 * support for list subclasses). Like batch_list(), we batch up chunks of
2505 * MARK item item ... item APPENDS
2506 * opcode sequences. Calling code should have arranged to first create an
2507 * empty list, or list-like object, for the APPENDS to operate on.
2508 * Returns 0 on success, -1 on error.
2509 *
2510 * This version is considerably faster than batch_list(), if less general.
2511 *
2512 * Note that this only works for protocols > 0.
2513 */
2514static int
2515batch_list_exact(PicklerObject *self, PyObject *obj)
2516{
2517 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002518 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002519
2520 const char append_op = APPEND;
2521 const char appends_op = APPENDS;
2522 const char mark_op = MARK;
2523
2524 assert(obj != NULL);
2525 assert(self->proto > 0);
2526 assert(PyList_CheckExact(obj));
2527
2528 if (PyList_GET_SIZE(obj) == 1) {
2529 item = PyList_GET_ITEM(obj, 0);
2530 if (save(self, item, 0) < 0)
2531 return -1;
2532 if (_Pickler_Write(self, &append_op, 1) < 0)
2533 return -1;
2534 return 0;
2535 }
2536
2537 /* Write in batches of BATCHSIZE. */
2538 total = 0;
2539 do {
2540 this_batch = 0;
2541 if (_Pickler_Write(self, &mark_op, 1) < 0)
2542 return -1;
2543 while (total < PyList_GET_SIZE(obj)) {
2544 item = PyList_GET_ITEM(obj, total);
2545 if (save(self, item, 0) < 0)
2546 return -1;
2547 total++;
2548 if (++this_batch == BATCHSIZE)
2549 break;
2550 }
2551 if (_Pickler_Write(self, &appends_op, 1) < 0)
2552 return -1;
2553
2554 } while (total < PyList_GET_SIZE(obj));
2555
2556 return 0;
2557}
2558
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002559static int
2560save_list(PicklerObject *self, PyObject *obj)
2561{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002562 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002563 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002564 int status = 0;
2565
2566 if (self->fast && !fast_save_enter(self, obj))
2567 goto error;
2568
2569 /* Create an empty list. */
2570 if (self->bin) {
2571 header[0] = EMPTY_LIST;
2572 len = 1;
2573 }
2574 else {
2575 header[0] = MARK;
2576 header[1] = LIST;
2577 len = 2;
2578 }
2579
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002580 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002581 goto error;
2582
2583 /* Get list length, and bow out early if empty. */
2584 if ((len = PyList_Size(obj)) < 0)
2585 goto error;
2586
2587 if (memo_put(self, obj) < 0)
2588 goto error;
2589
2590 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002591 /* Materialize the list elements. */
2592 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002593 if (Py_EnterRecursiveCall(" while pickling an object"))
2594 goto error;
2595 status = batch_list_exact(self, obj);
2596 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002597 } else {
2598 PyObject *iter = PyObject_GetIter(obj);
2599 if (iter == NULL)
2600 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002601
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002602 if (Py_EnterRecursiveCall(" while pickling an object")) {
2603 Py_DECREF(iter);
2604 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002605 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002606 status = batch_list(self, iter);
2607 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002608 Py_DECREF(iter);
2609 }
2610 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002611 if (0) {
2612 error:
2613 status = -1;
2614 }
2615
2616 if (self->fast && !fast_save_leave(self, obj))
2617 status = -1;
2618
2619 return status;
2620}
2621
2622/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2623 * MARK key value ... key value SETITEMS
2624 * opcode sequences. Calling code should have arranged to first create an
2625 * empty dict, or dict-like object, for the SETITEMS to operate on.
2626 * Returns 0 on success, <0 on error.
2627 *
2628 * This is very much like batch_list(). The difference between saving
2629 * elements directly, and picking apart two-tuples, is so long-winded at
2630 * the C level, though, that attempts to combine these routines were too
2631 * ugly to bear.
2632 */
2633static int
2634batch_dict(PicklerObject *self, PyObject *iter)
2635{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002636 PyObject *obj = NULL;
2637 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002638 int i, n;
2639
2640 const char mark_op = MARK;
2641 const char setitem_op = SETITEM;
2642 const char setitems_op = SETITEMS;
2643
2644 assert(iter != NULL);
2645
2646 if (self->proto == 0) {
2647 /* SETITEMS isn't available; do one at a time. */
2648 for (;;) {
2649 obj = PyIter_Next(iter);
2650 if (obj == NULL) {
2651 if (PyErr_Occurred())
2652 return -1;
2653 break;
2654 }
2655 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2656 PyErr_SetString(PyExc_TypeError, "dict items "
2657 "iterator must return 2-tuples");
2658 return -1;
2659 }
2660 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2661 if (i >= 0)
2662 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2663 Py_DECREF(obj);
2664 if (i < 0)
2665 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002666 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002667 return -1;
2668 }
2669 return 0;
2670 }
2671
2672 /* proto > 0: write in batches of BATCHSIZE. */
2673 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002674 /* Get first item */
2675 firstitem = PyIter_Next(iter);
2676 if (firstitem == NULL) {
2677 if (PyErr_Occurred())
2678 goto error;
2679
2680 /* nothing more to add */
2681 break;
2682 }
2683 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2684 PyErr_SetString(PyExc_TypeError, "dict items "
2685 "iterator must return 2-tuples");
2686 goto error;
2687 }
2688
2689 /* Try to get a second item */
2690 obj = PyIter_Next(iter);
2691 if (obj == NULL) {
2692 if (PyErr_Occurred())
2693 goto error;
2694
2695 /* Only one item to write */
2696 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2697 goto error;
2698 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2699 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002700 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002701 goto error;
2702 Py_CLEAR(firstitem);
2703 break;
2704 }
2705
2706 /* More than one item to write */
2707
2708 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002709 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002710 goto error;
2711
2712 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2713 goto error;
2714 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2715 goto error;
2716 Py_CLEAR(firstitem);
2717 n = 1;
2718
2719 /* Fetch and save up to BATCHSIZE items */
2720 while (obj) {
2721 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2722 PyErr_SetString(PyExc_TypeError, "dict items "
2723 "iterator must return 2-tuples");
2724 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002725 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002726 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2727 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2728 goto error;
2729 Py_CLEAR(obj);
2730 n += 1;
2731
2732 if (n == BATCHSIZE)
2733 break;
2734
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002735 obj = PyIter_Next(iter);
2736 if (obj == NULL) {
2737 if (PyErr_Occurred())
2738 goto error;
2739 break;
2740 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002741 }
2742
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002743 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002744 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002745
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002746 } while (n == BATCHSIZE);
2747 return 0;
2748
2749 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002750 Py_XDECREF(firstitem);
2751 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002752 return -1;
2753}
2754
Collin Winter5c9b02d2009-05-25 05:43:30 +00002755/* This is a variant of batch_dict() above that specializes for dicts, with no
2756 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2757 * MARK key value ... key value SETITEMS
2758 * opcode sequences. Calling code should have arranged to first create an
2759 * empty dict, or dict-like object, for the SETITEMS to operate on.
2760 * Returns 0 on success, -1 on error.
2761 *
2762 * Note that this currently doesn't work for protocol 0.
2763 */
2764static int
2765batch_dict_exact(PicklerObject *self, PyObject *obj)
2766{
2767 PyObject *key = NULL, *value = NULL;
2768 int i;
2769 Py_ssize_t dict_size, ppos = 0;
2770
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002771 const char mark_op = MARK;
2772 const char setitem_op = SETITEM;
2773 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002774
2775 assert(obj != NULL);
2776 assert(self->proto > 0);
2777
2778 dict_size = PyDict_Size(obj);
2779
2780 /* Special-case len(d) == 1 to save space. */
2781 if (dict_size == 1) {
2782 PyDict_Next(obj, &ppos, &key, &value);
2783 if (save(self, key, 0) < 0)
2784 return -1;
2785 if (save(self, value, 0) < 0)
2786 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002787 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002788 return -1;
2789 return 0;
2790 }
2791
2792 /* Write in batches of BATCHSIZE. */
2793 do {
2794 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002795 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002796 return -1;
2797 while (PyDict_Next(obj, &ppos, &key, &value)) {
2798 if (save(self, key, 0) < 0)
2799 return -1;
2800 if (save(self, value, 0) < 0)
2801 return -1;
2802 if (++i == BATCHSIZE)
2803 break;
2804 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002805 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002806 return -1;
2807 if (PyDict_Size(obj) != dict_size) {
2808 PyErr_Format(
2809 PyExc_RuntimeError,
2810 "dictionary changed size during iteration");
2811 return -1;
2812 }
2813
2814 } while (i == BATCHSIZE);
2815 return 0;
2816}
2817
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002818static int
2819save_dict(PicklerObject *self, PyObject *obj)
2820{
2821 PyObject *items, *iter;
2822 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002823 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002824 int status = 0;
2825
2826 if (self->fast && !fast_save_enter(self, obj))
2827 goto error;
2828
2829 /* Create an empty dict. */
2830 if (self->bin) {
2831 header[0] = EMPTY_DICT;
2832 len = 1;
2833 }
2834 else {
2835 header[0] = MARK;
2836 header[1] = DICT;
2837 len = 2;
2838 }
2839
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002840 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002841 goto error;
2842
2843 /* Get dict size, and bow out early if empty. */
2844 if ((len = PyDict_Size(obj)) < 0)
2845 goto error;
2846
2847 if (memo_put(self, obj) < 0)
2848 goto error;
2849
2850 if (len != 0) {
2851 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002852 if (PyDict_CheckExact(obj) && self->proto > 0) {
2853 /* We can take certain shortcuts if we know this is a dict and
2854 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002855 if (Py_EnterRecursiveCall(" while pickling an object"))
2856 goto error;
2857 status = batch_dict_exact(self, obj);
2858 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002859 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002860 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002861
2862 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002863 if (items == NULL)
2864 goto error;
2865 iter = PyObject_GetIter(items);
2866 Py_DECREF(items);
2867 if (iter == NULL)
2868 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002869 if (Py_EnterRecursiveCall(" while pickling an object")) {
2870 Py_DECREF(iter);
2871 goto error;
2872 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002873 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002874 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002875 Py_DECREF(iter);
2876 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002877 }
2878
2879 if (0) {
2880 error:
2881 status = -1;
2882 }
2883
2884 if (self->fast && !fast_save_leave(self, obj))
2885 status = -1;
2886
2887 return status;
2888}
2889
2890static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002891save_set(PicklerObject *self, PyObject *obj)
2892{
2893 PyObject *item;
2894 int i;
2895 Py_ssize_t set_size, ppos = 0;
2896 Py_hash_t hash;
2897
2898 const char empty_set_op = EMPTY_SET;
2899 const char mark_op = MARK;
2900 const char additems_op = ADDITEMS;
2901
2902 if (self->proto < 4) {
2903 PyObject *items;
2904 PyObject *reduce_value;
2905 int status;
2906
2907 items = PySequence_List(obj);
2908 if (items == NULL) {
2909 return -1;
2910 }
2911 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2912 Py_DECREF(items);
2913 if (reduce_value == NULL) {
2914 return -1;
2915 }
2916 /* save_reduce() will memoize the object automatically. */
2917 status = save_reduce(self, reduce_value, obj);
2918 Py_DECREF(reduce_value);
2919 return status;
2920 }
2921
2922 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2923 return -1;
2924
2925 if (memo_put(self, obj) < 0)
2926 return -1;
2927
2928 set_size = PySet_GET_SIZE(obj);
2929 if (set_size == 0)
2930 return 0; /* nothing to do */
2931
2932 /* Write in batches of BATCHSIZE. */
2933 do {
2934 i = 0;
2935 if (_Pickler_Write(self, &mark_op, 1) < 0)
2936 return -1;
2937 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2938 if (save(self, item, 0) < 0)
2939 return -1;
2940 if (++i == BATCHSIZE)
2941 break;
2942 }
2943 if (_Pickler_Write(self, &additems_op, 1) < 0)
2944 return -1;
2945 if (PySet_GET_SIZE(obj) != set_size) {
2946 PyErr_Format(
2947 PyExc_RuntimeError,
2948 "set changed size during iteration");
2949 return -1;
2950 }
2951 } while (i == BATCHSIZE);
2952
2953 return 0;
2954}
2955
2956static int
2957save_frozenset(PicklerObject *self, PyObject *obj)
2958{
2959 PyObject *iter;
2960
2961 const char mark_op = MARK;
2962 const char frozenset_op = FROZENSET;
2963
2964 if (self->fast && !fast_save_enter(self, obj))
2965 return -1;
2966
2967 if (self->proto < 4) {
2968 PyObject *items;
2969 PyObject *reduce_value;
2970 int status;
2971
2972 items = PySequence_List(obj);
2973 if (items == NULL) {
2974 return -1;
2975 }
2976 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2977 items);
2978 Py_DECREF(items);
2979 if (reduce_value == NULL) {
2980 return -1;
2981 }
2982 /* save_reduce() will memoize the object automatically. */
2983 status = save_reduce(self, reduce_value, obj);
2984 Py_DECREF(reduce_value);
2985 return status;
2986 }
2987
2988 if (_Pickler_Write(self, &mark_op, 1) < 0)
2989 return -1;
2990
2991 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002992 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002993 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002994 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002995 for (;;) {
2996 PyObject *item;
2997
2998 item = PyIter_Next(iter);
2999 if (item == NULL) {
3000 if (PyErr_Occurred()) {
3001 Py_DECREF(iter);
3002 return -1;
3003 }
3004 break;
3005 }
3006 if (save(self, item, 0) < 0) {
3007 Py_DECREF(item);
3008 Py_DECREF(iter);
3009 return -1;
3010 }
3011 Py_DECREF(item);
3012 }
3013 Py_DECREF(iter);
3014
3015 /* If the object is already in the memo, this means it is
3016 recursive. In this case, throw away everything we put on the
3017 stack, and fetch the object back from the memo. */
3018 if (PyMemoTable_Get(self->memo, obj)) {
3019 const char pop_mark_op = POP_MARK;
3020
3021 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3022 return -1;
3023 if (memo_get(self, obj) < 0)
3024 return -1;
3025 return 0;
3026 }
3027
3028 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3029 return -1;
3030 if (memo_put(self, obj) < 0)
3031 return -1;
3032
3033 return 0;
3034}
3035
3036static int
3037fix_imports(PyObject **module_name, PyObject **global_name)
3038{
3039 PyObject *key;
3040 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003041 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003042
3043 key = PyTuple_Pack(2, *module_name, *global_name);
3044 if (key == NULL)
3045 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003046 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003047 Py_DECREF(key);
3048 if (item) {
3049 PyObject *fixed_module_name;
3050 PyObject *fixed_global_name;
3051
3052 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3053 PyErr_Format(PyExc_RuntimeError,
3054 "_compat_pickle.REVERSE_NAME_MAPPING values "
3055 "should be 2-tuples, not %.200s",
3056 Py_TYPE(item)->tp_name);
3057 return -1;
3058 }
3059 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3060 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3061 if (!PyUnicode_Check(fixed_module_name) ||
3062 !PyUnicode_Check(fixed_global_name)) {
3063 PyErr_Format(PyExc_RuntimeError,
3064 "_compat_pickle.REVERSE_NAME_MAPPING values "
3065 "should be pairs of str, not (%.200s, %.200s)",
3066 Py_TYPE(fixed_module_name)->tp_name,
3067 Py_TYPE(fixed_global_name)->tp_name);
3068 return -1;
3069 }
3070
3071 Py_CLEAR(*module_name);
3072 Py_CLEAR(*global_name);
3073 Py_INCREF(fixed_module_name);
3074 Py_INCREF(fixed_global_name);
3075 *module_name = fixed_module_name;
3076 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003077 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003078 }
3079 else if (PyErr_Occurred()) {
3080 return -1;
3081 }
3082
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003083 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003084 if (item) {
3085 if (!PyUnicode_Check(item)) {
3086 PyErr_Format(PyExc_RuntimeError,
3087 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3088 "should be strings, not %.200s",
3089 Py_TYPE(item)->tp_name);
3090 return -1;
3091 }
3092 Py_CLEAR(*module_name);
3093 Py_INCREF(item);
3094 *module_name = item;
3095 }
3096 else if (PyErr_Occurred()) {
3097 return -1;
3098 }
3099
3100 return 0;
3101}
3102
3103static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003104save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3105{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003106 PyObject *global_name = NULL;
3107 PyObject *module_name = NULL;
3108 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003109 PyObject *parent = NULL;
3110 PyObject *dotted_path = NULL;
3111 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003112 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003113 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003114 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003115 _Py_IDENTIFIER(__name__);
3116 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003117
3118 const char global_op = GLOBAL;
3119
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003120 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003121 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003122 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003123 }
3124 else {
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003125 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3126 if (global_name == NULL) {
3127 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3128 goto error;
3129 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003130 }
3131 if (global_name == NULL) {
3132 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3133 if (global_name == NULL)
3134 goto error;
3135 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003136 }
3137
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003138 dotted_path = get_dotted_path(module, global_name);
3139 if (dotted_path == NULL)
3140 goto error;
3141 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003142 if (module_name == NULL)
3143 goto error;
3144
3145 /* XXX: Change to use the import C API directly with level=0 to disallow
3146 relative imports.
3147
3148 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3149 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3150 custom import functions (IMHO, this would be a nice security
3151 feature). The import C API would need to be extended to support the
3152 extra parameters of __import__ to fix that. */
3153 module = PyImport_Import(module_name);
3154 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003155 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003156 "Can't pickle %R: import of module %R failed",
3157 obj, module_name);
3158 goto error;
3159 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003160 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3161 Py_INCREF(lastname);
3162 cls = get_deep_attribute(module, dotted_path, &parent);
3163 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003164 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003165 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003166 "Can't pickle %R: attribute lookup %S on %S failed",
3167 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003168 goto error;
3169 }
3170 if (cls != obj) {
3171 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003172 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003173 "Can't pickle %R: it's not the same object as %S.%S",
3174 obj, module_name, global_name);
3175 goto error;
3176 }
3177 Py_DECREF(cls);
3178
3179 if (self->proto >= 2) {
3180 /* See whether this is in the extension registry, and if
3181 * so generate an EXT opcode.
3182 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003183 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003184 PyObject *code_obj; /* extension code as Python object */
3185 long code; /* extension code as C value */
3186 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003187 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003188
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003189 extension_key = PyTuple_Pack(2, module_name, global_name);
3190 if (extension_key == NULL) {
3191 goto error;
3192 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003193 code_obj = PyDict_GetItemWithError(st->extension_registry,
3194 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003195 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003196 /* The object is not registered in the extension registry.
3197 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003198 if (code_obj == NULL) {
3199 if (PyErr_Occurred()) {
3200 goto error;
3201 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003202 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003203 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003204
3205 /* XXX: pickle.py doesn't check neither the type, nor the range
3206 of the value returned by the extension_registry. It should for
3207 consistency. */
3208
3209 /* Verify code_obj has the right type and value. */
3210 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003211 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003212 "Can't pickle %R: extension code %R isn't an integer",
3213 obj, code_obj);
3214 goto error;
3215 }
3216 code = PyLong_AS_LONG(code_obj);
3217 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003218 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003219 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3220 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003221 goto error;
3222 }
3223
3224 /* Generate an EXT opcode. */
3225 if (code <= 0xff) {
3226 pdata[0] = EXT1;
3227 pdata[1] = (unsigned char)code;
3228 n = 2;
3229 }
3230 else if (code <= 0xffff) {
3231 pdata[0] = EXT2;
3232 pdata[1] = (unsigned char)(code & 0xff);
3233 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3234 n = 3;
3235 }
3236 else {
3237 pdata[0] = EXT4;
3238 pdata[1] = (unsigned char)(code & 0xff);
3239 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3240 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3241 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3242 n = 5;
3243 }
3244
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003245 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003246 goto error;
3247 }
3248 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003249 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003250 if (parent == module) {
3251 Py_INCREF(lastname);
3252 Py_DECREF(global_name);
3253 global_name = lastname;
3254 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003255 if (self->proto >= 4) {
3256 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003257
Christian Heimese8b1ba12013-11-23 21:13:39 +01003258 if (save(self, module_name, 0) < 0)
3259 goto error;
3260 if (save(self, global_name, 0) < 0)
3261 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003262
3263 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3264 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003265 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003266 else if (parent != module) {
3267 PickleState *st = _Pickle_GetGlobalState();
3268 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3269 st->getattr, parent, lastname);
3270 status = save_reduce(self, reduce_value, NULL);
3271 Py_DECREF(reduce_value);
3272 if (status < 0)
3273 goto error;
3274 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003275 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003276 /* Generate a normal global opcode if we are using a pickle
3277 protocol < 4, or if the object is not registered in the
3278 extension registry. */
3279 PyObject *encoded;
3280 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003281
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003282 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003283 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003284
3285 /* For protocol < 3 and if the user didn't request against doing
3286 so, we convert module names to the old 2.x module names. */
3287 if (self->proto < 3 && self->fix_imports) {
3288 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003289 goto error;
3290 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003291 }
3292
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003293 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3294 both the module name and the global name using UTF-8. We do so
3295 only when we are using the pickle protocol newer than version
3296 3. This is to ensure compatibility with older Unpickler running
3297 on Python 2.x. */
3298 if (self->proto == 3) {
3299 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003300 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003301 else {
3302 unicode_encoder = PyUnicode_AsASCIIString;
3303 }
3304 encoded = unicode_encoder(module_name);
3305 if (encoded == NULL) {
3306 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003307 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003308 "can't pickle module identifier '%S' using "
3309 "pickle protocol %i",
3310 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003311 goto error;
3312 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003313 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3314 PyBytes_GET_SIZE(encoded)) < 0) {
3315 Py_DECREF(encoded);
3316 goto error;
3317 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003318 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003319 if(_Pickler_Write(self, "\n", 1) < 0)
3320 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003321
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003322 /* Save the name of the module. */
3323 encoded = unicode_encoder(global_name);
3324 if (encoded == NULL) {
3325 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003326 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003327 "can't pickle global identifier '%S' using "
3328 "pickle protocol %i",
3329 global_name, self->proto);
3330 goto error;
3331 }
3332 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3333 PyBytes_GET_SIZE(encoded)) < 0) {
3334 Py_DECREF(encoded);
3335 goto error;
3336 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003337 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003338 if (_Pickler_Write(self, "\n", 1) < 0)
3339 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003340 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003341 /* Memoize the object. */
3342 if (memo_put(self, obj) < 0)
3343 goto error;
3344 }
3345
3346 if (0) {
3347 error:
3348 status = -1;
3349 }
3350 Py_XDECREF(module_name);
3351 Py_XDECREF(global_name);
3352 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003353 Py_XDECREF(parent);
3354 Py_XDECREF(dotted_path);
3355 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003356
3357 return status;
3358}
3359
3360static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003361save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3362{
3363 PyObject *reduce_value;
3364 int status;
3365
3366 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3367 if (reduce_value == NULL) {
3368 return -1;
3369 }
3370 status = save_reduce(self, reduce_value, obj);
3371 Py_DECREF(reduce_value);
3372 return status;
3373}
3374
3375static int
3376save_type(PicklerObject *self, PyObject *obj)
3377{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003378 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003379 return save_singleton_type(self, obj, Py_None);
3380 }
3381 else if (obj == (PyObject *)&PyEllipsis_Type) {
3382 return save_singleton_type(self, obj, Py_Ellipsis);
3383 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003384 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003385 return save_singleton_type(self, obj, Py_NotImplemented);
3386 }
3387 return save_global(self, obj, NULL);
3388}
3389
3390static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003391save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3392{
3393 PyObject *pid = NULL;
3394 int status = 0;
3395
3396 const char persid_op = PERSID;
3397 const char binpersid_op = BINPERSID;
3398
3399 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003400 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003401 if (pid == NULL)
3402 return -1;
3403
3404 if (pid != Py_None) {
3405 if (self->bin) {
3406 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003407 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003408 goto error;
3409 }
3410 else {
3411 PyObject *pid_str = NULL;
3412 char *pid_ascii_bytes;
3413 Py_ssize_t size;
3414
3415 pid_str = PyObject_Str(pid);
3416 if (pid_str == NULL)
3417 goto error;
3418
3419 /* XXX: Should it check whether the persistent id only contains
3420 ASCII characters? And what if the pid contains embedded
3421 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003422 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003423 Py_DECREF(pid_str);
3424 if (pid_ascii_bytes == NULL)
3425 goto error;
3426
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003427 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3428 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3429 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003430 goto error;
3431 }
3432 status = 1;
3433 }
3434
3435 if (0) {
3436 error:
3437 status = -1;
3438 }
3439 Py_XDECREF(pid);
3440
3441 return status;
3442}
3443
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003444static PyObject *
3445get_class(PyObject *obj)
3446{
3447 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003448 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003449
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003450 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003451 if (cls == NULL) {
3452 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3453 PyErr_Clear();
3454 cls = (PyObject *) Py_TYPE(obj);
3455 Py_INCREF(cls);
3456 }
3457 }
3458 return cls;
3459}
3460
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003461/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3462 * appropriate __reduce__ method for obj.
3463 */
3464static int
3465save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3466{
3467 PyObject *callable;
3468 PyObject *argtup;
3469 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003470 PyObject *listitems = Py_None;
3471 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003472 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003473 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003474 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003475
3476 const char reduce_op = REDUCE;
3477 const char build_op = BUILD;
3478 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003479 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003480
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003481 size = PyTuple_Size(args);
3482 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003483 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003484 "__reduce__ must contain 2 through 5 elements");
3485 return -1;
3486 }
3487
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003488 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3489 &callable, &argtup, &state, &listitems, &dictitems))
3490 return -1;
3491
3492 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003493 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003494 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003495 return -1;
3496 }
3497 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003498 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003499 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003500 return -1;
3501 }
3502
3503 if (state == Py_None)
3504 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003505
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003506 if (listitems == Py_None)
3507 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003508 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003509 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003510 "returned by __reduce__ must be an iterator, not %s",
3511 Py_TYPE(listitems)->tp_name);
3512 return -1;
3513 }
3514
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003515 if (dictitems == Py_None)
3516 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003517 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003518 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003519 "returned by __reduce__ must be an iterator, not %s",
3520 Py_TYPE(dictitems)->tp_name);
3521 return -1;
3522 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003523
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003524 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003525 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003526 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003527
Victor Stinner804e05e2013-11-14 01:26:17 +01003528 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003529 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003530 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003531 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003532 }
3533 PyErr_Clear();
3534 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003535 else if (PyUnicode_Check(name)) {
3536 if (self->proto >= 4) {
3537 _Py_IDENTIFIER(__newobj_ex__);
3538 use_newobj_ex = PyUnicode_Compare(
3539 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3540 }
3541 if (!use_newobj_ex) {
3542 _Py_IDENTIFIER(__newobj__);
3543 use_newobj = PyUnicode_Compare(
3544 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
3545 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003546 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003547 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003548 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003549
3550 if (use_newobj_ex) {
3551 PyObject *cls;
3552 PyObject *args;
3553 PyObject *kwargs;
3554
3555 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003556 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003557 "length of the NEWOBJ_EX argument tuple must be "
3558 "exactly 3, not %zd", Py_SIZE(argtup));
3559 return -1;
3560 }
3561
3562 cls = PyTuple_GET_ITEM(argtup, 0);
3563 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003564 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003565 "first item from NEWOBJ_EX argument tuple must "
3566 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3567 return -1;
3568 }
3569 args = PyTuple_GET_ITEM(argtup, 1);
3570 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003571 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003572 "second item from NEWOBJ_EX argument tuple must "
3573 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3574 return -1;
3575 }
3576 kwargs = PyTuple_GET_ITEM(argtup, 2);
3577 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003578 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003579 "third item from NEWOBJ_EX argument tuple must "
3580 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3581 return -1;
3582 }
3583
3584 if (save(self, cls, 0) < 0 ||
3585 save(self, args, 0) < 0 ||
3586 save(self, kwargs, 0) < 0 ||
3587 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3588 return -1;
3589 }
3590 }
3591 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003592 PyObject *cls;
3593 PyObject *newargtup;
3594 PyObject *obj_class;
3595 int p;
3596
3597 /* Sanity checks. */
3598 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003599 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003600 return -1;
3601 }
3602
3603 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003604 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003605 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003606 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003607 return -1;
3608 }
3609
3610 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003611 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003612 p = obj_class != cls; /* true iff a problem */
3613 Py_DECREF(obj_class);
3614 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003615 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003616 "__newobj__ args has the wrong class");
3617 return -1;
3618 }
3619 }
3620 /* XXX: These calls save() are prone to infinite recursion. Imagine
3621 what happen if the value returned by the __reduce__() method of
3622 some extension type contains another object of the same type. Ouch!
3623
3624 Here is a quick example, that I ran into, to illustrate what I
3625 mean:
3626
3627 >>> import pickle, copyreg
3628 >>> copyreg.dispatch_table.pop(complex)
3629 >>> pickle.dumps(1+2j)
3630 Traceback (most recent call last):
3631 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04003632 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003633
3634 Removing the complex class from copyreg.dispatch_table made the
3635 __reduce_ex__() method emit another complex object:
3636
3637 >>> (1+1j).__reduce_ex__(2)
3638 (<function __newobj__ at 0xb7b71c3c>,
3639 (<class 'complex'>, (1+1j)), None, None, None)
3640
3641 Thus when save() was called on newargstup (the 2nd item) recursion
3642 ensued. Of course, the bug was in the complex class which had a
3643 broken __getnewargs__() that emitted another complex object. But,
3644 the point, here, is it is quite easy to end up with a broken reduce
3645 function. */
3646
3647 /* Save the class and its __new__ arguments. */
3648 if (save(self, cls, 0) < 0)
3649 return -1;
3650
3651 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3652 if (newargtup == NULL)
3653 return -1;
3654
3655 p = save(self, newargtup, 0);
3656 Py_DECREF(newargtup);
3657 if (p < 0)
3658 return -1;
3659
3660 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003661 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003662 return -1;
3663 }
3664 else { /* Not using NEWOBJ. */
3665 if (save(self, callable, 0) < 0 ||
3666 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003667 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003668 return -1;
3669 }
3670
3671 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3672 the caller do not want to memoize the object. Not particularly useful,
3673 but that is to mimic the behavior save_reduce() in pickle.py when
3674 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003675 if (obj != NULL) {
3676 /* If the object is already in the memo, this means it is
3677 recursive. In this case, throw away everything we put on the
3678 stack, and fetch the object back from the memo. */
3679 if (PyMemoTable_Get(self->memo, obj)) {
3680 const char pop_op = POP;
3681
3682 if (_Pickler_Write(self, &pop_op, 1) < 0)
3683 return -1;
3684 if (memo_get(self, obj) < 0)
3685 return -1;
3686
3687 return 0;
3688 }
3689 else if (memo_put(self, obj) < 0)
3690 return -1;
3691 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003692
3693 if (listitems && batch_list(self, listitems) < 0)
3694 return -1;
3695
3696 if (dictitems && batch_dict(self, dictitems) < 0)
3697 return -1;
3698
3699 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003700 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003701 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003702 return -1;
3703 }
3704
3705 return 0;
3706}
3707
3708static int
3709save(PicklerObject *self, PyObject *obj, int pers_save)
3710{
3711 PyTypeObject *type;
3712 PyObject *reduce_func = NULL;
3713 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003714 int status = 0;
3715
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003716 if (_Pickler_OpcodeBoundary(self) < 0)
3717 return -1;
3718
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003719 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003720 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003721
3722 /* The extra pers_save argument is necessary to avoid calling save_pers()
3723 on its returned object. */
3724 if (!pers_save && self->pers_func) {
3725 /* save_pers() returns:
3726 -1 to signal an error;
3727 0 if it did nothing successfully;
3728 1 if a persistent id was saved.
3729 */
3730 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3731 goto done;
3732 }
3733
3734 type = Py_TYPE(obj);
3735
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003736 /* The old cPickle had an optimization that used switch-case statement
3737 dispatching on the first letter of the type name. This has was removed
3738 since benchmarks shown that this optimization was actually slowing
3739 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003740
3741 /* Atom types; these aren't memoized, so don't check the memo. */
3742
3743 if (obj == Py_None) {
3744 status = save_none(self, obj);
3745 goto done;
3746 }
3747 else if (obj == Py_False || obj == Py_True) {
3748 status = save_bool(self, obj);
3749 goto done;
3750 }
3751 else if (type == &PyLong_Type) {
3752 status = save_long(self, obj);
3753 goto done;
3754 }
3755 else if (type == &PyFloat_Type) {
3756 status = save_float(self, obj);
3757 goto done;
3758 }
3759
3760 /* Check the memo to see if it has the object. If so, generate
3761 a GET (or BINGET) opcode, instead of pickling the object
3762 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003763 if (PyMemoTable_Get(self->memo, obj)) {
3764 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765 goto error;
3766 goto done;
3767 }
3768
3769 if (type == &PyBytes_Type) {
3770 status = save_bytes(self, obj);
3771 goto done;
3772 }
3773 else if (type == &PyUnicode_Type) {
3774 status = save_unicode(self, obj);
3775 goto done;
3776 }
3777 else if (type == &PyDict_Type) {
3778 status = save_dict(self, obj);
3779 goto done;
3780 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003781 else if (type == &PySet_Type) {
3782 status = save_set(self, obj);
3783 goto done;
3784 }
3785 else if (type == &PyFrozenSet_Type) {
3786 status = save_frozenset(self, obj);
3787 goto done;
3788 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003789 else if (type == &PyList_Type) {
3790 status = save_list(self, obj);
3791 goto done;
3792 }
3793 else if (type == &PyTuple_Type) {
3794 status = save_tuple(self, obj);
3795 goto done;
3796 }
3797 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003798 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003799 goto done;
3800 }
3801 else if (type == &PyFunction_Type) {
3802 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003803 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003804 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003805
3806 /* XXX: This part needs some unit tests. */
3807
3808 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003809 * self.dispatch_table, copyreg.dispatch_table, the object's
3810 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003811 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003812 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003813 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003814 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3815 (PyObject *)type);
3816 if (reduce_func == NULL) {
3817 if (PyErr_Occurred()) {
3818 goto error;
3819 }
3820 } else {
3821 /* PyDict_GetItemWithError() returns a borrowed reference.
3822 Increase the reference count to be consistent with
3823 PyObject_GetItem and _PyObject_GetAttrId used below. */
3824 Py_INCREF(reduce_func);
3825 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003826 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003827 reduce_func = PyObject_GetItem(self->dispatch_table,
3828 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003829 if (reduce_func == NULL) {
3830 if (PyErr_ExceptionMatches(PyExc_KeyError))
3831 PyErr_Clear();
3832 else
3833 goto error;
3834 }
3835 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003836 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003837 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003838 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003839 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003840 else if (PyType_IsSubtype(type, &PyType_Type)) {
3841 status = save_global(self, obj, NULL);
3842 goto done;
3843 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003844 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003845 _Py_IDENTIFIER(__reduce__);
3846 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003847
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003848
3849 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3850 automatically defined as __reduce__. While this is convenient, this
3851 make it impossible to know which method was actually called. Of
3852 course, this is not a big deal. But still, it would be nice to let
3853 the user know which method was called when something go
3854 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3855 don't actually have to check for a __reduce__ method. */
3856
3857 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003858 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003859 if (reduce_func != NULL) {
3860 PyObject *proto;
3861 proto = PyLong_FromLong(self->proto);
3862 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003863 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003864 }
3865 }
3866 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003867 PickleState *st = _Pickle_GetGlobalState();
3868
3869 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003870 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003871 }
3872 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003873 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003874 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003875 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003876 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003877 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003878 PyObject *empty_tuple = PyTuple_New(0);
3879 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003880 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003881 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003882 }
3883 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003884 PyErr_Format(st->PicklingError,
3885 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003886 type->tp_name, obj);
3887 goto error;
3888 }
3889 }
3890 }
3891
3892 if (reduce_value == NULL)
3893 goto error;
3894
3895 if (PyUnicode_Check(reduce_value)) {
3896 status = save_global(self, obj, reduce_value);
3897 goto done;
3898 }
3899
3900 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003901 PickleState *st = _Pickle_GetGlobalState();
3902 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003903 "__reduce__ must return a string or tuple");
3904 goto error;
3905 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003906
3907 status = save_reduce(self, reduce_value, obj);
3908
3909 if (0) {
3910 error:
3911 status = -1;
3912 }
3913 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003914
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003915 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003916 Py_XDECREF(reduce_func);
3917 Py_XDECREF(reduce_value);
3918
3919 return status;
3920}
3921
3922static int
3923dump(PicklerObject *self, PyObject *obj)
3924{
3925 const char stop_op = STOP;
3926
3927 if (self->proto >= 2) {
3928 char header[2];
3929
3930 header[0] = PROTO;
3931 assert(self->proto >= 0 && self->proto < 256);
3932 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003933 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003934 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003935 if (self->proto >= 4)
3936 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003937 }
3938
3939 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003940 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003941 return -1;
3942
3943 return 0;
3944}
3945
Larry Hastings61272b72014-01-07 12:41:53 -08003946/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003947
3948_pickle.Pickler.clear_memo
3949
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003950Clears the pickler's "memo".
3951
3952The memo is the data structure that remembers which objects the
3953pickler has already seen, so that shared or recursive objects are
3954pickled by reference and not by value. This method is useful when
3955re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003956[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003957
Larry Hastings3cceb382014-01-04 11:09:09 -08003958static PyObject *
3959_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08003960/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003961{
3962 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003963 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003964
3965 Py_RETURN_NONE;
3966}
3967
Larry Hastings61272b72014-01-07 12:41:53 -08003968/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003969
3970_pickle.Pickler.dump
3971
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003972 obj: object
3973 /
3974
3975Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003976[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003977
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003978static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003979_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08003980/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003981{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003982 /* Check whether the Pickler was initialized correctly (issue3664).
3983 Developers often forget to call __init__() in their subclasses, which
3984 would trigger a segfault without this check. */
3985 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003986 PickleState *st = _Pickle_GetGlobalState();
3987 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003988 "Pickler.__init__() was not called by %s.__init__()",
3989 Py_TYPE(self)->tp_name);
3990 return NULL;
3991 }
3992
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003993 if (_Pickler_ClearBuffer(self) < 0)
3994 return NULL;
3995
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003996 if (dump(self, obj) < 0)
3997 return NULL;
3998
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003999 if (_Pickler_FlushToFile(self) < 0)
4000 return NULL;
4001
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004002 Py_RETURN_NONE;
4003}
4004
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004005/*[clinic input]
4006
4007_pickle.Pickler.__sizeof__ -> Py_ssize_t
4008
4009Returns size in memory, in bytes.
4010[clinic start generated code]*/
4011
4012static Py_ssize_t
4013_pickle_Pickler___sizeof___impl(PicklerObject *self)
4014/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4015{
4016 Py_ssize_t res, s;
4017
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004018 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004019 if (self->memo != NULL) {
4020 res += sizeof(PyMemoTable);
4021 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4022 }
4023 if (self->output_buffer != NULL) {
4024 s = _PySys_GetSizeOf(self->output_buffer);
4025 if (s == -1)
4026 return -1;
4027 res += s;
4028 }
4029 return res;
4030}
4031
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004032static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004033 _PICKLE_PICKLER_DUMP_METHODDEF
4034 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004035 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004036 {NULL, NULL} /* sentinel */
4037};
4038
4039static void
4040Pickler_dealloc(PicklerObject *self)
4041{
4042 PyObject_GC_UnTrack(self);
4043
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004044 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004045 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004046 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004047 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004048 Py_XDECREF(self->fast_memo);
4049
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004050 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004051
4052 Py_TYPE(self)->tp_free((PyObject *)self);
4053}
4054
4055static int
4056Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4057{
4058 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004059 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004060 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004061 Py_VISIT(self->fast_memo);
4062 return 0;
4063}
4064
4065static int
4066Pickler_clear(PicklerObject *self)
4067{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004068 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004069 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004070 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004071 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004072 Py_CLEAR(self->fast_memo);
4073
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004074 if (self->memo != NULL) {
4075 PyMemoTable *memo = self->memo;
4076 self->memo = NULL;
4077 PyMemoTable_Del(memo);
4078 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004079 return 0;
4080}
4081
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004082
Larry Hastings61272b72014-01-07 12:41:53 -08004083/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004084
4085_pickle.Pickler.__init__
4086
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004087 file: object
4088 protocol: object = NULL
4089 fix_imports: bool = True
4090
4091This takes a binary file for writing a pickle data stream.
4092
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004093The optional *protocol* argument tells the pickler to use the given
4094protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4095protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004096
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004097Specifying a negative protocol version selects the highest protocol
4098version supported. The higher the protocol used, the more recent the
4099version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004100
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004101The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004102bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004103writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004104this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004105
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004106If *fix_imports* is True and protocol is less than 3, pickle will try
4107to map the new Python 3 names to the old module names used in Python
41082, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004109[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004110
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004111static int
Larry Hastings89964c42015-04-14 18:07:59 -04004112_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4113 PyObject *protocol, int fix_imports)
Martin Panter2eb819f2015-11-02 04:04:57 +00004114/*[clinic end generated code: output=b5f31078dab17fb0 input=4faabdbc763c2389]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004115{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004116 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004117 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004118
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004119 /* In case of multiple __init__() calls, clear previous content. */
4120 if (self->write != NULL)
4121 (void)Pickler_clear(self);
4122
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004123 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004124 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004125
4126 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004127 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004128
4129 /* memo and output_buffer may have already been created in _Pickler_New */
4130 if (self->memo == NULL) {
4131 self->memo = PyMemoTable_New();
4132 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004133 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004134 }
4135 self->output_len = 0;
4136 if (self->output_buffer == NULL) {
4137 self->max_output_len = WRITE_BUF_SIZE;
4138 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4139 self->max_output_len);
4140 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004141 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004142 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004143
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004144 self->fast = 0;
4145 self->fast_nesting = 0;
4146 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004147 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004148 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4149 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4150 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004151 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004152 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004153 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004154 self->dispatch_table = NULL;
4155 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4156 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4157 &PyId_dispatch_table);
4158 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004159 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004160 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004161
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004162 return 0;
4163}
4164
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004165
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004166/* Define a proxy object for the Pickler's internal memo object. This is to
4167 * avoid breaking code like:
4168 * pickler.memo.clear()
4169 * and
4170 * pickler.memo = saved_memo
4171 * Is this a good idea? Not really, but we don't want to break code that uses
4172 * it. Note that we don't implement the entire mapping API here. This is
4173 * intentional, as these should be treated as black-box implementation details.
4174 */
4175
Larry Hastings61272b72014-01-07 12:41:53 -08004176/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004177_pickle.PicklerMemoProxy.clear
4178
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004179Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004180[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004181
Larry Hastings3cceb382014-01-04 11:09:09 -08004182static PyObject *
4183_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004184/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004185{
4186 if (self->pickler->memo)
4187 PyMemoTable_Clear(self->pickler->memo);
4188 Py_RETURN_NONE;
4189}
4190
Larry Hastings61272b72014-01-07 12:41:53 -08004191/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004192_pickle.PicklerMemoProxy.copy
4193
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004194Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004195[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004196
Larry Hastings3cceb382014-01-04 11:09:09 -08004197static PyObject *
4198_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004199/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004200{
4201 Py_ssize_t i;
4202 PyMemoTable *memo;
4203 PyObject *new_memo = PyDict_New();
4204 if (new_memo == NULL)
4205 return NULL;
4206
4207 memo = self->pickler->memo;
4208 for (i = 0; i < memo->mt_allocated; ++i) {
4209 PyMemoEntry entry = memo->mt_table[i];
4210 if (entry.me_key != NULL) {
4211 int status;
4212 PyObject *key, *value;
4213
4214 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004215 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004216
4217 if (key == NULL || value == NULL) {
4218 Py_XDECREF(key);
4219 Py_XDECREF(value);
4220 goto error;
4221 }
4222 status = PyDict_SetItem(new_memo, key, value);
4223 Py_DECREF(key);
4224 Py_DECREF(value);
4225 if (status < 0)
4226 goto error;
4227 }
4228 }
4229 return new_memo;
4230
4231 error:
4232 Py_XDECREF(new_memo);
4233 return NULL;
4234}
4235
Larry Hastings61272b72014-01-07 12:41:53 -08004236/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004237_pickle.PicklerMemoProxy.__reduce__
4238
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004239Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004240[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004241
Larry Hastings3cceb382014-01-04 11:09:09 -08004242static PyObject *
4243_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004244/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004245{
4246 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004247 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004248 if (contents == NULL)
4249 return NULL;
4250
4251 reduce_value = PyTuple_New(2);
4252 if (reduce_value == NULL) {
4253 Py_DECREF(contents);
4254 return NULL;
4255 }
4256 dict_args = PyTuple_New(1);
4257 if (dict_args == NULL) {
4258 Py_DECREF(contents);
4259 Py_DECREF(reduce_value);
4260 return NULL;
4261 }
4262 PyTuple_SET_ITEM(dict_args, 0, contents);
4263 Py_INCREF((PyObject *)&PyDict_Type);
4264 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4265 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4266 return reduce_value;
4267}
4268
4269static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004270 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4271 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4272 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004273 {NULL, NULL} /* sentinel */
4274};
4275
4276static void
4277PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4278{
4279 PyObject_GC_UnTrack(self);
4280 Py_XDECREF(self->pickler);
4281 PyObject_GC_Del((PyObject *)self);
4282}
4283
4284static int
4285PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4286 visitproc visit, void *arg)
4287{
4288 Py_VISIT(self->pickler);
4289 return 0;
4290}
4291
4292static int
4293PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4294{
4295 Py_CLEAR(self->pickler);
4296 return 0;
4297}
4298
4299static PyTypeObject PicklerMemoProxyType = {
4300 PyVarObject_HEAD_INIT(NULL, 0)
4301 "_pickle.PicklerMemoProxy", /*tp_name*/
4302 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4303 0,
4304 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4305 0, /* tp_print */
4306 0, /* tp_getattr */
4307 0, /* tp_setattr */
4308 0, /* tp_compare */
4309 0, /* tp_repr */
4310 0, /* tp_as_number */
4311 0, /* tp_as_sequence */
4312 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004313 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004314 0, /* tp_call */
4315 0, /* tp_str */
4316 PyObject_GenericGetAttr, /* tp_getattro */
4317 PyObject_GenericSetAttr, /* tp_setattro */
4318 0, /* tp_as_buffer */
4319 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4320 0, /* tp_doc */
4321 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4322 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4323 0, /* tp_richcompare */
4324 0, /* tp_weaklistoffset */
4325 0, /* tp_iter */
4326 0, /* tp_iternext */
4327 picklerproxy_methods, /* tp_methods */
4328};
4329
4330static PyObject *
4331PicklerMemoProxy_New(PicklerObject *pickler)
4332{
4333 PicklerMemoProxyObject *self;
4334
4335 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4336 if (self == NULL)
4337 return NULL;
4338 Py_INCREF(pickler);
4339 self->pickler = pickler;
4340 PyObject_GC_Track(self);
4341 return (PyObject *)self;
4342}
4343
4344/*****************************************************************************/
4345
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004346static PyObject *
4347Pickler_get_memo(PicklerObject *self)
4348{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004349 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004350}
4351
4352static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004353Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004354{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004355 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004356
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004357 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004358 PyErr_SetString(PyExc_TypeError,
4359 "attribute deletion is not supported");
4360 return -1;
4361 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004362
4363 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4364 PicklerObject *pickler =
4365 ((PicklerMemoProxyObject *)obj)->pickler;
4366
4367 new_memo = PyMemoTable_Copy(pickler->memo);
4368 if (new_memo == NULL)
4369 return -1;
4370 }
4371 else if (PyDict_Check(obj)) {
4372 Py_ssize_t i = 0;
4373 PyObject *key, *value;
4374
4375 new_memo = PyMemoTable_New();
4376 if (new_memo == NULL)
4377 return -1;
4378
4379 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004380 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004381 PyObject *memo_obj;
4382
4383 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4384 PyErr_SetString(PyExc_TypeError,
4385 "'memo' values must be 2-item tuples");
4386 goto error;
4387 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004388 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004389 if (memo_id == -1 && PyErr_Occurred())
4390 goto error;
4391 memo_obj = PyTuple_GET_ITEM(value, 1);
4392 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4393 goto error;
4394 }
4395 }
4396 else {
4397 PyErr_Format(PyExc_TypeError,
4398 "'memo' attribute must be an PicklerMemoProxy object"
4399 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004400 return -1;
4401 }
4402
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004403 PyMemoTable_Del(self->memo);
4404 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004405
4406 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004407
4408 error:
4409 if (new_memo)
4410 PyMemoTable_Del(new_memo);
4411 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004412}
4413
4414static PyObject *
4415Pickler_get_persid(PicklerObject *self)
4416{
4417 if (self->pers_func == NULL)
4418 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4419 else
4420 Py_INCREF(self->pers_func);
4421 return self->pers_func;
4422}
4423
4424static int
4425Pickler_set_persid(PicklerObject *self, PyObject *value)
4426{
4427 PyObject *tmp;
4428
4429 if (value == NULL) {
4430 PyErr_SetString(PyExc_TypeError,
4431 "attribute deletion is not supported");
4432 return -1;
4433 }
4434 if (!PyCallable_Check(value)) {
4435 PyErr_SetString(PyExc_TypeError,
4436 "persistent_id must be a callable taking one argument");
4437 return -1;
4438 }
4439
4440 tmp = self->pers_func;
4441 Py_INCREF(value);
4442 self->pers_func = value;
4443 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4444
4445 return 0;
4446}
4447
4448static PyMemberDef Pickler_members[] = {
4449 {"bin", T_INT, offsetof(PicklerObject, bin)},
4450 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004451 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004452 {NULL}
4453};
4454
4455static PyGetSetDef Pickler_getsets[] = {
4456 {"memo", (getter)Pickler_get_memo,
4457 (setter)Pickler_set_memo},
4458 {"persistent_id", (getter)Pickler_get_persid,
4459 (setter)Pickler_set_persid},
4460 {NULL}
4461};
4462
4463static PyTypeObject Pickler_Type = {
4464 PyVarObject_HEAD_INIT(NULL, 0)
4465 "_pickle.Pickler" , /*tp_name*/
4466 sizeof(PicklerObject), /*tp_basicsize*/
4467 0, /*tp_itemsize*/
4468 (destructor)Pickler_dealloc, /*tp_dealloc*/
4469 0, /*tp_print*/
4470 0, /*tp_getattr*/
4471 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004472 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004473 0, /*tp_repr*/
4474 0, /*tp_as_number*/
4475 0, /*tp_as_sequence*/
4476 0, /*tp_as_mapping*/
4477 0, /*tp_hash*/
4478 0, /*tp_call*/
4479 0, /*tp_str*/
4480 0, /*tp_getattro*/
4481 0, /*tp_setattro*/
4482 0, /*tp_as_buffer*/
4483 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004484 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004485 (traverseproc)Pickler_traverse, /*tp_traverse*/
4486 (inquiry)Pickler_clear, /*tp_clear*/
4487 0, /*tp_richcompare*/
4488 0, /*tp_weaklistoffset*/
4489 0, /*tp_iter*/
4490 0, /*tp_iternext*/
4491 Pickler_methods, /*tp_methods*/
4492 Pickler_members, /*tp_members*/
4493 Pickler_getsets, /*tp_getset*/
4494 0, /*tp_base*/
4495 0, /*tp_dict*/
4496 0, /*tp_descr_get*/
4497 0, /*tp_descr_set*/
4498 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004499 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004500 PyType_GenericAlloc, /*tp_alloc*/
4501 PyType_GenericNew, /*tp_new*/
4502 PyObject_GC_Del, /*tp_free*/
4503 0, /*tp_is_gc*/
4504};
4505
Victor Stinner121aab42011-09-29 23:40:53 +02004506/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004507
4508 XXX: It would be nice to able to avoid Python function call overhead, by
4509 using directly the C version of find_class(), when find_class() is not
4510 overridden by a subclass. Although, this could become rather hackish. A
4511 simpler optimization would be to call the C function when self is not a
4512 subclass instance. */
4513static PyObject *
4514find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4515{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004516 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004517
4518 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4519 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004520}
4521
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004522static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004523marker(UnpicklerObject *self)
4524{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004525 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004526 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004527 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004528 return -1;
4529 }
4530
4531 return self->marks[--self->num_marks];
4532}
4533
4534static int
4535load_none(UnpicklerObject *self)
4536{
4537 PDATA_APPEND(self->stack, Py_None, -1);
4538 return 0;
4539}
4540
4541static int
4542bad_readline(void)
4543{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004544 PickleState *st = _Pickle_GetGlobalState();
4545 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004546 return -1;
4547}
4548
4549static int
4550load_int(UnpicklerObject *self)
4551{
4552 PyObject *value;
4553 char *endptr, *s;
4554 Py_ssize_t len;
4555 long x;
4556
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004557 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004558 return -1;
4559 if (len < 2)
4560 return bad_readline();
4561
4562 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004563 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004564 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004565 x = strtol(s, &endptr, 0);
4566
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004567 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004568 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004569 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004570 errno = 0;
4571 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004572 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004573 if (value == NULL) {
4574 PyErr_SetString(PyExc_ValueError,
4575 "could not convert string to int");
4576 return -1;
4577 }
4578 }
4579 else {
4580 if (len == 3 && (x == 0 || x == 1)) {
4581 if ((value = PyBool_FromLong(x)) == NULL)
4582 return -1;
4583 }
4584 else {
4585 if ((value = PyLong_FromLong(x)) == NULL)
4586 return -1;
4587 }
4588 }
4589
4590 PDATA_PUSH(self->stack, value, -1);
4591 return 0;
4592}
4593
4594static int
4595load_bool(UnpicklerObject *self, PyObject *boolean)
4596{
4597 assert(boolean == Py_True || boolean == Py_False);
4598 PDATA_APPEND(self->stack, boolean, -1);
4599 return 0;
4600}
4601
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004602/* s contains x bytes of an unsigned little-endian integer. Return its value
4603 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4604 */
4605static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004606calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004607{
4608 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004609 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004610 size_t x = 0;
4611
Serhiy Storchakae0606192015-09-29 22:10:07 +03004612 if (nbytes > (int)sizeof(size_t)) {
4613 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
4614 * have 64-bit size that can't be represented on 32-bit platform.
4615 */
4616 for (i = (int)sizeof(size_t); i < nbytes; i++) {
4617 if (s[i])
4618 return -1;
4619 }
4620 nbytes = (int)sizeof(size_t);
4621 }
4622 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004623 x |= (size_t) s[i] << (8 * i);
4624 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004625
4626 if (x > PY_SSIZE_T_MAX)
4627 return -1;
4628 else
4629 return (Py_ssize_t) x;
4630}
4631
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004632/* s contains x bytes of a little-endian integer. Return its value as a
4633 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4634 * int, but when x is 4 it's a signed one. This is an historical source
4635 * of x-platform bugs.
4636 */
4637static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004638calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004639{
4640 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004641 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004642 long x = 0;
4643
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004644 for (i = 0; i < nbytes; i++) {
4645 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004646 }
4647
4648 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4649 * is signed, so on a box with longs bigger than 4 bytes we need
4650 * to extend a BININT's sign bit to the full width.
4651 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004652 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004653 x |= -(x & (1L << 31));
4654 }
4655
4656 return x;
4657}
4658
4659static int
4660load_binintx(UnpicklerObject *self, char *s, int size)
4661{
4662 PyObject *value;
4663 long x;
4664
4665 x = calc_binint(s, size);
4666
4667 if ((value = PyLong_FromLong(x)) == NULL)
4668 return -1;
4669
4670 PDATA_PUSH(self->stack, value, -1);
4671 return 0;
4672}
4673
4674static int
4675load_binint(UnpicklerObject *self)
4676{
4677 char *s;
4678
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004679 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004680 return -1;
4681
4682 return load_binintx(self, s, 4);
4683}
4684
4685static int
4686load_binint1(UnpicklerObject *self)
4687{
4688 char *s;
4689
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004690 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004691 return -1;
4692
4693 return load_binintx(self, s, 1);
4694}
4695
4696static int
4697load_binint2(UnpicklerObject *self)
4698{
4699 char *s;
4700
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004701 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004702 return -1;
4703
4704 return load_binintx(self, s, 2);
4705}
4706
4707static int
4708load_long(UnpicklerObject *self)
4709{
4710 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004711 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004712 Py_ssize_t len;
4713
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004714 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004715 return -1;
4716 if (len < 2)
4717 return bad_readline();
4718
Mark Dickinson8dd05142009-01-20 20:43:58 +00004719 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4720 the 'L' before calling PyLong_FromString. In order to maintain
4721 compatibility with Python 3.0.0, we don't actually *require*
4722 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004723 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004724 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004725 /* XXX: Should the base argument explicitly set to 10? */
4726 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004727 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004728 return -1;
4729
4730 PDATA_PUSH(self->stack, value, -1);
4731 return 0;
4732}
4733
4734/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4735 * data following.
4736 */
4737static int
4738load_counted_long(UnpicklerObject *self, int size)
4739{
4740 PyObject *value;
4741 char *nbytes;
4742 char *pdata;
4743
4744 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004745 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004746 return -1;
4747
4748 size = calc_binint(nbytes, size);
4749 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004750 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004751 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004752 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004753 "LONG pickle has negative byte count");
4754 return -1;
4755 }
4756
4757 if (size == 0)
4758 value = PyLong_FromLong(0L);
4759 else {
4760 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004761 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004762 return -1;
4763 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4764 1 /* little endian */ , 1 /* signed */ );
4765 }
4766 if (value == NULL)
4767 return -1;
4768 PDATA_PUSH(self->stack, value, -1);
4769 return 0;
4770}
4771
4772static int
4773load_float(UnpicklerObject *self)
4774{
4775 PyObject *value;
4776 char *endptr, *s;
4777 Py_ssize_t len;
4778 double d;
4779
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004780 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004781 return -1;
4782 if (len < 2)
4783 return bad_readline();
4784
4785 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004786 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4787 if (d == -1.0 && PyErr_Occurred())
4788 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004789 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004790 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4791 return -1;
4792 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004793 value = PyFloat_FromDouble(d);
4794 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004795 return -1;
4796
4797 PDATA_PUSH(self->stack, value, -1);
4798 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004799}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004800
4801static int
4802load_binfloat(UnpicklerObject *self)
4803{
4804 PyObject *value;
4805 double x;
4806 char *s;
4807
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004808 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004809 return -1;
4810
4811 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4812 if (x == -1.0 && PyErr_Occurred())
4813 return -1;
4814
4815 if ((value = PyFloat_FromDouble(x)) == NULL)
4816 return -1;
4817
4818 PDATA_PUSH(self->stack, value, -1);
4819 return 0;
4820}
4821
4822static int
4823load_string(UnpicklerObject *self)
4824{
4825 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004826 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004827 Py_ssize_t len;
4828 char *s, *p;
4829
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004830 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004831 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004832 /* Strip the newline */
4833 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004834 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004835 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004836 p = s + 1;
4837 len -= 2;
4838 }
4839 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004840 PickleState *st = _Pickle_GetGlobalState();
4841 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004842 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004843 return -1;
4844 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004845 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004846
4847 /* Use the PyBytes API to decode the string, since that is what is used
4848 to encode, and then coerce the result to Unicode. */
4849 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004850 if (bytes == NULL)
4851 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004852
4853 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4854 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4855 if (strcmp(self->encoding, "bytes") == 0) {
4856 obj = bytes;
4857 }
4858 else {
4859 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4860 Py_DECREF(bytes);
4861 if (obj == NULL) {
4862 return -1;
4863 }
4864 }
4865
4866 PDATA_PUSH(self->stack, obj, -1);
4867 return 0;
4868}
4869
4870static int
4871load_counted_binstring(UnpicklerObject *self, int nbytes)
4872{
4873 PyObject *obj;
4874 Py_ssize_t size;
4875 char *s;
4876
4877 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004878 return -1;
4879
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004880 size = calc_binsize(s, nbytes);
4881 if (size < 0) {
4882 PickleState *st = _Pickle_GetGlobalState();
4883 PyErr_Format(st->UnpicklingError,
4884 "BINSTRING exceeds system's maximum size of %zd bytes",
4885 PY_SSIZE_T_MAX);
4886 return -1;
4887 }
4888
4889 if (_Unpickler_Read(self, &s, size) < 0)
4890 return -1;
4891
4892 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4893 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4894 if (strcmp(self->encoding, "bytes") == 0) {
4895 obj = PyBytes_FromStringAndSize(s, size);
4896 }
4897 else {
4898 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4899 }
4900 if (obj == NULL) {
4901 return -1;
4902 }
4903
4904 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004905 return 0;
4906}
4907
4908static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004909load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004910{
4911 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004912 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004913 char *s;
4914
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004915 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004916 return -1;
4917
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004918 size = calc_binsize(s, nbytes);
4919 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004920 PyErr_Format(PyExc_OverflowError,
4921 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004922 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004923 return -1;
4924 }
4925
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004926 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004927 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004928
4929 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004930 if (bytes == NULL)
4931 return -1;
4932
4933 PDATA_PUSH(self->stack, bytes, -1);
4934 return 0;
4935}
4936
4937static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004938load_unicode(UnpicklerObject *self)
4939{
4940 PyObject *str;
4941 Py_ssize_t len;
4942 char *s;
4943
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004944 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004945 return -1;
4946 if (len < 1)
4947 return bad_readline();
4948
4949 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4950 if (str == NULL)
4951 return -1;
4952
4953 PDATA_PUSH(self->stack, str, -1);
4954 return 0;
4955}
4956
4957static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004958load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004959{
4960 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004961 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004962 char *s;
4963
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004964 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004965 return -1;
4966
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004967 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004968 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004969 PyErr_Format(PyExc_OverflowError,
4970 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004971 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004972 return -1;
4973 }
4974
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004975 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004976 return -1;
4977
Victor Stinner485fb562010-04-13 11:07:24 +00004978 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004979 if (str == NULL)
4980 return -1;
4981
4982 PDATA_PUSH(self->stack, str, -1);
4983 return 0;
4984}
4985
4986static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02004987load_counted_tuple(UnpicklerObject *self, int len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004988{
4989 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004990
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02004991 if (Py_SIZE(self->stack) < len)
4992 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004993
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02004994 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004995 if (tuple == NULL)
4996 return -1;
4997 PDATA_PUSH(self->stack, tuple, -1);
4998 return 0;
4999}
5000
5001static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005002load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005003{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005004 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005005
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005006 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005007 return -1;
5008
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005009 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005010}
5011
5012static int
5013load_empty_list(UnpicklerObject *self)
5014{
5015 PyObject *list;
5016
5017 if ((list = PyList_New(0)) == NULL)
5018 return -1;
5019 PDATA_PUSH(self->stack, list, -1);
5020 return 0;
5021}
5022
5023static int
5024load_empty_dict(UnpicklerObject *self)
5025{
5026 PyObject *dict;
5027
5028 if ((dict = PyDict_New()) == NULL)
5029 return -1;
5030 PDATA_PUSH(self->stack, dict, -1);
5031 return 0;
5032}
5033
5034static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005035load_empty_set(UnpicklerObject *self)
5036{
5037 PyObject *set;
5038
5039 if ((set = PySet_New(NULL)) == NULL)
5040 return -1;
5041 PDATA_PUSH(self->stack, set, -1);
5042 return 0;
5043}
5044
5045static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005046load_list(UnpicklerObject *self)
5047{
5048 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005049 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005050
5051 if ((i = marker(self)) < 0)
5052 return -1;
5053
5054 list = Pdata_poplist(self->stack, i);
5055 if (list == NULL)
5056 return -1;
5057 PDATA_PUSH(self->stack, list, -1);
5058 return 0;
5059}
5060
5061static int
5062load_dict(UnpicklerObject *self)
5063{
5064 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005065 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005066
5067 if ((i = marker(self)) < 0)
5068 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005069 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005070
5071 if ((dict = PyDict_New()) == NULL)
5072 return -1;
5073
5074 for (k = i + 1; k < j; k += 2) {
5075 key = self->stack->data[k - 1];
5076 value = self->stack->data[k];
5077 if (PyDict_SetItem(dict, key, value) < 0) {
5078 Py_DECREF(dict);
5079 return -1;
5080 }
5081 }
5082 Pdata_clear(self->stack, i);
5083 PDATA_PUSH(self->stack, dict, -1);
5084 return 0;
5085}
5086
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005087static int
5088load_frozenset(UnpicklerObject *self)
5089{
5090 PyObject *items;
5091 PyObject *frozenset;
5092 Py_ssize_t i;
5093
5094 if ((i = marker(self)) < 0)
5095 return -1;
5096
5097 items = Pdata_poptuple(self->stack, i);
5098 if (items == NULL)
5099 return -1;
5100
5101 frozenset = PyFrozenSet_New(items);
5102 Py_DECREF(items);
5103 if (frozenset == NULL)
5104 return -1;
5105
5106 PDATA_PUSH(self->stack, frozenset, -1);
5107 return 0;
5108}
5109
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005110static PyObject *
5111instantiate(PyObject *cls, PyObject *args)
5112{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005113 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005114 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005115 /* Caller must assure args are a tuple. Normally, args come from
5116 Pdata_poptuple which packs objects from the top of the stack
5117 into a newly created tuple. */
5118 assert(PyTuple_Check(args));
5119 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005120 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005121 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005122 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005123 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005124 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005125
5126 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005127 }
5128 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005129}
5130
5131static int
5132load_obj(UnpicklerObject *self)
5133{
5134 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005135 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005136
5137 if ((i = marker(self)) < 0)
5138 return -1;
5139
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005140 if (Py_SIZE(self->stack) - i < 1)
5141 return stack_underflow();
5142
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005143 args = Pdata_poptuple(self->stack, i + 1);
5144 if (args == NULL)
5145 return -1;
5146
5147 PDATA_POP(self->stack, cls);
5148 if (cls) {
5149 obj = instantiate(cls, args);
5150 Py_DECREF(cls);
5151 }
5152 Py_DECREF(args);
5153 if (obj == NULL)
5154 return -1;
5155
5156 PDATA_PUSH(self->stack, obj, -1);
5157 return 0;
5158}
5159
5160static int
5161load_inst(UnpicklerObject *self)
5162{
5163 PyObject *cls = NULL;
5164 PyObject *args = NULL;
5165 PyObject *obj = NULL;
5166 PyObject *module_name;
5167 PyObject *class_name;
5168 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005169 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005170 char *s;
5171
5172 if ((i = marker(self)) < 0)
5173 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005174 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005175 return -1;
5176 if (len < 2)
5177 return bad_readline();
5178
5179 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5180 identifiers are permitted in Python 3.0, since the INST opcode is only
5181 supported by older protocols on Python 2.x. */
5182 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5183 if (module_name == NULL)
5184 return -1;
5185
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005186 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005187 if (len < 2) {
5188 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005189 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005190 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005191 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005192 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005193 cls = find_class(self, module_name, class_name);
5194 Py_DECREF(class_name);
5195 }
5196 }
5197 Py_DECREF(module_name);
5198
5199 if (cls == NULL)
5200 return -1;
5201
5202 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5203 obj = instantiate(cls, args);
5204 Py_DECREF(args);
5205 }
5206 Py_DECREF(cls);
5207
5208 if (obj == NULL)
5209 return -1;
5210
5211 PDATA_PUSH(self->stack, obj, -1);
5212 return 0;
5213}
5214
5215static int
5216load_newobj(UnpicklerObject *self)
5217{
5218 PyObject *args = NULL;
5219 PyObject *clsraw = NULL;
5220 PyTypeObject *cls; /* clsraw cast to its true type */
5221 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005222 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005223
5224 /* Stack is ... cls argtuple, and we want to call
5225 * cls.__new__(cls, *argtuple).
5226 */
5227 PDATA_POP(self->stack, args);
5228 if (args == NULL)
5229 goto error;
5230 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005231 PyErr_SetString(st->UnpicklingError,
5232 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005233 goto error;
5234 }
5235
5236 PDATA_POP(self->stack, clsraw);
5237 cls = (PyTypeObject *)clsraw;
5238 if (cls == NULL)
5239 goto error;
5240 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005241 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005242 "isn't a type object");
5243 goto error;
5244 }
5245 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005246 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005247 "has NULL tp_new");
5248 goto error;
5249 }
5250
5251 /* Call __new__. */
5252 obj = cls->tp_new(cls, args, NULL);
5253 if (obj == NULL)
5254 goto error;
5255
5256 Py_DECREF(args);
5257 Py_DECREF(clsraw);
5258 PDATA_PUSH(self->stack, obj, -1);
5259 return 0;
5260
5261 error:
5262 Py_XDECREF(args);
5263 Py_XDECREF(clsraw);
5264 return -1;
5265}
5266
5267static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005268load_newobj_ex(UnpicklerObject *self)
5269{
5270 PyObject *cls, *args, *kwargs;
5271 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005272 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005273
5274 PDATA_POP(self->stack, kwargs);
5275 if (kwargs == NULL) {
5276 return -1;
5277 }
5278 PDATA_POP(self->stack, args);
5279 if (args == NULL) {
5280 Py_DECREF(kwargs);
5281 return -1;
5282 }
5283 PDATA_POP(self->stack, cls);
5284 if (cls == NULL) {
5285 Py_DECREF(kwargs);
5286 Py_DECREF(args);
5287 return -1;
5288 }
Larry Hastings61272b72014-01-07 12:41:53 -08005289
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005290 if (!PyType_Check(cls)) {
5291 Py_DECREF(kwargs);
5292 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005293 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005294 "NEWOBJ_EX class argument must be a type, not %.200s",
5295 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005296 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005297 return -1;
5298 }
5299
5300 if (((PyTypeObject *)cls)->tp_new == NULL) {
5301 Py_DECREF(kwargs);
5302 Py_DECREF(args);
5303 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005304 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005305 "NEWOBJ_EX class argument doesn't have __new__");
5306 return -1;
5307 }
5308 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5309 Py_DECREF(kwargs);
5310 Py_DECREF(args);
5311 Py_DECREF(cls);
5312 if (obj == NULL) {
5313 return -1;
5314 }
5315 PDATA_PUSH(self->stack, obj, -1);
5316 return 0;
5317}
5318
5319static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005320load_global(UnpicklerObject *self)
5321{
5322 PyObject *global = NULL;
5323 PyObject *module_name;
5324 PyObject *global_name;
5325 Py_ssize_t len;
5326 char *s;
5327
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005328 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005329 return -1;
5330 if (len < 2)
5331 return bad_readline();
5332 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5333 if (!module_name)
5334 return -1;
5335
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005336 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005337 if (len < 2) {
5338 Py_DECREF(module_name);
5339 return bad_readline();
5340 }
5341 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5342 if (global_name) {
5343 global = find_class(self, module_name, global_name);
5344 Py_DECREF(global_name);
5345 }
5346 }
5347 Py_DECREF(module_name);
5348
5349 if (global == NULL)
5350 return -1;
5351 PDATA_PUSH(self->stack, global, -1);
5352 return 0;
5353}
5354
5355static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005356load_stack_global(UnpicklerObject *self)
5357{
5358 PyObject *global;
5359 PyObject *module_name;
5360 PyObject *global_name;
5361
5362 PDATA_POP(self->stack, global_name);
5363 PDATA_POP(self->stack, module_name);
5364 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5365 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005366 PickleState *st = _Pickle_GetGlobalState();
5367 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005368 Py_XDECREF(global_name);
5369 Py_XDECREF(module_name);
5370 return -1;
5371 }
5372 global = find_class(self, module_name, global_name);
5373 Py_DECREF(global_name);
5374 Py_DECREF(module_name);
5375 if (global == NULL)
5376 return -1;
5377 PDATA_PUSH(self->stack, global, -1);
5378 return 0;
5379}
5380
5381static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005382load_persid(UnpicklerObject *self)
5383{
5384 PyObject *pid;
5385 Py_ssize_t len;
5386 char *s;
5387
5388 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005389 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005390 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005391 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005392 return bad_readline();
5393
5394 pid = PyBytes_FromStringAndSize(s, len - 1);
5395 if (pid == NULL)
5396 return -1;
5397
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005398 /* This does not leak since _Pickle_FastCall() steals the reference
5399 to pid first. */
5400 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005401 if (pid == NULL)
5402 return -1;
5403
5404 PDATA_PUSH(self->stack, pid, -1);
5405 return 0;
5406 }
5407 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005408 PickleState *st = _Pickle_GetGlobalState();
5409 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005410 "A load persistent id instruction was encountered,\n"
5411 "but no persistent_load function was specified.");
5412 return -1;
5413 }
5414}
5415
5416static int
5417load_binpersid(UnpicklerObject *self)
5418{
5419 PyObject *pid;
5420
5421 if (self->pers_func) {
5422 PDATA_POP(self->stack, pid);
5423 if (pid == NULL)
5424 return -1;
5425
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005426 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005427 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005428 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005429 if (pid == NULL)
5430 return -1;
5431
5432 PDATA_PUSH(self->stack, pid, -1);
5433 return 0;
5434 }
5435 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005436 PickleState *st = _Pickle_GetGlobalState();
5437 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005438 "A load persistent id instruction was encountered,\n"
5439 "but no persistent_load function was specified.");
5440 return -1;
5441 }
5442}
5443
5444static int
5445load_pop(UnpicklerObject *self)
5446{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005447 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005448
5449 /* Note that we split the (pickle.py) stack into two stacks,
5450 * an object stack and a mark stack. We have to be clever and
5451 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005452 * mark stack first, and only signalling a stack underflow if
5453 * the object stack is empty and the mark stack doesn't match
5454 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005455 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005456 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005457 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005458 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005459 len--;
5460 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005461 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005462 } else {
5463 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005464 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005465 return 0;
5466}
5467
5468static int
5469load_pop_mark(UnpicklerObject *self)
5470{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005471 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005472
5473 if ((i = marker(self)) < 0)
5474 return -1;
5475
5476 Pdata_clear(self->stack, i);
5477
5478 return 0;
5479}
5480
5481static int
5482load_dup(UnpicklerObject *self)
5483{
5484 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005485 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005486
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005487 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005488 return stack_underflow();
5489 last = self->stack->data[len - 1];
5490 PDATA_APPEND(self->stack, last, -1);
5491 return 0;
5492}
5493
5494static int
5495load_get(UnpicklerObject *self)
5496{
5497 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005498 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005499 Py_ssize_t len;
5500 char *s;
5501
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005502 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005503 return -1;
5504 if (len < 2)
5505 return bad_readline();
5506
5507 key = PyLong_FromString(s, NULL, 10);
5508 if (key == NULL)
5509 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005510 idx = PyLong_AsSsize_t(key);
5511 if (idx == -1 && PyErr_Occurred()) {
5512 Py_DECREF(key);
5513 return -1;
5514 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005515
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005516 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005517 if (value == NULL) {
5518 if (!PyErr_Occurred())
5519 PyErr_SetObject(PyExc_KeyError, key);
5520 Py_DECREF(key);
5521 return -1;
5522 }
5523 Py_DECREF(key);
5524
5525 PDATA_APPEND(self->stack, value, -1);
5526 return 0;
5527}
5528
5529static int
5530load_binget(UnpicklerObject *self)
5531{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005532 PyObject *value;
5533 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005534 char *s;
5535
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005536 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005537 return -1;
5538
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005539 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005540
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005541 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005542 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005543 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005544 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005545 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005546 Py_DECREF(key);
5547 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005548 return -1;
5549 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005550
5551 PDATA_APPEND(self->stack, value, -1);
5552 return 0;
5553}
5554
5555static int
5556load_long_binget(UnpicklerObject *self)
5557{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005558 PyObject *value;
5559 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005560 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005561
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005562 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005563 return -1;
5564
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005565 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005566
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005567 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005568 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005569 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005570 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005571 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005572 Py_DECREF(key);
5573 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005574 return -1;
5575 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005576
5577 PDATA_APPEND(self->stack, value, -1);
5578 return 0;
5579}
5580
5581/* Push an object from the extension registry (EXT[124]). nbytes is
5582 * the number of bytes following the opcode, holding the index (code) value.
5583 */
5584static int
5585load_extension(UnpicklerObject *self, int nbytes)
5586{
5587 char *codebytes; /* the nbytes bytes after the opcode */
5588 long code; /* calc_binint returns long */
5589 PyObject *py_code; /* code as a Python int */
5590 PyObject *obj; /* the object to push */
5591 PyObject *pair; /* (module_name, class_name) */
5592 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005593 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005594
5595 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005596 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005597 return -1;
5598 code = calc_binint(codebytes, nbytes);
5599 if (code <= 0) { /* note that 0 is forbidden */
5600 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005601 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005602 return -1;
5603 }
5604
5605 /* Look for the code in the cache. */
5606 py_code = PyLong_FromLong(code);
5607 if (py_code == NULL)
5608 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005609 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005610 if (obj != NULL) {
5611 /* Bingo. */
5612 Py_DECREF(py_code);
5613 PDATA_APPEND(self->stack, obj, -1);
5614 return 0;
5615 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005616 if (PyErr_Occurred()) {
5617 Py_DECREF(py_code);
5618 return -1;
5619 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005620
5621 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005622 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005623 if (pair == NULL) {
5624 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005625 if (!PyErr_Occurred()) {
5626 PyErr_Format(PyExc_ValueError, "unregistered extension "
5627 "code %ld", code);
5628 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005629 return -1;
5630 }
5631 /* Since the extension registry is manipulable via Python code,
5632 * confirm that pair is really a 2-tuple of strings.
5633 */
5634 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5635 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5636 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5637 Py_DECREF(py_code);
5638 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5639 "isn't a 2-tuple of strings", code);
5640 return -1;
5641 }
5642 /* Load the object. */
5643 obj = find_class(self, module_name, class_name);
5644 if (obj == NULL) {
5645 Py_DECREF(py_code);
5646 return -1;
5647 }
5648 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005649 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005650 Py_DECREF(py_code);
5651 if (code < 0) {
5652 Py_DECREF(obj);
5653 return -1;
5654 }
5655 PDATA_PUSH(self->stack, obj, -1);
5656 return 0;
5657}
5658
5659static int
5660load_put(UnpicklerObject *self)
5661{
5662 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005663 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005664 Py_ssize_t len;
5665 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005666
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005667 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005668 return -1;
5669 if (len < 2)
5670 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005671 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005672 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005673 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674
5675 key = PyLong_FromString(s, NULL, 10);
5676 if (key == NULL)
5677 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005678 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005679 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005680 if (idx < 0) {
5681 if (!PyErr_Occurred())
5682 PyErr_SetString(PyExc_ValueError,
5683 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005684 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005685 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005686
5687 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005688}
5689
5690static int
5691load_binput(UnpicklerObject *self)
5692{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005693 PyObject *value;
5694 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005695 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005696
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005697 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005698 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005699
5700 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005701 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005702 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005703
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005704 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005705
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005706 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005707}
5708
5709static int
5710load_long_binput(UnpicklerObject *self)
5711{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005712 PyObject *value;
5713 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005714 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005715
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005716 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005717 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005718
5719 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005720 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005721 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005722
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005723 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005724 if (idx < 0) {
5725 PyErr_SetString(PyExc_ValueError,
5726 "negative LONG_BINPUT argument");
5727 return -1;
5728 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005729
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005730 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005731}
5732
5733static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005734load_memoize(UnpicklerObject *self)
5735{
5736 PyObject *value;
5737
5738 if (Py_SIZE(self->stack) <= 0)
5739 return stack_underflow();
5740 value = self->stack->data[Py_SIZE(self->stack) - 1];
5741
5742 return _Unpickler_MemoPut(self, self->memo_len, value);
5743}
5744
5745static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005746do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005747{
5748 PyObject *value;
5749 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005750 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005751
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005752 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005753 if (x > len || x <= 0)
5754 return stack_underflow();
5755 if (len == x) /* nothing to do */
5756 return 0;
5757
5758 list = self->stack->data[x - 1];
5759
5760 if (PyList_Check(list)) {
5761 PyObject *slice;
5762 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005763 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005764
5765 slice = Pdata_poplist(self->stack, x);
5766 if (!slice)
5767 return -1;
5768 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005769 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005770 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005771 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005772 }
5773 else {
5774 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005775 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005776
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005777 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005778 if (append_func == NULL)
5779 return -1;
5780 for (i = x; i < len; i++) {
5781 PyObject *result;
5782
5783 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005784 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005785 if (result == NULL) {
5786 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005787 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005788 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005789 return -1;
5790 }
5791 Py_DECREF(result);
5792 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005793 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005794 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005795 }
5796
5797 return 0;
5798}
5799
5800static int
5801load_append(UnpicklerObject *self)
5802{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005803 if (Py_SIZE(self->stack) - 1 <= 0)
5804 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005805 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005806}
5807
5808static int
5809load_appends(UnpicklerObject *self)
5810{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005811 Py_ssize_t i = marker(self);
5812 if (i < 0)
5813 return -1;
5814 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005815}
5816
5817static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005818do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005819{
5820 PyObject *value, *key;
5821 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005822 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005823 int status = 0;
5824
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005825 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005826 if (x > len || x <= 0)
5827 return stack_underflow();
5828 if (len == x) /* nothing to do */
5829 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005830 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005831 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005832 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005833 PyErr_SetString(st->UnpicklingError,
5834 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005835 return -1;
5836 }
5837
5838 /* Here, dict does not actually need to be a PyDict; it could be anything
5839 that supports the __setitem__ attribute. */
5840 dict = self->stack->data[x - 1];
5841
5842 for (i = x + 1; i < len; i += 2) {
5843 key = self->stack->data[i - 1];
5844 value = self->stack->data[i];
5845 if (PyObject_SetItem(dict, key, value) < 0) {
5846 status = -1;
5847 break;
5848 }
5849 }
5850
5851 Pdata_clear(self->stack, x);
5852 return status;
5853}
5854
5855static int
5856load_setitem(UnpicklerObject *self)
5857{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005858 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005859}
5860
5861static int
5862load_setitems(UnpicklerObject *self)
5863{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005864 Py_ssize_t i = marker(self);
5865 if (i < 0)
5866 return -1;
5867 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005868}
5869
5870static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005871load_additems(UnpicklerObject *self)
5872{
5873 PyObject *set;
5874 Py_ssize_t mark, len, i;
5875
5876 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005877 if (mark < 0)
5878 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005879 len = Py_SIZE(self->stack);
5880 if (mark > len || mark <= 0)
5881 return stack_underflow();
5882 if (len == mark) /* nothing to do */
5883 return 0;
5884
5885 set = self->stack->data[mark - 1];
5886
5887 if (PySet_Check(set)) {
5888 PyObject *items;
5889 int status;
5890
5891 items = Pdata_poptuple(self->stack, mark);
5892 if (items == NULL)
5893 return -1;
5894
5895 status = _PySet_Update(set, items);
5896 Py_DECREF(items);
5897 return status;
5898 }
5899 else {
5900 PyObject *add_func;
5901 _Py_IDENTIFIER(add);
5902
5903 add_func = _PyObject_GetAttrId(set, &PyId_add);
5904 if (add_func == NULL)
5905 return -1;
5906 for (i = mark; i < len; i++) {
5907 PyObject *result;
5908 PyObject *item;
5909
5910 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005911 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005912 if (result == NULL) {
5913 Pdata_clear(self->stack, i + 1);
5914 Py_SIZE(self->stack) = mark;
5915 return -1;
5916 }
5917 Py_DECREF(result);
5918 }
5919 Py_SIZE(self->stack) = mark;
5920 }
5921
5922 return 0;
5923}
5924
5925static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005926load_build(UnpicklerObject *self)
5927{
5928 PyObject *state, *inst, *slotstate;
5929 PyObject *setstate;
5930 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005931 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005932
5933 /* Stack is ... instance, state. We want to leave instance at
5934 * the stack top, possibly mutated via instance.__setstate__(state).
5935 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005936 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005937 return stack_underflow();
5938
5939 PDATA_POP(self->stack, state);
5940 if (state == NULL)
5941 return -1;
5942
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005943 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005944
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005945 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005946 if (setstate == NULL) {
5947 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5948 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005949 else {
5950 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005951 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005952 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005953 }
5954 else {
5955 PyObject *result;
5956
5957 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005958 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005959 Py_DECREF(setstate);
5960 if (result == NULL)
5961 return -1;
5962 Py_DECREF(result);
5963 return 0;
5964 }
5965
5966 /* A default __setstate__. First see whether state embeds a
5967 * slot state dict too (a proto 2 addition).
5968 */
5969 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5970 PyObject *tmp = state;
5971
5972 state = PyTuple_GET_ITEM(tmp, 0);
5973 slotstate = PyTuple_GET_ITEM(tmp, 1);
5974 Py_INCREF(state);
5975 Py_INCREF(slotstate);
5976 Py_DECREF(tmp);
5977 }
5978 else
5979 slotstate = NULL;
5980
5981 /* Set inst.__dict__ from the state dict (if any). */
5982 if (state != Py_None) {
5983 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005984 PyObject *d_key, *d_value;
5985 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005986 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005987
5988 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005989 PickleState *st = _Pickle_GetGlobalState();
5990 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005991 goto error;
5992 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005993 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005994 if (dict == NULL)
5995 goto error;
5996
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005997 i = 0;
5998 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5999 /* normally the keys for instance attributes are
6000 interned. we should try to do that here. */
6001 Py_INCREF(d_key);
6002 if (PyUnicode_CheckExact(d_key))
6003 PyUnicode_InternInPlace(&d_key);
6004 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6005 Py_DECREF(d_key);
6006 goto error;
6007 }
6008 Py_DECREF(d_key);
6009 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006010 Py_DECREF(dict);
6011 }
6012
6013 /* Also set instance attributes from the slotstate dict (if any). */
6014 if (slotstate != NULL) {
6015 PyObject *d_key, *d_value;
6016 Py_ssize_t i;
6017
6018 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006019 PickleState *st = _Pickle_GetGlobalState();
6020 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006021 "slot state is not a dictionary");
6022 goto error;
6023 }
6024 i = 0;
6025 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6026 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6027 goto error;
6028 }
6029 }
6030
6031 if (0) {
6032 error:
6033 status = -1;
6034 }
6035
6036 Py_DECREF(state);
6037 Py_XDECREF(slotstate);
6038 return status;
6039}
6040
6041static int
6042load_mark(UnpicklerObject *self)
6043{
6044
6045 /* Note that we split the (pickle.py) stack into two stacks, an
6046 * object stack and a mark stack. Here we push a mark onto the
6047 * mark stack.
6048 */
6049
6050 if ((self->num_marks + 1) >= self->marks_size) {
6051 size_t alloc;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006052
6053 /* Use the size_t type to check for overflow. */
6054 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006055 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006056 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006057 PyErr_NoMemory();
6058 return -1;
6059 }
6060
6061 if (self->marks == NULL)
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006062 self->marks = PyMem_NEW(Py_ssize_t, alloc);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006063 else
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006064 PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
6065 if (self->marks == NULL) {
6066 self->marks_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006067 PyErr_NoMemory();
6068 return -1;
6069 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006070 self->marks_size = (Py_ssize_t)alloc;
6071 }
6072
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006073 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006074
6075 return 0;
6076}
6077
6078static int
6079load_reduce(UnpicklerObject *self)
6080{
6081 PyObject *callable = NULL;
6082 PyObject *argtup = NULL;
6083 PyObject *obj = NULL;
6084
6085 PDATA_POP(self->stack, argtup);
6086 if (argtup == NULL)
6087 return -1;
6088 PDATA_POP(self->stack, callable);
6089 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006090 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006091 Py_DECREF(callable);
6092 }
6093 Py_DECREF(argtup);
6094
6095 if (obj == NULL)
6096 return -1;
6097
6098 PDATA_PUSH(self->stack, obj, -1);
6099 return 0;
6100}
6101
6102/* Just raises an error if we don't know the protocol specified. PROTO
6103 * is the first opcode for protocols >= 2.
6104 */
6105static int
6106load_proto(UnpicklerObject *self)
6107{
6108 char *s;
6109 int i;
6110
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006111 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006112 return -1;
6113
6114 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006115 if (i <= HIGHEST_PROTOCOL) {
6116 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006117 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006118 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006119
6120 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6121 return -1;
6122}
6123
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006124static int
6125load_frame(UnpicklerObject *self)
6126{
6127 char *s;
6128 Py_ssize_t frame_len;
6129
6130 if (_Unpickler_Read(self, &s, 8) < 0)
6131 return -1;
6132
6133 frame_len = calc_binsize(s, 8);
6134 if (frame_len < 0) {
6135 PyErr_Format(PyExc_OverflowError,
6136 "FRAME length exceeds system's maximum of %zd bytes",
6137 PY_SSIZE_T_MAX);
6138 return -1;
6139 }
6140
6141 if (_Unpickler_Read(self, &s, frame_len) < 0)
6142 return -1;
6143
6144 /* Rewind to start of frame */
6145 self->next_read_idx -= frame_len;
6146 return 0;
6147}
6148
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006149static PyObject *
6150load(UnpicklerObject *self)
6151{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006152 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006153 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006154
6155 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006156 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006157 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006158 Pdata_clear(self->stack, 0);
6159
6160 /* Convenient macros for the dispatch while-switch loop just below. */
6161#define OP(opcode, load_func) \
6162 case opcode: if (load_func(self) < 0) break; continue;
6163
6164#define OP_ARG(opcode, load_func, arg) \
6165 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6166
6167 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006168 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006169 break;
6170
6171 switch ((enum opcode)s[0]) {
6172 OP(NONE, load_none)
6173 OP(BININT, load_binint)
6174 OP(BININT1, load_binint1)
6175 OP(BININT2, load_binint2)
6176 OP(INT, load_int)
6177 OP(LONG, load_long)
6178 OP_ARG(LONG1, load_counted_long, 1)
6179 OP_ARG(LONG4, load_counted_long, 4)
6180 OP(FLOAT, load_float)
6181 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006182 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6183 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6184 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6185 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6186 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006187 OP(STRING, load_string)
6188 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006189 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6190 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6191 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006192 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6193 OP_ARG(TUPLE1, load_counted_tuple, 1)
6194 OP_ARG(TUPLE2, load_counted_tuple, 2)
6195 OP_ARG(TUPLE3, load_counted_tuple, 3)
6196 OP(TUPLE, load_tuple)
6197 OP(EMPTY_LIST, load_empty_list)
6198 OP(LIST, load_list)
6199 OP(EMPTY_DICT, load_empty_dict)
6200 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006201 OP(EMPTY_SET, load_empty_set)
6202 OP(ADDITEMS, load_additems)
6203 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006204 OP(OBJ, load_obj)
6205 OP(INST, load_inst)
6206 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006207 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006208 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006209 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006210 OP(APPEND, load_append)
6211 OP(APPENDS, load_appends)
6212 OP(BUILD, load_build)
6213 OP(DUP, load_dup)
6214 OP(BINGET, load_binget)
6215 OP(LONG_BINGET, load_long_binget)
6216 OP(GET, load_get)
6217 OP(MARK, load_mark)
6218 OP(BINPUT, load_binput)
6219 OP(LONG_BINPUT, load_long_binput)
6220 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006221 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006222 OP(POP, load_pop)
6223 OP(POP_MARK, load_pop_mark)
6224 OP(SETITEM, load_setitem)
6225 OP(SETITEMS, load_setitems)
6226 OP(PERSID, load_persid)
6227 OP(BINPERSID, load_binpersid)
6228 OP(REDUCE, load_reduce)
6229 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006230 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006231 OP_ARG(EXT1, load_extension, 1)
6232 OP_ARG(EXT2, load_extension, 2)
6233 OP_ARG(EXT4, load_extension, 4)
6234 OP_ARG(NEWTRUE, load_bool, Py_True)
6235 OP_ARG(NEWFALSE, load_bool, Py_False)
6236
6237 case STOP:
6238 break;
6239
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006240 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006241 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006242 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006243 }
6244 else {
6245 PickleState *st = _Pickle_GetGlobalState();
6246 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006247 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006248 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006249 return NULL;
6250 }
6251
6252 break; /* and we are done! */
6253 }
6254
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006255 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006256 return NULL;
6257 }
6258
Victor Stinner2ae57e32013-10-31 13:39:23 +01006259 if (_Unpickler_SkipConsumed(self) < 0)
6260 return NULL;
6261
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006262 PDATA_POP(self->stack, value);
6263 return value;
6264}
6265
Larry Hastings61272b72014-01-07 12:41:53 -08006266/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006267
6268_pickle.Unpickler.load
6269
6270Load a pickle.
6271
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006272Read a pickled object representation from the open file object given
6273in the constructor, and return the reconstituted object hierarchy
6274specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006275[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006276
Larry Hastings3cceb382014-01-04 11:09:09 -08006277static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006278_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006279/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006280{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006281 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006282
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006283 /* Check whether the Unpickler was initialized correctly. This prevents
6284 segfaulting if a subclass overridden __init__ with a function that does
6285 not call Unpickler.__init__(). Here, we simply ensure that self->read
6286 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006287 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006288 PickleState *st = _Pickle_GetGlobalState();
6289 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006290 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006291 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006292 return NULL;
6293 }
6294
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006295 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006296}
6297
6298/* The name of find_class() is misleading. In newer pickle protocols, this
6299 function is used for loading any global (i.e., functions), not just
6300 classes. The name is kept only for backward compatibility. */
6301
Larry Hastings61272b72014-01-07 12:41:53 -08006302/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006303
6304_pickle.Unpickler.find_class
6305
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006306 module_name: object
6307 global_name: object
6308 /
6309
6310Return an object from a specified module.
6311
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006312If necessary, the module will be imported. Subclasses may override
6313this method (e.g. to restrict unpickling of arbitrary classes and
6314functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006315
6316This method is called whenever a class or a function object is
6317needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006318[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006319
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006320static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006321_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
6322 PyObject *module_name,
6323 PyObject *global_name)
6324/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006325{
6326 PyObject *global;
6327 PyObject *modules_dict;
6328 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006329 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006330
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006331 /* Try to map the old names used in Python 2.x to the new ones used in
6332 Python 3.x. We do this only with old pickle protocols and when the
6333 user has not disabled the feature. */
6334 if (self->proto < 3 && self->fix_imports) {
6335 PyObject *key;
6336 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006337 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006338
6339 /* Check if the global (i.e., a function or a class) was renamed
6340 or moved to another module. */
6341 key = PyTuple_Pack(2, module_name, global_name);
6342 if (key == NULL)
6343 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006344 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006345 Py_DECREF(key);
6346 if (item) {
6347 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6348 PyErr_Format(PyExc_RuntimeError,
6349 "_compat_pickle.NAME_MAPPING values should be "
6350 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6351 return NULL;
6352 }
6353 module_name = PyTuple_GET_ITEM(item, 0);
6354 global_name = PyTuple_GET_ITEM(item, 1);
6355 if (!PyUnicode_Check(module_name) ||
6356 !PyUnicode_Check(global_name)) {
6357 PyErr_Format(PyExc_RuntimeError,
6358 "_compat_pickle.NAME_MAPPING values should be "
6359 "pairs of str, not (%.200s, %.200s)",
6360 Py_TYPE(module_name)->tp_name,
6361 Py_TYPE(global_name)->tp_name);
6362 return NULL;
6363 }
6364 }
6365 else if (PyErr_Occurred()) {
6366 return NULL;
6367 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03006368 else {
6369 /* Check if the module was renamed. */
6370 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
6371 if (item) {
6372 if (!PyUnicode_Check(item)) {
6373 PyErr_Format(PyExc_RuntimeError,
6374 "_compat_pickle.IMPORT_MAPPING values should be "
6375 "strings, not %.200s", Py_TYPE(item)->tp_name);
6376 return NULL;
6377 }
6378 module_name = item;
6379 }
6380 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006381 return NULL;
6382 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006383 }
6384 }
6385
Victor Stinnerbb520202013-11-06 22:40:41 +01006386 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006387 if (modules_dict == NULL) {
6388 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006389 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006390 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006391
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006392 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006393 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006394 if (PyErr_Occurred())
6395 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006396 module = PyImport_Import(module_name);
6397 if (module == NULL)
6398 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006399 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006400 Py_DECREF(module);
6401 }
Victor Stinner121aab42011-09-29 23:40:53 +02006402 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006403 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006404 }
6405 return global;
6406}
6407
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006408/*[clinic input]
6409
6410_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6411
6412Returns size in memory, in bytes.
6413[clinic start generated code]*/
6414
6415static Py_ssize_t
6416_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6417/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6418{
6419 Py_ssize_t res;
6420
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02006421 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006422 if (self->memo != NULL)
6423 res += self->memo_size * sizeof(PyObject *);
6424 if (self->marks != NULL)
6425 res += self->marks_size * sizeof(Py_ssize_t);
6426 if (self->input_line != NULL)
6427 res += strlen(self->input_line) + 1;
6428 if (self->encoding != NULL)
6429 res += strlen(self->encoding) + 1;
6430 if (self->errors != NULL)
6431 res += strlen(self->errors) + 1;
6432 return res;
6433}
6434
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006435static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006436 _PICKLE_UNPICKLER_LOAD_METHODDEF
6437 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006438 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006439 {NULL, NULL} /* sentinel */
6440};
6441
6442static void
6443Unpickler_dealloc(UnpicklerObject *self)
6444{
6445 PyObject_GC_UnTrack((PyObject *)self);
6446 Py_XDECREF(self->readline);
6447 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006448 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006449 Py_XDECREF(self->stack);
6450 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006451 if (self->buffer.buf != NULL) {
6452 PyBuffer_Release(&self->buffer);
6453 self->buffer.buf = NULL;
6454 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006455
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006456 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006457 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006458 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006459 PyMem_Free(self->encoding);
6460 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006461
6462 Py_TYPE(self)->tp_free((PyObject *)self);
6463}
6464
6465static int
6466Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6467{
6468 Py_VISIT(self->readline);
6469 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006470 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006471 Py_VISIT(self->stack);
6472 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006473 return 0;
6474}
6475
6476static int
6477Unpickler_clear(UnpicklerObject *self)
6478{
6479 Py_CLEAR(self->readline);
6480 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006481 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006482 Py_CLEAR(self->stack);
6483 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006484 if (self->buffer.buf != NULL) {
6485 PyBuffer_Release(&self->buffer);
6486 self->buffer.buf = NULL;
6487 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006488
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006489 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006490 PyMem_Free(self->marks);
6491 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006492 PyMem_Free(self->input_line);
6493 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006494 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006495 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006496 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006497 self->errors = NULL;
6498
6499 return 0;
6500}
6501
Larry Hastings61272b72014-01-07 12:41:53 -08006502/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006503
6504_pickle.Unpickler.__init__
6505
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006506 file: object
6507 *
6508 fix_imports: bool = True
6509 encoding: str = 'ASCII'
6510 errors: str = 'strict'
6511
6512This takes a binary file for reading a pickle data stream.
6513
6514The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006515protocol argument is needed. Bytes past the pickled object's
6516representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006517
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006518The argument *file* must have two methods, a read() method that takes
6519an integer argument, and a readline() method that requires no
6520arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00006521binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006522other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006523
6524Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6525which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006526generated by Python 2. If *fix_imports* is True, pickle will try to
6527map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006528*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006529instances pickled by Python 2; these default to 'ASCII' and 'strict',
6530respectively. The *encoding* can be 'bytes' to read these 8-bit
6531string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006532[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006533
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006534static int
Larry Hastings89964c42015-04-14 18:07:59 -04006535_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6536 int fix_imports, const char *encoding,
6537 const char *errors)
Martin Panter2eb819f2015-11-02 04:04:57 +00006538/*[clinic end generated code: output=e2c8ce748edc57b0 input=04ece661aa884837]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006539{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006540 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006541
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006542 /* In case of multiple __init__() calls, clear previous content. */
6543 if (self->read != NULL)
6544 (void)Unpickler_clear(self);
6545
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006546 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006547 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006548
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006549 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006550 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006551
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006552 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006553 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006554 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006555
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006556 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006557 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6558 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006559 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006560 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006561 }
6562 else {
6563 self->pers_func = NULL;
6564 }
6565
6566 self->stack = (Pdata *)Pdata_New();
6567 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006568 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006569
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006570 self->memo_size = 32;
6571 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006572 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006573 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006574
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006575 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006576
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006577 return 0;
6578}
6579
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006580
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006581/* Define a proxy object for the Unpickler's internal memo object. This is to
6582 * avoid breaking code like:
6583 * unpickler.memo.clear()
6584 * and
6585 * unpickler.memo = saved_memo
6586 * Is this a good idea? Not really, but we don't want to break code that uses
6587 * it. Note that we don't implement the entire mapping API here. This is
6588 * intentional, as these should be treated as black-box implementation details.
6589 *
6590 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006591 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006592 */
6593
Larry Hastings61272b72014-01-07 12:41:53 -08006594/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006595_pickle.UnpicklerMemoProxy.clear
6596
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006597Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006598[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006599
Larry Hastings3cceb382014-01-04 11:09:09 -08006600static PyObject *
6601_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006602/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006603{
6604 _Unpickler_MemoCleanup(self->unpickler);
6605 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6606 if (self->unpickler->memo == NULL)
6607 return NULL;
6608 Py_RETURN_NONE;
6609}
6610
Larry Hastings61272b72014-01-07 12:41:53 -08006611/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006612_pickle.UnpicklerMemoProxy.copy
6613
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006614Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006615[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006616
Larry Hastings3cceb382014-01-04 11:09:09 -08006617static PyObject *
6618_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006619/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006620{
6621 Py_ssize_t i;
6622 PyObject *new_memo = PyDict_New();
6623 if (new_memo == NULL)
6624 return NULL;
6625
6626 for (i = 0; i < self->unpickler->memo_size; i++) {
6627 int status;
6628 PyObject *key, *value;
6629
6630 value = self->unpickler->memo[i];
6631 if (value == NULL)
6632 continue;
6633
6634 key = PyLong_FromSsize_t(i);
6635 if (key == NULL)
6636 goto error;
6637 status = PyDict_SetItem(new_memo, key, value);
6638 Py_DECREF(key);
6639 if (status < 0)
6640 goto error;
6641 }
6642 return new_memo;
6643
6644error:
6645 Py_DECREF(new_memo);
6646 return NULL;
6647}
6648
Larry Hastings61272b72014-01-07 12:41:53 -08006649/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006650_pickle.UnpicklerMemoProxy.__reduce__
6651
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006652Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006653[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006654
Larry Hastings3cceb382014-01-04 11:09:09 -08006655static PyObject *
6656_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006657/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006658{
6659 PyObject *reduce_value;
6660 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006661 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006662 if (contents == NULL)
6663 return NULL;
6664
6665 reduce_value = PyTuple_New(2);
6666 if (reduce_value == NULL) {
6667 Py_DECREF(contents);
6668 return NULL;
6669 }
6670 constructor_args = PyTuple_New(1);
6671 if (constructor_args == NULL) {
6672 Py_DECREF(contents);
6673 Py_DECREF(reduce_value);
6674 return NULL;
6675 }
6676 PyTuple_SET_ITEM(constructor_args, 0, contents);
6677 Py_INCREF((PyObject *)&PyDict_Type);
6678 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6679 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6680 return reduce_value;
6681}
6682
6683static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006684 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6685 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6686 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006687 {NULL, NULL} /* sentinel */
6688};
6689
6690static void
6691UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6692{
6693 PyObject_GC_UnTrack(self);
6694 Py_XDECREF(self->unpickler);
6695 PyObject_GC_Del((PyObject *)self);
6696}
6697
6698static int
6699UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6700 visitproc visit, void *arg)
6701{
6702 Py_VISIT(self->unpickler);
6703 return 0;
6704}
6705
6706static int
6707UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6708{
6709 Py_CLEAR(self->unpickler);
6710 return 0;
6711}
6712
6713static PyTypeObject UnpicklerMemoProxyType = {
6714 PyVarObject_HEAD_INIT(NULL, 0)
6715 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6716 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6717 0,
6718 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6719 0, /* tp_print */
6720 0, /* tp_getattr */
6721 0, /* tp_setattr */
6722 0, /* tp_compare */
6723 0, /* tp_repr */
6724 0, /* tp_as_number */
6725 0, /* tp_as_sequence */
6726 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006727 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006728 0, /* tp_call */
6729 0, /* tp_str */
6730 PyObject_GenericGetAttr, /* tp_getattro */
6731 PyObject_GenericSetAttr, /* tp_setattro */
6732 0, /* tp_as_buffer */
6733 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6734 0, /* tp_doc */
6735 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6736 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6737 0, /* tp_richcompare */
6738 0, /* tp_weaklistoffset */
6739 0, /* tp_iter */
6740 0, /* tp_iternext */
6741 unpicklerproxy_methods, /* tp_methods */
6742};
6743
6744static PyObject *
6745UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6746{
6747 UnpicklerMemoProxyObject *self;
6748
6749 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6750 &UnpicklerMemoProxyType);
6751 if (self == NULL)
6752 return NULL;
6753 Py_INCREF(unpickler);
6754 self->unpickler = unpickler;
6755 PyObject_GC_Track(self);
6756 return (PyObject *)self;
6757}
6758
6759/*****************************************************************************/
6760
6761
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006762static PyObject *
6763Unpickler_get_memo(UnpicklerObject *self)
6764{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006765 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006766}
6767
6768static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006769Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006770{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006771 PyObject **new_memo;
6772 Py_ssize_t new_memo_size = 0;
6773 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006774
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006775 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006776 PyErr_SetString(PyExc_TypeError,
6777 "attribute deletion is not supported");
6778 return -1;
6779 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006780
6781 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6782 UnpicklerObject *unpickler =
6783 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6784
6785 new_memo_size = unpickler->memo_size;
6786 new_memo = _Unpickler_NewMemo(new_memo_size);
6787 if (new_memo == NULL)
6788 return -1;
6789
6790 for (i = 0; i < new_memo_size; i++) {
6791 Py_XINCREF(unpickler->memo[i]);
6792 new_memo[i] = unpickler->memo[i];
6793 }
6794 }
6795 else if (PyDict_Check(obj)) {
6796 Py_ssize_t i = 0;
6797 PyObject *key, *value;
6798
6799 new_memo_size = PyDict_Size(obj);
6800 new_memo = _Unpickler_NewMemo(new_memo_size);
6801 if (new_memo == NULL)
6802 return -1;
6803
6804 while (PyDict_Next(obj, &i, &key, &value)) {
6805 Py_ssize_t idx;
6806 if (!PyLong_Check(key)) {
6807 PyErr_SetString(PyExc_TypeError,
6808 "memo key must be integers");
6809 goto error;
6810 }
6811 idx = PyLong_AsSsize_t(key);
6812 if (idx == -1 && PyErr_Occurred())
6813 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006814 if (idx < 0) {
6815 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006816 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006817 goto error;
6818 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006819 if (_Unpickler_MemoPut(self, idx, value) < 0)
6820 goto error;
6821 }
6822 }
6823 else {
6824 PyErr_Format(PyExc_TypeError,
6825 "'memo' attribute must be an UnpicklerMemoProxy object"
6826 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006827 return -1;
6828 }
6829
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006830 _Unpickler_MemoCleanup(self);
6831 self->memo_size = new_memo_size;
6832 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006833
6834 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006835
6836 error:
6837 if (new_memo_size) {
6838 i = new_memo_size;
6839 while (--i >= 0) {
6840 Py_XDECREF(new_memo[i]);
6841 }
6842 PyMem_FREE(new_memo);
6843 }
6844 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006845}
6846
6847static PyObject *
6848Unpickler_get_persload(UnpicklerObject *self)
6849{
6850 if (self->pers_func == NULL)
6851 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6852 else
6853 Py_INCREF(self->pers_func);
6854 return self->pers_func;
6855}
6856
6857static int
6858Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6859{
6860 PyObject *tmp;
6861
6862 if (value == NULL) {
6863 PyErr_SetString(PyExc_TypeError,
6864 "attribute deletion is not supported");
6865 return -1;
6866 }
6867 if (!PyCallable_Check(value)) {
6868 PyErr_SetString(PyExc_TypeError,
6869 "persistent_load must be a callable taking "
6870 "one argument");
6871 return -1;
6872 }
6873
6874 tmp = self->pers_func;
6875 Py_INCREF(value);
6876 self->pers_func = value;
6877 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6878
6879 return 0;
6880}
6881
6882static PyGetSetDef Unpickler_getsets[] = {
6883 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6884 {"persistent_load", (getter)Unpickler_get_persload,
6885 (setter)Unpickler_set_persload},
6886 {NULL}
6887};
6888
6889static PyTypeObject Unpickler_Type = {
6890 PyVarObject_HEAD_INIT(NULL, 0)
6891 "_pickle.Unpickler", /*tp_name*/
6892 sizeof(UnpicklerObject), /*tp_basicsize*/
6893 0, /*tp_itemsize*/
6894 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6895 0, /*tp_print*/
6896 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006897 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006898 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006899 0, /*tp_repr*/
6900 0, /*tp_as_number*/
6901 0, /*tp_as_sequence*/
6902 0, /*tp_as_mapping*/
6903 0, /*tp_hash*/
6904 0, /*tp_call*/
6905 0, /*tp_str*/
6906 0, /*tp_getattro*/
6907 0, /*tp_setattro*/
6908 0, /*tp_as_buffer*/
6909 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006910 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006911 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6912 (inquiry)Unpickler_clear, /*tp_clear*/
6913 0, /*tp_richcompare*/
6914 0, /*tp_weaklistoffset*/
6915 0, /*tp_iter*/
6916 0, /*tp_iternext*/
6917 Unpickler_methods, /*tp_methods*/
6918 0, /*tp_members*/
6919 Unpickler_getsets, /*tp_getset*/
6920 0, /*tp_base*/
6921 0, /*tp_dict*/
6922 0, /*tp_descr_get*/
6923 0, /*tp_descr_set*/
6924 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006925 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006926 PyType_GenericAlloc, /*tp_alloc*/
6927 PyType_GenericNew, /*tp_new*/
6928 PyObject_GC_Del, /*tp_free*/
6929 0, /*tp_is_gc*/
6930};
6931
Larry Hastings61272b72014-01-07 12:41:53 -08006932/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006933
6934_pickle.dump
6935
6936 obj: object
6937 file: object
6938 protocol: object = NULL
6939 *
6940 fix_imports: bool = True
6941
6942Write a pickled representation of obj to the open file object file.
6943
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006944This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6945be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006946
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006947The optional *protocol* argument tells the pickler to use the given
6948protocol supported protocols are 0, 1, 2, 3 and 4. The default
6949protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006950
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006951Specifying a negative protocol version selects the highest protocol
6952version supported. The higher the protocol used, the more recent the
6953version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006954
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006955The *file* argument must have a write() method that accepts a single
6956bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00006957writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006958this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006959
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006960If *fix_imports* is True and protocol is less than 3, pickle will try
6961to map the new Python 3 names to the old module names used in Python
69622, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006963[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006964
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006965static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006966_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file,
6967 PyObject *protocol, int fix_imports)
Martin Panter2eb819f2015-11-02 04:04:57 +00006968/*[clinic end generated code: output=0de7dff89c406816 input=830f8a64cef6f042]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006969{
6970 PicklerObject *pickler = _Pickler_New();
6971
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006972 if (pickler == NULL)
6973 return NULL;
6974
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006975 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006976 goto error;
6977
6978 if (_Pickler_SetOutputStream(pickler, file) < 0)
6979 goto error;
6980
6981 if (dump(pickler, obj) < 0)
6982 goto error;
6983
6984 if (_Pickler_FlushToFile(pickler) < 0)
6985 goto error;
6986
6987 Py_DECREF(pickler);
6988 Py_RETURN_NONE;
6989
6990 error:
6991 Py_XDECREF(pickler);
6992 return NULL;
6993}
6994
Larry Hastings61272b72014-01-07 12:41:53 -08006995/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006996
6997_pickle.dumps
6998
6999 obj: object
7000 protocol: object = NULL
7001 *
7002 fix_imports: bool = True
7003
7004Return the pickled representation of the object as a bytes object.
7005
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007006The optional *protocol* argument tells the pickler to use the given
7007protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7008protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007009
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007010Specifying a negative protocol version selects the highest protocol
7011version supported. The higher the protocol used, the more recent the
7012version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007013
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007014If *fix_imports* is True and *protocol* is less than 3, pickle will
7015try to map the new Python 3 names to the old module names used in
7016Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007017[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007018
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007019static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007020_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol,
7021 int fix_imports)
7022/*[clinic end generated code: output=daa380db56fe07b9 input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007023{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007024 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007025 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007026
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007027 if (pickler == NULL)
7028 return NULL;
7029
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007030 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007031 goto error;
7032
7033 if (dump(pickler, obj) < 0)
7034 goto error;
7035
7036 result = _Pickler_GetString(pickler);
7037 Py_DECREF(pickler);
7038 return result;
7039
7040 error:
7041 Py_XDECREF(pickler);
7042 return NULL;
7043}
7044
Larry Hastings61272b72014-01-07 12:41:53 -08007045/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007046
7047_pickle.load
7048
7049 file: object
7050 *
7051 fix_imports: bool = True
7052 encoding: str = 'ASCII'
7053 errors: str = 'strict'
7054
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007055Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007056
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007057This is equivalent to ``Unpickler(file).load()``, but may be more
7058efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007059
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007060The protocol version of the pickle is detected automatically, so no
7061protocol argument is needed. Bytes past the pickled object's
7062representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007063
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007064The argument *file* must have two methods, a read() method that takes
7065an integer argument, and a readline() method that requires no
7066arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007067binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007068other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007069
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007070Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7071which are used to control compatiblity support for pickle stream
7072generated by Python 2. If *fix_imports* is True, pickle will try to
7073map the old Python 2 names to the new names used in Python 3. The
7074*encoding* and *errors* tell pickle how to decode 8-bit string
7075instances pickled by Python 2; these default to 'ASCII' and 'strict',
7076respectively. The *encoding* can be 'bytes' to read these 8-bit
7077string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007078[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007079
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007080static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007081_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports,
7082 const char *encoding, const char *errors)
Martin Panter2eb819f2015-11-02 04:04:57 +00007083/*[clinic end generated code: output=798f1c57cb2b4eb1 input=2df7c7a1e6742204]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007084{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007085 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007086 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007087
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007088 if (unpickler == NULL)
7089 return NULL;
7090
7091 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7092 goto error;
7093
7094 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7095 goto error;
7096
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007097 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007098
7099 result = load(unpickler);
7100 Py_DECREF(unpickler);
7101 return result;
7102
7103 error:
7104 Py_XDECREF(unpickler);
7105 return NULL;
7106}
7107
Larry Hastings61272b72014-01-07 12:41:53 -08007108/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007109
7110_pickle.loads
7111
7112 data: object
7113 *
7114 fix_imports: bool = True
7115 encoding: str = 'ASCII'
7116 errors: str = 'strict'
7117
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007118Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007119
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007120The protocol version of the pickle is detected automatically, so no
7121protocol argument is needed. Bytes past the pickled object's
7122representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007123
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007124Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7125which are used to control compatiblity support for pickle stream
7126generated by Python 2. If *fix_imports* is True, pickle will try to
7127map the old Python 2 names to the new names used in Python 3. The
7128*encoding* and *errors* tell pickle how to decode 8-bit string
7129instances pickled by Python 2; these default to 'ASCII' and 'strict',
7130respectively. The *encoding* can be 'bytes' to read these 8-bit
7131string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007132[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007133
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007134static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007135_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports,
7136 const char *encoding, const char *errors)
7137/*[clinic end generated code: output=61e9cdb01e36a736 input=f57f0fdaa2b4cb8b]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007138{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007139 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007140 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007141
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007142 if (unpickler == NULL)
7143 return NULL;
7144
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007145 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007146 goto error;
7147
7148 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7149 goto error;
7150
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007151 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007152
7153 result = load(unpickler);
7154 Py_DECREF(unpickler);
7155 return result;
7156
7157 error:
7158 Py_XDECREF(unpickler);
7159 return NULL;
7160}
7161
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007162static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007163 _PICKLE_DUMP_METHODDEF
7164 _PICKLE_DUMPS_METHODDEF
7165 _PICKLE_LOAD_METHODDEF
7166 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007167 {NULL, NULL} /* sentinel */
7168};
7169
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007170static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007171pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007172{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007173 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007174 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007175}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007176
Stefan Krahf483b0f2013-12-14 13:43:10 +01007177static void
7178pickle_free(PyObject *m)
7179{
7180 _Pickle_ClearState(_Pickle_GetState(m));
7181}
7182
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007183static int
7184pickle_traverse(PyObject *m, visitproc visit, void *arg)
7185{
7186 PickleState *st = _Pickle_GetState(m);
7187 Py_VISIT(st->PickleError);
7188 Py_VISIT(st->PicklingError);
7189 Py_VISIT(st->UnpicklingError);
7190 Py_VISIT(st->dispatch_table);
7191 Py_VISIT(st->extension_registry);
7192 Py_VISIT(st->extension_cache);
7193 Py_VISIT(st->inverted_registry);
7194 Py_VISIT(st->name_mapping_2to3);
7195 Py_VISIT(st->import_mapping_2to3);
7196 Py_VISIT(st->name_mapping_3to2);
7197 Py_VISIT(st->import_mapping_3to2);
7198 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007199 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007200 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007201}
7202
7203static struct PyModuleDef _picklemodule = {
7204 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007205 "_pickle", /* m_name */
7206 pickle_module_doc, /* m_doc */
7207 sizeof(PickleState), /* m_size */
7208 pickle_methods, /* m_methods */
7209 NULL, /* m_reload */
7210 pickle_traverse, /* m_traverse */
7211 pickle_clear, /* m_clear */
7212 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007213};
7214
7215PyMODINIT_FUNC
7216PyInit__pickle(void)
7217{
7218 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007219 PickleState *st;
7220
7221 m = PyState_FindModule(&_picklemodule);
7222 if (m) {
7223 Py_INCREF(m);
7224 return m;
7225 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007226
7227 if (PyType_Ready(&Unpickler_Type) < 0)
7228 return NULL;
7229 if (PyType_Ready(&Pickler_Type) < 0)
7230 return NULL;
7231 if (PyType_Ready(&Pdata_Type) < 0)
7232 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007233 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7234 return NULL;
7235 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7236 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007237
7238 /* Create the module and add the functions. */
7239 m = PyModule_Create(&_picklemodule);
7240 if (m == NULL)
7241 return NULL;
7242
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007243 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007244 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7245 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007246 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007247 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7248 return NULL;
7249
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007250 st = _Pickle_GetState(m);
7251
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007252 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007253 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7254 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007255 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007256 st->PicklingError = \
7257 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7258 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007259 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007260 st->UnpicklingError = \
7261 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7262 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007263 return NULL;
7264
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007265 Py_INCREF(st->PickleError);
7266 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007267 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007268 Py_INCREF(st->PicklingError);
7269 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007270 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007271 Py_INCREF(st->UnpicklingError);
7272 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007273 return NULL;
7274
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007275 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007276 return NULL;
7277
7278 return m;
7279}