blob: f3b73f176dd0703fd078c4b4bbcc57646fda4c46 [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{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800462 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000463 if (Py_SIZE(self) == 0) {
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
4018 res = sizeof(PicklerObject);
4019 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
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004103writing, a io.BytesIO instance, or any other custom object that meets
4104this 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)
4114/*[clinic end generated code: output=b5f31078dab17fb0 input=b8cdeb7e3f5ee674]*/
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
4987load_tuple(UnpicklerObject *self)
4988{
4989 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004990 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004991
4992 if ((i = marker(self)) < 0)
4993 return -1;
4994
4995 tuple = Pdata_poptuple(self->stack, i);
4996 if (tuple == NULL)
4997 return -1;
4998 PDATA_PUSH(self->stack, tuple, -1);
4999 return 0;
5000}
5001
5002static int
5003load_counted_tuple(UnpicklerObject *self, int len)
5004{
5005 PyObject *tuple;
5006
5007 tuple = PyTuple_New(len);
5008 if (tuple == NULL)
5009 return -1;
5010
5011 while (--len >= 0) {
5012 PyObject *item;
5013
5014 PDATA_POP(self->stack, item);
5015 if (item == NULL)
5016 return -1;
5017 PyTuple_SET_ITEM(tuple, len, item);
5018 }
5019 PDATA_PUSH(self->stack, tuple, -1);
5020 return 0;
5021}
5022
5023static int
5024load_empty_list(UnpicklerObject *self)
5025{
5026 PyObject *list;
5027
5028 if ((list = PyList_New(0)) == NULL)
5029 return -1;
5030 PDATA_PUSH(self->stack, list, -1);
5031 return 0;
5032}
5033
5034static int
5035load_empty_dict(UnpicklerObject *self)
5036{
5037 PyObject *dict;
5038
5039 if ((dict = PyDict_New()) == NULL)
5040 return -1;
5041 PDATA_PUSH(self->stack, dict, -1);
5042 return 0;
5043}
5044
5045static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005046load_empty_set(UnpicklerObject *self)
5047{
5048 PyObject *set;
5049
5050 if ((set = PySet_New(NULL)) == NULL)
5051 return -1;
5052 PDATA_PUSH(self->stack, set, -1);
5053 return 0;
5054}
5055
5056static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005057load_list(UnpicklerObject *self)
5058{
5059 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005060 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005061
5062 if ((i = marker(self)) < 0)
5063 return -1;
5064
5065 list = Pdata_poplist(self->stack, i);
5066 if (list == NULL)
5067 return -1;
5068 PDATA_PUSH(self->stack, list, -1);
5069 return 0;
5070}
5071
5072static int
5073load_dict(UnpicklerObject *self)
5074{
5075 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005076 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005077
5078 if ((i = marker(self)) < 0)
5079 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005080 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005081
5082 if ((dict = PyDict_New()) == NULL)
5083 return -1;
5084
5085 for (k = i + 1; k < j; k += 2) {
5086 key = self->stack->data[k - 1];
5087 value = self->stack->data[k];
5088 if (PyDict_SetItem(dict, key, value) < 0) {
5089 Py_DECREF(dict);
5090 return -1;
5091 }
5092 }
5093 Pdata_clear(self->stack, i);
5094 PDATA_PUSH(self->stack, dict, -1);
5095 return 0;
5096}
5097
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005098static int
5099load_frozenset(UnpicklerObject *self)
5100{
5101 PyObject *items;
5102 PyObject *frozenset;
5103 Py_ssize_t i;
5104
5105 if ((i = marker(self)) < 0)
5106 return -1;
5107
5108 items = Pdata_poptuple(self->stack, i);
5109 if (items == NULL)
5110 return -1;
5111
5112 frozenset = PyFrozenSet_New(items);
5113 Py_DECREF(items);
5114 if (frozenset == NULL)
5115 return -1;
5116
5117 PDATA_PUSH(self->stack, frozenset, -1);
5118 return 0;
5119}
5120
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005121static PyObject *
5122instantiate(PyObject *cls, PyObject *args)
5123{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005124 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005125 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005126 /* Caller must assure args are a tuple. Normally, args come from
5127 Pdata_poptuple which packs objects from the top of the stack
5128 into a newly created tuple. */
5129 assert(PyTuple_Check(args));
5130 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005131 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005132 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005133 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005134 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005135 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005136
5137 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005138 }
5139 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005140}
5141
5142static int
5143load_obj(UnpicklerObject *self)
5144{
5145 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005146 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005147
5148 if ((i = marker(self)) < 0)
5149 return -1;
5150
5151 args = Pdata_poptuple(self->stack, i + 1);
5152 if (args == NULL)
5153 return -1;
5154
5155 PDATA_POP(self->stack, cls);
5156 if (cls) {
5157 obj = instantiate(cls, args);
5158 Py_DECREF(cls);
5159 }
5160 Py_DECREF(args);
5161 if (obj == NULL)
5162 return -1;
5163
5164 PDATA_PUSH(self->stack, obj, -1);
5165 return 0;
5166}
5167
5168static int
5169load_inst(UnpicklerObject *self)
5170{
5171 PyObject *cls = NULL;
5172 PyObject *args = NULL;
5173 PyObject *obj = NULL;
5174 PyObject *module_name;
5175 PyObject *class_name;
5176 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005177 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005178 char *s;
5179
5180 if ((i = marker(self)) < 0)
5181 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005182 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005183 return -1;
5184 if (len < 2)
5185 return bad_readline();
5186
5187 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5188 identifiers are permitted in Python 3.0, since the INST opcode is only
5189 supported by older protocols on Python 2.x. */
5190 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5191 if (module_name == NULL)
5192 return -1;
5193
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005194 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005195 if (len < 2)
5196 return bad_readline();
5197 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005198 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005199 cls = find_class(self, module_name, class_name);
5200 Py_DECREF(class_name);
5201 }
5202 }
5203 Py_DECREF(module_name);
5204
5205 if (cls == NULL)
5206 return -1;
5207
5208 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5209 obj = instantiate(cls, args);
5210 Py_DECREF(args);
5211 }
5212 Py_DECREF(cls);
5213
5214 if (obj == NULL)
5215 return -1;
5216
5217 PDATA_PUSH(self->stack, obj, -1);
5218 return 0;
5219}
5220
5221static int
5222load_newobj(UnpicklerObject *self)
5223{
5224 PyObject *args = NULL;
5225 PyObject *clsraw = NULL;
5226 PyTypeObject *cls; /* clsraw cast to its true type */
5227 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005228 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005229
5230 /* Stack is ... cls argtuple, and we want to call
5231 * cls.__new__(cls, *argtuple).
5232 */
5233 PDATA_POP(self->stack, args);
5234 if (args == NULL)
5235 goto error;
5236 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005237 PyErr_SetString(st->UnpicklingError,
5238 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005239 goto error;
5240 }
5241
5242 PDATA_POP(self->stack, clsraw);
5243 cls = (PyTypeObject *)clsraw;
5244 if (cls == NULL)
5245 goto error;
5246 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005247 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005248 "isn't a type object");
5249 goto error;
5250 }
5251 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005252 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005253 "has NULL tp_new");
5254 goto error;
5255 }
5256
5257 /* Call __new__. */
5258 obj = cls->tp_new(cls, args, NULL);
5259 if (obj == NULL)
5260 goto error;
5261
5262 Py_DECREF(args);
5263 Py_DECREF(clsraw);
5264 PDATA_PUSH(self->stack, obj, -1);
5265 return 0;
5266
5267 error:
5268 Py_XDECREF(args);
5269 Py_XDECREF(clsraw);
5270 return -1;
5271}
5272
5273static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005274load_newobj_ex(UnpicklerObject *self)
5275{
5276 PyObject *cls, *args, *kwargs;
5277 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005278 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005279
5280 PDATA_POP(self->stack, kwargs);
5281 if (kwargs == NULL) {
5282 return -1;
5283 }
5284 PDATA_POP(self->stack, args);
5285 if (args == NULL) {
5286 Py_DECREF(kwargs);
5287 return -1;
5288 }
5289 PDATA_POP(self->stack, cls);
5290 if (cls == NULL) {
5291 Py_DECREF(kwargs);
5292 Py_DECREF(args);
5293 return -1;
5294 }
Larry Hastings61272b72014-01-07 12:41:53 -08005295
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005296 if (!PyType_Check(cls)) {
5297 Py_DECREF(kwargs);
5298 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005299 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005300 "NEWOBJ_EX class argument must be a type, not %.200s",
5301 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005302 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005303 return -1;
5304 }
5305
5306 if (((PyTypeObject *)cls)->tp_new == NULL) {
5307 Py_DECREF(kwargs);
5308 Py_DECREF(args);
5309 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005310 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005311 "NEWOBJ_EX class argument doesn't have __new__");
5312 return -1;
5313 }
5314 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5315 Py_DECREF(kwargs);
5316 Py_DECREF(args);
5317 Py_DECREF(cls);
5318 if (obj == NULL) {
5319 return -1;
5320 }
5321 PDATA_PUSH(self->stack, obj, -1);
5322 return 0;
5323}
5324
5325static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005326load_global(UnpicklerObject *self)
5327{
5328 PyObject *global = NULL;
5329 PyObject *module_name;
5330 PyObject *global_name;
5331 Py_ssize_t len;
5332 char *s;
5333
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005334 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005335 return -1;
5336 if (len < 2)
5337 return bad_readline();
5338 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5339 if (!module_name)
5340 return -1;
5341
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005342 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005343 if (len < 2) {
5344 Py_DECREF(module_name);
5345 return bad_readline();
5346 }
5347 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5348 if (global_name) {
5349 global = find_class(self, module_name, global_name);
5350 Py_DECREF(global_name);
5351 }
5352 }
5353 Py_DECREF(module_name);
5354
5355 if (global == NULL)
5356 return -1;
5357 PDATA_PUSH(self->stack, global, -1);
5358 return 0;
5359}
5360
5361static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005362load_stack_global(UnpicklerObject *self)
5363{
5364 PyObject *global;
5365 PyObject *module_name;
5366 PyObject *global_name;
5367
5368 PDATA_POP(self->stack, global_name);
5369 PDATA_POP(self->stack, module_name);
5370 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5371 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005372 PickleState *st = _Pickle_GetGlobalState();
5373 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005374 Py_XDECREF(global_name);
5375 Py_XDECREF(module_name);
5376 return -1;
5377 }
5378 global = find_class(self, module_name, global_name);
5379 Py_DECREF(global_name);
5380 Py_DECREF(module_name);
5381 if (global == NULL)
5382 return -1;
5383 PDATA_PUSH(self->stack, global, -1);
5384 return 0;
5385}
5386
5387static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005388load_persid(UnpicklerObject *self)
5389{
5390 PyObject *pid;
5391 Py_ssize_t len;
5392 char *s;
5393
5394 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005395 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005396 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005397 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005398 return bad_readline();
5399
5400 pid = PyBytes_FromStringAndSize(s, len - 1);
5401 if (pid == NULL)
5402 return -1;
5403
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005404 /* This does not leak since _Pickle_FastCall() steals the reference
5405 to pid first. */
5406 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005407 if (pid == NULL)
5408 return -1;
5409
5410 PDATA_PUSH(self->stack, pid, -1);
5411 return 0;
5412 }
5413 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005414 PickleState *st = _Pickle_GetGlobalState();
5415 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005416 "A load persistent id instruction was encountered,\n"
5417 "but no persistent_load function was specified.");
5418 return -1;
5419 }
5420}
5421
5422static int
5423load_binpersid(UnpicklerObject *self)
5424{
5425 PyObject *pid;
5426
5427 if (self->pers_func) {
5428 PDATA_POP(self->stack, pid);
5429 if (pid == NULL)
5430 return -1;
5431
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005432 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005433 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005434 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005435 if (pid == NULL)
5436 return -1;
5437
5438 PDATA_PUSH(self->stack, pid, -1);
5439 return 0;
5440 }
5441 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005442 PickleState *st = _Pickle_GetGlobalState();
5443 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005444 "A load persistent id instruction was encountered,\n"
5445 "but no persistent_load function was specified.");
5446 return -1;
5447 }
5448}
5449
5450static int
5451load_pop(UnpicklerObject *self)
5452{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005453 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005454
5455 /* Note that we split the (pickle.py) stack into two stacks,
5456 * an object stack and a mark stack. We have to be clever and
5457 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005458 * mark stack first, and only signalling a stack underflow if
5459 * the object stack is empty and the mark stack doesn't match
5460 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005461 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005462 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005463 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005464 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005465 len--;
5466 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005467 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005468 } else {
5469 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005470 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005471 return 0;
5472}
5473
5474static int
5475load_pop_mark(UnpicklerObject *self)
5476{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005477 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005478
5479 if ((i = marker(self)) < 0)
5480 return -1;
5481
5482 Pdata_clear(self->stack, i);
5483
5484 return 0;
5485}
5486
5487static int
5488load_dup(UnpicklerObject *self)
5489{
5490 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005491 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005492
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005493 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005494 return stack_underflow();
5495 last = self->stack->data[len - 1];
5496 PDATA_APPEND(self->stack, last, -1);
5497 return 0;
5498}
5499
5500static int
5501load_get(UnpicklerObject *self)
5502{
5503 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005504 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005505 Py_ssize_t len;
5506 char *s;
5507
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005508 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005509 return -1;
5510 if (len < 2)
5511 return bad_readline();
5512
5513 key = PyLong_FromString(s, NULL, 10);
5514 if (key == NULL)
5515 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005516 idx = PyLong_AsSsize_t(key);
5517 if (idx == -1 && PyErr_Occurred()) {
5518 Py_DECREF(key);
5519 return -1;
5520 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005521
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005522 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005523 if (value == NULL) {
5524 if (!PyErr_Occurred())
5525 PyErr_SetObject(PyExc_KeyError, key);
5526 Py_DECREF(key);
5527 return -1;
5528 }
5529 Py_DECREF(key);
5530
5531 PDATA_APPEND(self->stack, value, -1);
5532 return 0;
5533}
5534
5535static int
5536load_binget(UnpicklerObject *self)
5537{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005538 PyObject *value;
5539 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005540 char *s;
5541
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005542 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005543 return -1;
5544
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005545 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005546
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005547 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005548 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005549 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005550 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005551 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005552 Py_DECREF(key);
5553 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005554 return -1;
5555 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005556
5557 PDATA_APPEND(self->stack, value, -1);
5558 return 0;
5559}
5560
5561static int
5562load_long_binget(UnpicklerObject *self)
5563{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005564 PyObject *value;
5565 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005566 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005567
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005568 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005569 return -1;
5570
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005571 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005572
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005573 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005574 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005575 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005576 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005577 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005578 Py_DECREF(key);
5579 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005580 return -1;
5581 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005582
5583 PDATA_APPEND(self->stack, value, -1);
5584 return 0;
5585}
5586
5587/* Push an object from the extension registry (EXT[124]). nbytes is
5588 * the number of bytes following the opcode, holding the index (code) value.
5589 */
5590static int
5591load_extension(UnpicklerObject *self, int nbytes)
5592{
5593 char *codebytes; /* the nbytes bytes after the opcode */
5594 long code; /* calc_binint returns long */
5595 PyObject *py_code; /* code as a Python int */
5596 PyObject *obj; /* the object to push */
5597 PyObject *pair; /* (module_name, class_name) */
5598 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005599 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005600
5601 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005602 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005603 return -1;
5604 code = calc_binint(codebytes, nbytes);
5605 if (code <= 0) { /* note that 0 is forbidden */
5606 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005607 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005608 return -1;
5609 }
5610
5611 /* Look for the code in the cache. */
5612 py_code = PyLong_FromLong(code);
5613 if (py_code == NULL)
5614 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005615 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005616 if (obj != NULL) {
5617 /* Bingo. */
5618 Py_DECREF(py_code);
5619 PDATA_APPEND(self->stack, obj, -1);
5620 return 0;
5621 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005622 if (PyErr_Occurred()) {
5623 Py_DECREF(py_code);
5624 return -1;
5625 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005626
5627 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005628 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005629 if (pair == NULL) {
5630 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005631 if (!PyErr_Occurred()) {
5632 PyErr_Format(PyExc_ValueError, "unregistered extension "
5633 "code %ld", code);
5634 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005635 return -1;
5636 }
5637 /* Since the extension registry is manipulable via Python code,
5638 * confirm that pair is really a 2-tuple of strings.
5639 */
5640 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5641 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5642 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5643 Py_DECREF(py_code);
5644 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5645 "isn't a 2-tuple of strings", code);
5646 return -1;
5647 }
5648 /* Load the object. */
5649 obj = find_class(self, module_name, class_name);
5650 if (obj == NULL) {
5651 Py_DECREF(py_code);
5652 return -1;
5653 }
5654 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005655 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005656 Py_DECREF(py_code);
5657 if (code < 0) {
5658 Py_DECREF(obj);
5659 return -1;
5660 }
5661 PDATA_PUSH(self->stack, obj, -1);
5662 return 0;
5663}
5664
5665static int
5666load_put(UnpicklerObject *self)
5667{
5668 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005669 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005670 Py_ssize_t len;
5671 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005672
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005673 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674 return -1;
5675 if (len < 2)
5676 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005677 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005678 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005679 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005680
5681 key = PyLong_FromString(s, NULL, 10);
5682 if (key == NULL)
5683 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005684 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005685 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005686 if (idx < 0) {
5687 if (!PyErr_Occurred())
5688 PyErr_SetString(PyExc_ValueError,
5689 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005690 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005691 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005692
5693 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005694}
5695
5696static int
5697load_binput(UnpicklerObject *self)
5698{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005699 PyObject *value;
5700 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005701 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005702
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005703 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005704 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005705
5706 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005707 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005708 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005709
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005710 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005711
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005712 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005713}
5714
5715static int
5716load_long_binput(UnpicklerObject *self)
5717{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005718 PyObject *value;
5719 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005720 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005721
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005722 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005723 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005724
5725 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005726 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005727 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005728
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005729 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005730 if (idx < 0) {
5731 PyErr_SetString(PyExc_ValueError,
5732 "negative LONG_BINPUT argument");
5733 return -1;
5734 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005735
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005736 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005737}
5738
5739static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005740load_memoize(UnpicklerObject *self)
5741{
5742 PyObject *value;
5743
5744 if (Py_SIZE(self->stack) <= 0)
5745 return stack_underflow();
5746 value = self->stack->data[Py_SIZE(self->stack) - 1];
5747
5748 return _Unpickler_MemoPut(self, self->memo_len, value);
5749}
5750
5751static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005752do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005753{
5754 PyObject *value;
5755 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005756 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005757
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005758 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005759 if (x > len || x <= 0)
5760 return stack_underflow();
5761 if (len == x) /* nothing to do */
5762 return 0;
5763
5764 list = self->stack->data[x - 1];
5765
5766 if (PyList_Check(list)) {
5767 PyObject *slice;
5768 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005769 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005770
5771 slice = Pdata_poplist(self->stack, x);
5772 if (!slice)
5773 return -1;
5774 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005775 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005776 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005777 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005778 }
5779 else {
5780 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005781 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005782
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005783 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005784 if (append_func == NULL)
5785 return -1;
5786 for (i = x; i < len; i++) {
5787 PyObject *result;
5788
5789 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005790 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005791 if (result == NULL) {
5792 Pdata_clear(self->stack, i + 1);
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 return -1;
5796 }
5797 Py_DECREF(result);
5798 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005799 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005800 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005801 }
5802
5803 return 0;
5804}
5805
5806static int
5807load_append(UnpicklerObject *self)
5808{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005809 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005810}
5811
5812static int
5813load_appends(UnpicklerObject *self)
5814{
5815 return do_append(self, marker(self));
5816}
5817
5818static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005819do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005820{
5821 PyObject *value, *key;
5822 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005823 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005824 int status = 0;
5825
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005826 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005827 if (x > len || x <= 0)
5828 return stack_underflow();
5829 if (len == x) /* nothing to do */
5830 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005831 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005832 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005833 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005834 PyErr_SetString(st->UnpicklingError,
5835 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005836 return -1;
5837 }
5838
5839 /* Here, dict does not actually need to be a PyDict; it could be anything
5840 that supports the __setitem__ attribute. */
5841 dict = self->stack->data[x - 1];
5842
5843 for (i = x + 1; i < len; i += 2) {
5844 key = self->stack->data[i - 1];
5845 value = self->stack->data[i];
5846 if (PyObject_SetItem(dict, key, value) < 0) {
5847 status = -1;
5848 break;
5849 }
5850 }
5851
5852 Pdata_clear(self->stack, x);
5853 return status;
5854}
5855
5856static int
5857load_setitem(UnpicklerObject *self)
5858{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005859 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005860}
5861
5862static int
5863load_setitems(UnpicklerObject *self)
5864{
5865 return do_setitems(self, marker(self));
5866}
5867
5868static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005869load_additems(UnpicklerObject *self)
5870{
5871 PyObject *set;
5872 Py_ssize_t mark, len, i;
5873
5874 mark = marker(self);
5875 len = Py_SIZE(self->stack);
5876 if (mark > len || mark <= 0)
5877 return stack_underflow();
5878 if (len == mark) /* nothing to do */
5879 return 0;
5880
5881 set = self->stack->data[mark - 1];
5882
5883 if (PySet_Check(set)) {
5884 PyObject *items;
5885 int status;
5886
5887 items = Pdata_poptuple(self->stack, mark);
5888 if (items == NULL)
5889 return -1;
5890
5891 status = _PySet_Update(set, items);
5892 Py_DECREF(items);
5893 return status;
5894 }
5895 else {
5896 PyObject *add_func;
5897 _Py_IDENTIFIER(add);
5898
5899 add_func = _PyObject_GetAttrId(set, &PyId_add);
5900 if (add_func == NULL)
5901 return -1;
5902 for (i = mark; i < len; i++) {
5903 PyObject *result;
5904 PyObject *item;
5905
5906 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005907 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005908 if (result == NULL) {
5909 Pdata_clear(self->stack, i + 1);
5910 Py_SIZE(self->stack) = mark;
5911 return -1;
5912 }
5913 Py_DECREF(result);
5914 }
5915 Py_SIZE(self->stack) = mark;
5916 }
5917
5918 return 0;
5919}
5920
5921static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005922load_build(UnpicklerObject *self)
5923{
5924 PyObject *state, *inst, *slotstate;
5925 PyObject *setstate;
5926 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005927 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005928
5929 /* Stack is ... instance, state. We want to leave instance at
5930 * the stack top, possibly mutated via instance.__setstate__(state).
5931 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005932 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005933 return stack_underflow();
5934
5935 PDATA_POP(self->stack, state);
5936 if (state == NULL)
5937 return -1;
5938
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005939 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005940
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005941 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005942 if (setstate == NULL) {
5943 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5944 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005945 else {
5946 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005947 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005948 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005949 }
5950 else {
5951 PyObject *result;
5952
5953 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005954 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005955 Py_DECREF(setstate);
5956 if (result == NULL)
5957 return -1;
5958 Py_DECREF(result);
5959 return 0;
5960 }
5961
5962 /* A default __setstate__. First see whether state embeds a
5963 * slot state dict too (a proto 2 addition).
5964 */
5965 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5966 PyObject *tmp = state;
5967
5968 state = PyTuple_GET_ITEM(tmp, 0);
5969 slotstate = PyTuple_GET_ITEM(tmp, 1);
5970 Py_INCREF(state);
5971 Py_INCREF(slotstate);
5972 Py_DECREF(tmp);
5973 }
5974 else
5975 slotstate = NULL;
5976
5977 /* Set inst.__dict__ from the state dict (if any). */
5978 if (state != Py_None) {
5979 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005980 PyObject *d_key, *d_value;
5981 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005982 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005983
5984 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005985 PickleState *st = _Pickle_GetGlobalState();
5986 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005987 goto error;
5988 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005989 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005990 if (dict == NULL)
5991 goto error;
5992
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005993 i = 0;
5994 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5995 /* normally the keys for instance attributes are
5996 interned. we should try to do that here. */
5997 Py_INCREF(d_key);
5998 if (PyUnicode_CheckExact(d_key))
5999 PyUnicode_InternInPlace(&d_key);
6000 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6001 Py_DECREF(d_key);
6002 goto error;
6003 }
6004 Py_DECREF(d_key);
6005 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006006 Py_DECREF(dict);
6007 }
6008
6009 /* Also set instance attributes from the slotstate dict (if any). */
6010 if (slotstate != NULL) {
6011 PyObject *d_key, *d_value;
6012 Py_ssize_t i;
6013
6014 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006015 PickleState *st = _Pickle_GetGlobalState();
6016 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006017 "slot state is not a dictionary");
6018 goto error;
6019 }
6020 i = 0;
6021 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6022 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6023 goto error;
6024 }
6025 }
6026
6027 if (0) {
6028 error:
6029 status = -1;
6030 }
6031
6032 Py_DECREF(state);
6033 Py_XDECREF(slotstate);
6034 return status;
6035}
6036
6037static int
6038load_mark(UnpicklerObject *self)
6039{
6040
6041 /* Note that we split the (pickle.py) stack into two stacks, an
6042 * object stack and a mark stack. Here we push a mark onto the
6043 * mark stack.
6044 */
6045
6046 if ((self->num_marks + 1) >= self->marks_size) {
6047 size_t alloc;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006048
6049 /* Use the size_t type to check for overflow. */
6050 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006051 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006052 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006053 PyErr_NoMemory();
6054 return -1;
6055 }
6056
6057 if (self->marks == NULL)
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006058 self->marks = PyMem_NEW(Py_ssize_t, alloc);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006059 else
Benjamin Peterson59b08c12015-06-27 13:41:33 -05006060 PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
6061 if (self->marks == NULL) {
6062 self->marks_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006063 PyErr_NoMemory();
6064 return -1;
6065 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006066 self->marks_size = (Py_ssize_t)alloc;
6067 }
6068
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006069 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006070
6071 return 0;
6072}
6073
6074static int
6075load_reduce(UnpicklerObject *self)
6076{
6077 PyObject *callable = NULL;
6078 PyObject *argtup = NULL;
6079 PyObject *obj = NULL;
6080
6081 PDATA_POP(self->stack, argtup);
6082 if (argtup == NULL)
6083 return -1;
6084 PDATA_POP(self->stack, callable);
6085 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006086 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006087 Py_DECREF(callable);
6088 }
6089 Py_DECREF(argtup);
6090
6091 if (obj == NULL)
6092 return -1;
6093
6094 PDATA_PUSH(self->stack, obj, -1);
6095 return 0;
6096}
6097
6098/* Just raises an error if we don't know the protocol specified. PROTO
6099 * is the first opcode for protocols >= 2.
6100 */
6101static int
6102load_proto(UnpicklerObject *self)
6103{
6104 char *s;
6105 int i;
6106
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006107 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006108 return -1;
6109
6110 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006111 if (i <= HIGHEST_PROTOCOL) {
6112 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006113 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006114 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006115
6116 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6117 return -1;
6118}
6119
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006120static int
6121load_frame(UnpicklerObject *self)
6122{
6123 char *s;
6124 Py_ssize_t frame_len;
6125
6126 if (_Unpickler_Read(self, &s, 8) < 0)
6127 return -1;
6128
6129 frame_len = calc_binsize(s, 8);
6130 if (frame_len < 0) {
6131 PyErr_Format(PyExc_OverflowError,
6132 "FRAME length exceeds system's maximum of %zd bytes",
6133 PY_SSIZE_T_MAX);
6134 return -1;
6135 }
6136
6137 if (_Unpickler_Read(self, &s, frame_len) < 0)
6138 return -1;
6139
6140 /* Rewind to start of frame */
6141 self->next_read_idx -= frame_len;
6142 return 0;
6143}
6144
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006145static PyObject *
6146load(UnpicklerObject *self)
6147{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006148 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006149 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006150
6151 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006152 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006153 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006154 Pdata_clear(self->stack, 0);
6155
6156 /* Convenient macros for the dispatch while-switch loop just below. */
6157#define OP(opcode, load_func) \
6158 case opcode: if (load_func(self) < 0) break; continue;
6159
6160#define OP_ARG(opcode, load_func, arg) \
6161 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6162
6163 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006164 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006165 break;
6166
6167 switch ((enum opcode)s[0]) {
6168 OP(NONE, load_none)
6169 OP(BININT, load_binint)
6170 OP(BININT1, load_binint1)
6171 OP(BININT2, load_binint2)
6172 OP(INT, load_int)
6173 OP(LONG, load_long)
6174 OP_ARG(LONG1, load_counted_long, 1)
6175 OP_ARG(LONG4, load_counted_long, 4)
6176 OP(FLOAT, load_float)
6177 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006178 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6179 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6180 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6181 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6182 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006183 OP(STRING, load_string)
6184 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006185 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6186 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6187 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006188 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6189 OP_ARG(TUPLE1, load_counted_tuple, 1)
6190 OP_ARG(TUPLE2, load_counted_tuple, 2)
6191 OP_ARG(TUPLE3, load_counted_tuple, 3)
6192 OP(TUPLE, load_tuple)
6193 OP(EMPTY_LIST, load_empty_list)
6194 OP(LIST, load_list)
6195 OP(EMPTY_DICT, load_empty_dict)
6196 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006197 OP(EMPTY_SET, load_empty_set)
6198 OP(ADDITEMS, load_additems)
6199 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006200 OP(OBJ, load_obj)
6201 OP(INST, load_inst)
6202 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006203 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006204 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006205 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006206 OP(APPEND, load_append)
6207 OP(APPENDS, load_appends)
6208 OP(BUILD, load_build)
6209 OP(DUP, load_dup)
6210 OP(BINGET, load_binget)
6211 OP(LONG_BINGET, load_long_binget)
6212 OP(GET, load_get)
6213 OP(MARK, load_mark)
6214 OP(BINPUT, load_binput)
6215 OP(LONG_BINPUT, load_long_binput)
6216 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006217 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006218 OP(POP, load_pop)
6219 OP(POP_MARK, load_pop_mark)
6220 OP(SETITEM, load_setitem)
6221 OP(SETITEMS, load_setitems)
6222 OP(PERSID, load_persid)
6223 OP(BINPERSID, load_binpersid)
6224 OP(REDUCE, load_reduce)
6225 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006226 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006227 OP_ARG(EXT1, load_extension, 1)
6228 OP_ARG(EXT2, load_extension, 2)
6229 OP_ARG(EXT4, load_extension, 4)
6230 OP_ARG(NEWTRUE, load_bool, Py_True)
6231 OP_ARG(NEWFALSE, load_bool, Py_False)
6232
6233 case STOP:
6234 break;
6235
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006236 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006237 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006238 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006239 }
6240 else {
6241 PickleState *st = _Pickle_GetGlobalState();
6242 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006243 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006244 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006245 return NULL;
6246 }
6247
6248 break; /* and we are done! */
6249 }
6250
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006251 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006252 return NULL;
6253 }
6254
Victor Stinner2ae57e32013-10-31 13:39:23 +01006255 if (_Unpickler_SkipConsumed(self) < 0)
6256 return NULL;
6257
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006258 PDATA_POP(self->stack, value);
6259 return value;
6260}
6261
Larry Hastings61272b72014-01-07 12:41:53 -08006262/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006263
6264_pickle.Unpickler.load
6265
6266Load a pickle.
6267
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006268Read a pickled object representation from the open file object given
6269in the constructor, and return the reconstituted object hierarchy
6270specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006271[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006272
Larry Hastings3cceb382014-01-04 11:09:09 -08006273static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006274_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006275/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006276{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006277 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006278
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006279 /* Check whether the Unpickler was initialized correctly. This prevents
6280 segfaulting if a subclass overridden __init__ with a function that does
6281 not call Unpickler.__init__(). Here, we simply ensure that self->read
6282 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006283 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006284 PickleState *st = _Pickle_GetGlobalState();
6285 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006286 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006287 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006288 return NULL;
6289 }
6290
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006291 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006292}
6293
6294/* The name of find_class() is misleading. In newer pickle protocols, this
6295 function is used for loading any global (i.e., functions), not just
6296 classes. The name is kept only for backward compatibility. */
6297
Larry Hastings61272b72014-01-07 12:41:53 -08006298/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006299
6300_pickle.Unpickler.find_class
6301
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006302 module_name: object
6303 global_name: object
6304 /
6305
6306Return an object from a specified module.
6307
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006308If necessary, the module will be imported. Subclasses may override
6309this method (e.g. to restrict unpickling of arbitrary classes and
6310functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006311
6312This method is called whenever a class or a function object is
6313needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006314[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006315
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006316static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006317_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
6318 PyObject *module_name,
6319 PyObject *global_name)
6320/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006321{
6322 PyObject *global;
6323 PyObject *modules_dict;
6324 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006325 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006326
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006327 /* Try to map the old names used in Python 2.x to the new ones used in
6328 Python 3.x. We do this only with old pickle protocols and when the
6329 user has not disabled the feature. */
6330 if (self->proto < 3 && self->fix_imports) {
6331 PyObject *key;
6332 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006333 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006334
6335 /* Check if the global (i.e., a function or a class) was renamed
6336 or moved to another module. */
6337 key = PyTuple_Pack(2, module_name, global_name);
6338 if (key == NULL)
6339 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006340 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006341 Py_DECREF(key);
6342 if (item) {
6343 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6344 PyErr_Format(PyExc_RuntimeError,
6345 "_compat_pickle.NAME_MAPPING values should be "
6346 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6347 return NULL;
6348 }
6349 module_name = PyTuple_GET_ITEM(item, 0);
6350 global_name = PyTuple_GET_ITEM(item, 1);
6351 if (!PyUnicode_Check(module_name) ||
6352 !PyUnicode_Check(global_name)) {
6353 PyErr_Format(PyExc_RuntimeError,
6354 "_compat_pickle.NAME_MAPPING values should be "
6355 "pairs of str, not (%.200s, %.200s)",
6356 Py_TYPE(module_name)->tp_name,
6357 Py_TYPE(global_name)->tp_name);
6358 return NULL;
6359 }
6360 }
6361 else if (PyErr_Occurred()) {
6362 return NULL;
6363 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03006364 else {
6365 /* Check if the module was renamed. */
6366 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
6367 if (item) {
6368 if (!PyUnicode_Check(item)) {
6369 PyErr_Format(PyExc_RuntimeError,
6370 "_compat_pickle.IMPORT_MAPPING values should be "
6371 "strings, not %.200s", Py_TYPE(item)->tp_name);
6372 return NULL;
6373 }
6374 module_name = item;
6375 }
6376 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006377 return NULL;
6378 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006379 }
6380 }
6381
Victor Stinnerbb520202013-11-06 22:40:41 +01006382 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006383 if (modules_dict == NULL) {
6384 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006385 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006386 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006387
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006388 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006389 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006390 if (PyErr_Occurred())
6391 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006392 module = PyImport_Import(module_name);
6393 if (module == NULL)
6394 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006395 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006396 Py_DECREF(module);
6397 }
Victor Stinner121aab42011-09-29 23:40:53 +02006398 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006399 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006400 }
6401 return global;
6402}
6403
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006404/*[clinic input]
6405
6406_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6407
6408Returns size in memory, in bytes.
6409[clinic start generated code]*/
6410
6411static Py_ssize_t
6412_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6413/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6414{
6415 Py_ssize_t res;
6416
6417 res = sizeof(UnpicklerObject);
6418 if (self->memo != NULL)
6419 res += self->memo_size * sizeof(PyObject *);
6420 if (self->marks != NULL)
6421 res += self->marks_size * sizeof(Py_ssize_t);
6422 if (self->input_line != NULL)
6423 res += strlen(self->input_line) + 1;
6424 if (self->encoding != NULL)
6425 res += strlen(self->encoding) + 1;
6426 if (self->errors != NULL)
6427 res += strlen(self->errors) + 1;
6428 return res;
6429}
6430
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006431static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006432 _PICKLE_UNPICKLER_LOAD_METHODDEF
6433 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006434 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006435 {NULL, NULL} /* sentinel */
6436};
6437
6438static void
6439Unpickler_dealloc(UnpicklerObject *self)
6440{
6441 PyObject_GC_UnTrack((PyObject *)self);
6442 Py_XDECREF(self->readline);
6443 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006444 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006445 Py_XDECREF(self->stack);
6446 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006447 if (self->buffer.buf != NULL) {
6448 PyBuffer_Release(&self->buffer);
6449 self->buffer.buf = NULL;
6450 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006451
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006452 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006453 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006454 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006455 PyMem_Free(self->encoding);
6456 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006457
6458 Py_TYPE(self)->tp_free((PyObject *)self);
6459}
6460
6461static int
6462Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6463{
6464 Py_VISIT(self->readline);
6465 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006466 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006467 Py_VISIT(self->stack);
6468 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006469 return 0;
6470}
6471
6472static int
6473Unpickler_clear(UnpicklerObject *self)
6474{
6475 Py_CLEAR(self->readline);
6476 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006477 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006478 Py_CLEAR(self->stack);
6479 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006480 if (self->buffer.buf != NULL) {
6481 PyBuffer_Release(&self->buffer);
6482 self->buffer.buf = NULL;
6483 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006484
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006485 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006486 PyMem_Free(self->marks);
6487 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006488 PyMem_Free(self->input_line);
6489 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006490 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006491 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006492 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006493 self->errors = NULL;
6494
6495 return 0;
6496}
6497
Larry Hastings61272b72014-01-07 12:41:53 -08006498/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006499
6500_pickle.Unpickler.__init__
6501
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006502 file: object
6503 *
6504 fix_imports: bool = True
6505 encoding: str = 'ASCII'
6506 errors: str = 'strict'
6507
6508This takes a binary file for reading a pickle data stream.
6509
6510The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006511protocol argument is needed. Bytes past the pickled object's
6512representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006513
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006514The argument *file* must have two methods, a read() method that takes
6515an integer argument, and a readline() method that requires no
6516arguments. Both methods should return bytes. Thus *file* can be a
6517binary file object opened for reading, a io.BytesIO object, or any
6518other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006519
6520Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6521which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006522generated by Python 2. If *fix_imports* is True, pickle will try to
6523map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006524*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006525instances pickled by Python 2; these default to 'ASCII' and 'strict',
6526respectively. The *encoding* can be 'bytes' to read these 8-bit
6527string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006528[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006529
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006530static int
Larry Hastings89964c42015-04-14 18:07:59 -04006531_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6532 int fix_imports, const char *encoding,
6533 const char *errors)
6534/*[clinic end generated code: output=e2c8ce748edc57b0 input=30b4dc9e976b890c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006535{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006536 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006537
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006538 /* In case of multiple __init__() calls, clear previous content. */
6539 if (self->read != NULL)
6540 (void)Unpickler_clear(self);
6541
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006542 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006543 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006544
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006545 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006546 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006547
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006548 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006549 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006550 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006551
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006552 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006553 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6554 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006555 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006556 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006557 }
6558 else {
6559 self->pers_func = NULL;
6560 }
6561
6562 self->stack = (Pdata *)Pdata_New();
6563 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006564 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006565
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006566 self->memo_size = 32;
6567 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006568 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006569 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006570
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006571 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006572
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006573 return 0;
6574}
6575
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006576
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006577/* Define a proxy object for the Unpickler's internal memo object. This is to
6578 * avoid breaking code like:
6579 * unpickler.memo.clear()
6580 * and
6581 * unpickler.memo = saved_memo
6582 * Is this a good idea? Not really, but we don't want to break code that uses
6583 * it. Note that we don't implement the entire mapping API here. This is
6584 * intentional, as these should be treated as black-box implementation details.
6585 *
6586 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006587 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006588 */
6589
Larry Hastings61272b72014-01-07 12:41:53 -08006590/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006591_pickle.UnpicklerMemoProxy.clear
6592
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006593Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006594[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006595
Larry Hastings3cceb382014-01-04 11:09:09 -08006596static PyObject *
6597_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006598/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006599{
6600 _Unpickler_MemoCleanup(self->unpickler);
6601 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6602 if (self->unpickler->memo == NULL)
6603 return NULL;
6604 Py_RETURN_NONE;
6605}
6606
Larry Hastings61272b72014-01-07 12:41:53 -08006607/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006608_pickle.UnpicklerMemoProxy.copy
6609
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006610Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006611[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006612
Larry Hastings3cceb382014-01-04 11:09:09 -08006613static PyObject *
6614_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006615/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006616{
6617 Py_ssize_t i;
6618 PyObject *new_memo = PyDict_New();
6619 if (new_memo == NULL)
6620 return NULL;
6621
6622 for (i = 0; i < self->unpickler->memo_size; i++) {
6623 int status;
6624 PyObject *key, *value;
6625
6626 value = self->unpickler->memo[i];
6627 if (value == NULL)
6628 continue;
6629
6630 key = PyLong_FromSsize_t(i);
6631 if (key == NULL)
6632 goto error;
6633 status = PyDict_SetItem(new_memo, key, value);
6634 Py_DECREF(key);
6635 if (status < 0)
6636 goto error;
6637 }
6638 return new_memo;
6639
6640error:
6641 Py_DECREF(new_memo);
6642 return NULL;
6643}
6644
Larry Hastings61272b72014-01-07 12:41:53 -08006645/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006646_pickle.UnpicklerMemoProxy.__reduce__
6647
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006648Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006649[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006650
Larry Hastings3cceb382014-01-04 11:09:09 -08006651static PyObject *
6652_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006653/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006654{
6655 PyObject *reduce_value;
6656 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006657 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006658 if (contents == NULL)
6659 return NULL;
6660
6661 reduce_value = PyTuple_New(2);
6662 if (reduce_value == NULL) {
6663 Py_DECREF(contents);
6664 return NULL;
6665 }
6666 constructor_args = PyTuple_New(1);
6667 if (constructor_args == NULL) {
6668 Py_DECREF(contents);
6669 Py_DECREF(reduce_value);
6670 return NULL;
6671 }
6672 PyTuple_SET_ITEM(constructor_args, 0, contents);
6673 Py_INCREF((PyObject *)&PyDict_Type);
6674 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6675 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6676 return reduce_value;
6677}
6678
6679static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006680 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6681 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6682 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006683 {NULL, NULL} /* sentinel */
6684};
6685
6686static void
6687UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6688{
6689 PyObject_GC_UnTrack(self);
6690 Py_XDECREF(self->unpickler);
6691 PyObject_GC_Del((PyObject *)self);
6692}
6693
6694static int
6695UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6696 visitproc visit, void *arg)
6697{
6698 Py_VISIT(self->unpickler);
6699 return 0;
6700}
6701
6702static int
6703UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6704{
6705 Py_CLEAR(self->unpickler);
6706 return 0;
6707}
6708
6709static PyTypeObject UnpicklerMemoProxyType = {
6710 PyVarObject_HEAD_INIT(NULL, 0)
6711 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6712 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6713 0,
6714 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6715 0, /* tp_print */
6716 0, /* tp_getattr */
6717 0, /* tp_setattr */
6718 0, /* tp_compare */
6719 0, /* tp_repr */
6720 0, /* tp_as_number */
6721 0, /* tp_as_sequence */
6722 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006723 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006724 0, /* tp_call */
6725 0, /* tp_str */
6726 PyObject_GenericGetAttr, /* tp_getattro */
6727 PyObject_GenericSetAttr, /* tp_setattro */
6728 0, /* tp_as_buffer */
6729 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6730 0, /* tp_doc */
6731 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6732 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6733 0, /* tp_richcompare */
6734 0, /* tp_weaklistoffset */
6735 0, /* tp_iter */
6736 0, /* tp_iternext */
6737 unpicklerproxy_methods, /* tp_methods */
6738};
6739
6740static PyObject *
6741UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6742{
6743 UnpicklerMemoProxyObject *self;
6744
6745 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6746 &UnpicklerMemoProxyType);
6747 if (self == NULL)
6748 return NULL;
6749 Py_INCREF(unpickler);
6750 self->unpickler = unpickler;
6751 PyObject_GC_Track(self);
6752 return (PyObject *)self;
6753}
6754
6755/*****************************************************************************/
6756
6757
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006758static PyObject *
6759Unpickler_get_memo(UnpicklerObject *self)
6760{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006761 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006762}
6763
6764static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006765Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006766{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006767 PyObject **new_memo;
6768 Py_ssize_t new_memo_size = 0;
6769 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006770
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006771 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006772 PyErr_SetString(PyExc_TypeError,
6773 "attribute deletion is not supported");
6774 return -1;
6775 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006776
6777 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6778 UnpicklerObject *unpickler =
6779 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6780
6781 new_memo_size = unpickler->memo_size;
6782 new_memo = _Unpickler_NewMemo(new_memo_size);
6783 if (new_memo == NULL)
6784 return -1;
6785
6786 for (i = 0; i < new_memo_size; i++) {
6787 Py_XINCREF(unpickler->memo[i]);
6788 new_memo[i] = unpickler->memo[i];
6789 }
6790 }
6791 else if (PyDict_Check(obj)) {
6792 Py_ssize_t i = 0;
6793 PyObject *key, *value;
6794
6795 new_memo_size = PyDict_Size(obj);
6796 new_memo = _Unpickler_NewMemo(new_memo_size);
6797 if (new_memo == NULL)
6798 return -1;
6799
6800 while (PyDict_Next(obj, &i, &key, &value)) {
6801 Py_ssize_t idx;
6802 if (!PyLong_Check(key)) {
6803 PyErr_SetString(PyExc_TypeError,
6804 "memo key must be integers");
6805 goto error;
6806 }
6807 idx = PyLong_AsSsize_t(key);
6808 if (idx == -1 && PyErr_Occurred())
6809 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006810 if (idx < 0) {
6811 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006812 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006813 goto error;
6814 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006815 if (_Unpickler_MemoPut(self, idx, value) < 0)
6816 goto error;
6817 }
6818 }
6819 else {
6820 PyErr_Format(PyExc_TypeError,
6821 "'memo' attribute must be an UnpicklerMemoProxy object"
6822 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006823 return -1;
6824 }
6825
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006826 _Unpickler_MemoCleanup(self);
6827 self->memo_size = new_memo_size;
6828 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006829
6830 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006831
6832 error:
6833 if (new_memo_size) {
6834 i = new_memo_size;
6835 while (--i >= 0) {
6836 Py_XDECREF(new_memo[i]);
6837 }
6838 PyMem_FREE(new_memo);
6839 }
6840 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006841}
6842
6843static PyObject *
6844Unpickler_get_persload(UnpicklerObject *self)
6845{
6846 if (self->pers_func == NULL)
6847 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6848 else
6849 Py_INCREF(self->pers_func);
6850 return self->pers_func;
6851}
6852
6853static int
6854Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6855{
6856 PyObject *tmp;
6857
6858 if (value == NULL) {
6859 PyErr_SetString(PyExc_TypeError,
6860 "attribute deletion is not supported");
6861 return -1;
6862 }
6863 if (!PyCallable_Check(value)) {
6864 PyErr_SetString(PyExc_TypeError,
6865 "persistent_load must be a callable taking "
6866 "one argument");
6867 return -1;
6868 }
6869
6870 tmp = self->pers_func;
6871 Py_INCREF(value);
6872 self->pers_func = value;
6873 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6874
6875 return 0;
6876}
6877
6878static PyGetSetDef Unpickler_getsets[] = {
6879 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6880 {"persistent_load", (getter)Unpickler_get_persload,
6881 (setter)Unpickler_set_persload},
6882 {NULL}
6883};
6884
6885static PyTypeObject Unpickler_Type = {
6886 PyVarObject_HEAD_INIT(NULL, 0)
6887 "_pickle.Unpickler", /*tp_name*/
6888 sizeof(UnpicklerObject), /*tp_basicsize*/
6889 0, /*tp_itemsize*/
6890 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6891 0, /*tp_print*/
6892 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006893 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006894 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006895 0, /*tp_repr*/
6896 0, /*tp_as_number*/
6897 0, /*tp_as_sequence*/
6898 0, /*tp_as_mapping*/
6899 0, /*tp_hash*/
6900 0, /*tp_call*/
6901 0, /*tp_str*/
6902 0, /*tp_getattro*/
6903 0, /*tp_setattro*/
6904 0, /*tp_as_buffer*/
6905 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006906 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006907 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6908 (inquiry)Unpickler_clear, /*tp_clear*/
6909 0, /*tp_richcompare*/
6910 0, /*tp_weaklistoffset*/
6911 0, /*tp_iter*/
6912 0, /*tp_iternext*/
6913 Unpickler_methods, /*tp_methods*/
6914 0, /*tp_members*/
6915 Unpickler_getsets, /*tp_getset*/
6916 0, /*tp_base*/
6917 0, /*tp_dict*/
6918 0, /*tp_descr_get*/
6919 0, /*tp_descr_set*/
6920 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006921 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006922 PyType_GenericAlloc, /*tp_alloc*/
6923 PyType_GenericNew, /*tp_new*/
6924 PyObject_GC_Del, /*tp_free*/
6925 0, /*tp_is_gc*/
6926};
6927
Larry Hastings61272b72014-01-07 12:41:53 -08006928/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006929
6930_pickle.dump
6931
6932 obj: object
6933 file: object
6934 protocol: object = NULL
6935 *
6936 fix_imports: bool = True
6937
6938Write a pickled representation of obj to the open file object file.
6939
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006940This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6941be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006942
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006943The optional *protocol* argument tells the pickler to use the given
6944protocol supported protocols are 0, 1, 2, 3 and 4. The default
6945protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006946
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006947Specifying a negative protocol version selects the highest protocol
6948version supported. The higher the protocol used, the more recent the
6949version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006950
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006951The *file* argument must have a write() method that accepts a single
6952bytes argument. It can thus be a file object opened for binary
6953writing, a io.BytesIO instance, or any other custom object that meets
6954this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006955
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006956If *fix_imports* is True and protocol is less than 3, pickle will try
6957to map the new Python 3 names to the old module names used in Python
69582, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006959[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006960
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006961static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04006962_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file,
6963 PyObject *protocol, int fix_imports)
6964/*[clinic end generated code: output=0de7dff89c406816 input=e9e5fdd48de92eae]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006965{
6966 PicklerObject *pickler = _Pickler_New();
6967
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006968 if (pickler == NULL)
6969 return NULL;
6970
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006971 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006972 goto error;
6973
6974 if (_Pickler_SetOutputStream(pickler, file) < 0)
6975 goto error;
6976
6977 if (dump(pickler, obj) < 0)
6978 goto error;
6979
6980 if (_Pickler_FlushToFile(pickler) < 0)
6981 goto error;
6982
6983 Py_DECREF(pickler);
6984 Py_RETURN_NONE;
6985
6986 error:
6987 Py_XDECREF(pickler);
6988 return NULL;
6989}
6990
Larry Hastings61272b72014-01-07 12:41:53 -08006991/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006992
6993_pickle.dumps
6994
6995 obj: object
6996 protocol: object = NULL
6997 *
6998 fix_imports: bool = True
6999
7000Return the pickled representation of the object as a bytes object.
7001
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007002The optional *protocol* argument tells the pickler to use the given
7003protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7004protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007005
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007006Specifying a negative protocol version selects the highest protocol
7007version supported. The higher the protocol used, the more recent the
7008version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007009
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007010If *fix_imports* is True and *protocol* is less than 3, pickle will
7011try to map the new Python 3 names to the old module names used in
7012Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08007013[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007014
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007015static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007016_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol,
7017 int fix_imports)
7018/*[clinic end generated code: output=daa380db56fe07b9 input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007019{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007020 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007021 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007022
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007023 if (pickler == NULL)
7024 return NULL;
7025
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007026 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007027 goto error;
7028
7029 if (dump(pickler, obj) < 0)
7030 goto error;
7031
7032 result = _Pickler_GetString(pickler);
7033 Py_DECREF(pickler);
7034 return result;
7035
7036 error:
7037 Py_XDECREF(pickler);
7038 return NULL;
7039}
7040
Larry Hastings61272b72014-01-07 12:41:53 -08007041/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007042
7043_pickle.load
7044
7045 file: object
7046 *
7047 fix_imports: bool = True
7048 encoding: str = 'ASCII'
7049 errors: str = 'strict'
7050
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007051Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007052
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007053This is equivalent to ``Unpickler(file).load()``, but may be more
7054efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007055
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007056The protocol version of the pickle is detected automatically, so no
7057protocol argument is needed. Bytes past the pickled object's
7058representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007059
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007060The argument *file* must have two methods, a read() method that takes
7061an integer argument, and a readline() method that requires no
7062arguments. Both methods should return bytes. Thus *file* can be a
7063binary file object opened for reading, a io.BytesIO object, or any
7064other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007065
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007066Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7067which are used to control compatiblity support for pickle stream
7068generated by Python 2. If *fix_imports* is True, pickle will try to
7069map the old Python 2 names to the new names used in Python 3. The
7070*encoding* and *errors* tell pickle how to decode 8-bit string
7071instances pickled by Python 2; these default to 'ASCII' and 'strict',
7072respectively. The *encoding* can be 'bytes' to read these 8-bit
7073string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007074[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007075
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007076static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007077_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports,
7078 const char *encoding, const char *errors)
7079/*[clinic end generated code: output=798f1c57cb2b4eb1 input=da97372e38e510a6]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007080{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007081 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007082 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007083
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007084 if (unpickler == NULL)
7085 return NULL;
7086
7087 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7088 goto error;
7089
7090 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7091 goto error;
7092
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007093 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007094
7095 result = load(unpickler);
7096 Py_DECREF(unpickler);
7097 return result;
7098
7099 error:
7100 Py_XDECREF(unpickler);
7101 return NULL;
7102}
7103
Larry Hastings61272b72014-01-07 12:41:53 -08007104/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007105
7106_pickle.loads
7107
7108 data: object
7109 *
7110 fix_imports: bool = True
7111 encoding: str = 'ASCII'
7112 errors: str = 'strict'
7113
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007114Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007115
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007116The protocol version of the pickle is detected automatically, so no
7117protocol argument is needed. Bytes past the pickled object's
7118representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007119
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007120Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7121which are used to control compatiblity support for pickle stream
7122generated by Python 2. If *fix_imports* is True, pickle will try to
7123map the old Python 2 names to the new names used in Python 3. The
7124*encoding* and *errors* tell pickle how to decode 8-bit string
7125instances pickled by Python 2; these default to 'ASCII' and 'strict',
7126respectively. The *encoding* can be 'bytes' to read these 8-bit
7127string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007128[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007129
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007130static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007131_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports,
7132 const char *encoding, const char *errors)
7133/*[clinic end generated code: output=61e9cdb01e36a736 input=f57f0fdaa2b4cb8b]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007134{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007135 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007136 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007137
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007138 if (unpickler == NULL)
7139 return NULL;
7140
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007141 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007142 goto error;
7143
7144 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7145 goto error;
7146
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007147 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007148
7149 result = load(unpickler);
7150 Py_DECREF(unpickler);
7151 return result;
7152
7153 error:
7154 Py_XDECREF(unpickler);
7155 return NULL;
7156}
7157
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007158static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007159 _PICKLE_DUMP_METHODDEF
7160 _PICKLE_DUMPS_METHODDEF
7161 _PICKLE_LOAD_METHODDEF
7162 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007163 {NULL, NULL} /* sentinel */
7164};
7165
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007166static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007167pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007168{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007169 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007170 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007171}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007172
Stefan Krahf483b0f2013-12-14 13:43:10 +01007173static void
7174pickle_free(PyObject *m)
7175{
7176 _Pickle_ClearState(_Pickle_GetState(m));
7177}
7178
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007179static int
7180pickle_traverse(PyObject *m, visitproc visit, void *arg)
7181{
7182 PickleState *st = _Pickle_GetState(m);
7183 Py_VISIT(st->PickleError);
7184 Py_VISIT(st->PicklingError);
7185 Py_VISIT(st->UnpicklingError);
7186 Py_VISIT(st->dispatch_table);
7187 Py_VISIT(st->extension_registry);
7188 Py_VISIT(st->extension_cache);
7189 Py_VISIT(st->inverted_registry);
7190 Py_VISIT(st->name_mapping_2to3);
7191 Py_VISIT(st->import_mapping_2to3);
7192 Py_VISIT(st->name_mapping_3to2);
7193 Py_VISIT(st->import_mapping_3to2);
7194 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007195 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007196 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007197}
7198
7199static struct PyModuleDef _picklemodule = {
7200 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007201 "_pickle", /* m_name */
7202 pickle_module_doc, /* m_doc */
7203 sizeof(PickleState), /* m_size */
7204 pickle_methods, /* m_methods */
7205 NULL, /* m_reload */
7206 pickle_traverse, /* m_traverse */
7207 pickle_clear, /* m_clear */
7208 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007209};
7210
7211PyMODINIT_FUNC
7212PyInit__pickle(void)
7213{
7214 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007215 PickleState *st;
7216
7217 m = PyState_FindModule(&_picklemodule);
7218 if (m) {
7219 Py_INCREF(m);
7220 return m;
7221 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007222
7223 if (PyType_Ready(&Unpickler_Type) < 0)
7224 return NULL;
7225 if (PyType_Ready(&Pickler_Type) < 0)
7226 return NULL;
7227 if (PyType_Ready(&Pdata_Type) < 0)
7228 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007229 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7230 return NULL;
7231 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7232 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007233
7234 /* Create the module and add the functions. */
7235 m = PyModule_Create(&_picklemodule);
7236 if (m == NULL)
7237 return NULL;
7238
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007239 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007240 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7241 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007242 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007243 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7244 return NULL;
7245
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007246 st = _Pickle_GetState(m);
7247
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007248 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007249 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7250 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007251 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007252 st->PicklingError = \
7253 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7254 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007255 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007256 st->UnpicklingError = \
7257 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7258 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007259 return NULL;
7260
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007261 Py_INCREF(st->PickleError);
7262 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007263 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007264 Py_INCREF(st->PicklingError);
7265 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007266 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007267 Py_INCREF(st->UnpicklingError);
7268 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007269 return NULL;
7270
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007271 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007272 return NULL;
7273
7274 return m;
7275}